#linux-kernel #boot #arm64
#linux-ядро #загрузка #arm64
Вопрос:
В настоящее время я изучаю архитектуру ARM64, и мне трудно понять, как Linux может загружаться. Из сценария компоновщика мы видим, что:
SECTIONS {
. = PAGE_OFFSET TEXT_OFFSET;
.head.text : {
_text = .;
HEAD_TEXT
}
начальный _text
символ очень высокий, что-то вроде 0xfffffffc000080000
. Насколько мне известно, этот адрес является физическим адресом, но это кажется невозможным на плате с 8 ГБ оперативной памяти. Как это возможно? Я что-то упускаю?
РЕДАКТИРОВАТЬ: в документации Linux указано, что:
- Caches, MMUs
The MMU must be off.
Комментарии:
1. «Я что-то упускаю?» — да. Это не физический адрес (который был бы
PHYS_OFFSET
).2. Но Linux запрашивает загрузку с выключенным MMU, или, может быть, это уже не так?
3. Конечно, и крошечный фрагмент кода точки входа, который выполняется с выключенным MMU, не использует виртуальные адреса (напрямую). Это не влияет на тот факт, что vmlinux связан с запуском из конечного диапазона адресов линейной карты (в TTBR1), и, следовательно, предпосылка вопроса неверна.
4. Итак, вы говорите, что все ядро связано с высокими адресами, но код ранней загрузки не зависит от положения и поэтому не беспокоится о его реальном местоположении. Я правильно понял?
5. Это своего рода упрощение, но в значительной степени, да. К тому времени, когда вы дойдете до кода C, который вы запускаете с правильных виртуальных адресов, просто многое происходит с одного конца head. S к другому (который я даже не буду утверждать, что полностью понимаю).