Как лучше это сделать?

Не знаю как правильно сформулировать вопрос, поэтому опишу проблему. Есть ос, в скрипте линкера есть такая строка . = 0x100000;. Знаю, что grub загружает по этому адресу ядро, а линкер настраивает адресацию. Перед запуском main, ядро настраивает страничную память и мне нужно чтобы grub по прежнему загружал ядро по адрсесу 0x100000. А адресация внутри ядра происходила по виртуальному адресу, допустим 0x60000000. Как лучше это сделать?
  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
в скрипте линкера есть такая строка . = 0x100000;. Знаю, что grub загружает по этому адресу ядро

нужно чтобы grub по прежнему загружал ядро по адрсесу 0x100000. А адресация внутри ядра происходила по виртуальному адресу, допустим 0x60000000

Для начала нужно понять откуда grub берёт адрес для загрузки. Если из образа ядра, то я вижу один возможный вариант решения, если нет -- то два.
Универсальное решение -- разбить ядро на две части: выполняющуюся сразу после загрузки и до включения виртуальной адресации и выполняющуюся с виртуальной адресацией. Линковать их двумя отдельными командами с разными скриптами линковщика, образ второй части встраивать в первую через какой-нибудь .incbin. Так делает ядро linux. Отсюда можно проследить как это делается.
Не универсальное решение на случай, когда grub берёт адрес загрузки не из образа ядра, а часть кода работающая до переключения на виртуальную адресацию сравнительно проста -- сделать код этой части независимым от адреса загрузки, а образ ядра линковать для конечного виртуального адреса.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы