Почему адрес _text в Linux ARM64 boot такой высокий?

#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 к другому (который я даже не буду утверждать, что полностью понимаю).