как я могу перейти к более высокой половине ядра

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

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


person Edmond    schedule 19.04.2013    source источник
comment
Higher Half barebones   -  person Martijn van den Broek    schedule 19.04.2013
comment
Спасибо за Ваш ответ. :)   -  person Edmond    schedule 22.04.2013


Ответы (1)


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

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

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

person Keeley Hoek    schedule 05.08.2013