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