mmu в руке: как сопоставить код ядра (голое железо)

В скрипте ссылки начальный адрес — 0xffffffff00000000. Затем я могу загрузить собственное ядро ​​​​с нуля (для aarch64) по произвольному (физическому) адресу и использовать относительную адресацию. Итак, когда я включаю MMU, как я узнаю, что память не будет записываться туда, где загружено ядро? Я имею в виду, что если я загрузил ядро ​​​​по адресу 0x01000000 и сопоставил физическую память с 0xffffffff00000000 на 0xffffffffffffffffff, мне кажется, что у меня все еще будут проблемы, если я совмещаю относительную адресацию с абсолютной. И кажется, что единственное решение — обеспечить загрузку ядра всегда по одному и тому же физическому адресу, а затем сопоставить его с 0xffffffff00000000... Но каким-то образом это превосходит цель MMU. Я прав в своих размышлениях?


person samuzu.pazael    schedule 04.12.2020    source источник
comment
how do I know memory won't be written at where kernel is loaded? - потому что вы операционная система и вы не позволяете туда писать?   -  person Siguza    schedule 05.12.2020
comment
После спокойной ночи размышлений об этом, я думаю, мне нужна некоторая логика загрузчика, которая всегда будет загружаться по одному и тому же физическому адресу.   -  person samuzu.pazael    schedule 05.12.2020
comment
Если вы говорите об абсолютных адресах, которые выписал компоновщик, то да, вам нужно применить слайд ко всем из них при загрузке, прежде чем запускать код, который может зависеть от таких жестко запрограммированных адресов.   -  person Siguza    schedule 05.12.2020
comment
А, кажется, я действительно кое-что понял. На aarch64, используя adr x0, some_label, я получаю его физический адрес в x0... А для ldr x0, some_label я получаю относительный начальный адрес от компоновщика. Я имею в виду, что я только что протестировал его, и он действительно работает, моя проблема заключалась в том, что я думал, что адрес также возвращается относительно начального адреса.   -  person samuzu.pazael    schedule 06.12.2020
comment
Я предполагаю, что мне нужна некоторая логика загрузчика, которая всегда будет загружаться по одному и тому же физическому адресу. Процессор загружается по известному жестко запрограммированному адресу, и ваш исходный код должен соответствовать этому, независимо от позиции или нет, на ваш выбор. Но да, конечно, загрузчик по тому же физическому адресу — это именно то, как это работает.   -  person old_timer    schedule 06.12.2020


Ответы (1)


На самом деле осознание того, что инструкция ADR на Aarch64 возвращает физический адрес, помогло мне добиться того, чего я хотел. Я надеюсь, что я прав в своих мыслях, хотя:

ADR x0, label  # here we get physical address of label to x0
LDR x0, =label # here we get start address from linker + label address to x0

Так что мне действительно не нужно знать физический адрес (по которому было загружено ядро) во время компиляции, чтобы установить границу вокруг ядра, чтобы правильно настроить MMU.

person samuzu.pazael    schedule 05.12.2020