2013-04-19 7 views
1

В настоящее время я создаю более высокое полуядро, мой загрузчик загружает ядро ​​по физическому адресу 0x100000 (1M), а идентификационное сопоставление установлено на 0-4MB. Вот вопрос: как я могу перейти на более высокий виртуальный адрес (например, 3 ГБ).Как я могу перейти к более высокой половине ядра

Я задал этот вопрос и нашел два способа: один из них заключается в том, чтобы использовать адресное пространство вокруг, а одно - устанавливать записи страниц для отображения 3GB ~ 3GB + 4MB в 0-4MB, а затем «перейти» к более высокому адресу. Я решил использовать второй способ, но не могу найти достаточную информацию для его реализации. Я разобрал свое ядро ​​и обнаружил, что все адреса являются абсолютными, поэтому я считаю, что одной инструкции «jmp» будет недостаточно. Единственный способ, о котором я могу думать, это то, что есть функция в виртуальном адресе выше 3 ГБ, и мы называем эту функцию в нижнем пространстве, тогда мы будем выступать в большом пространстве, и эта функция никогда не должна возвращаться. Если это так, как я могу это сделать?

+4

[Высшая половина голых костей] (http://wiki.osdev.org/Higher_Half_bare_bones) –

+0

Спасибо за ваш ответ. :) –

ответ

0

Мое ядро, K-OS, делает это.

В принципе, вам нужно написать сценарий компоновщика, чтобы сместить все ваше ядро ​​на желаемый адрес «Высшая половина» (см. this). Затем вам нужно добавить небольшой фрагмент ассемблера (см. this), который является точкой входа ядра.

Этот фрагмент должен использовать только относительные адреса и должен устанавливать таблицы страниц для более высокой половины (сопоставить все ядро ​​с тем, где вы сказали, что это будет в скрипте компоновщика). Наконец, этот фрагмент должен быть JMP для точки входа «Высшая половина», а затем вызвать код C.