2015-07-30 3 views

ответ

7

(я предполагаю, что вы используете ARM на основе упоминания U-Boot и значение LOADADDR.)

Можете ли вы помочь понять, что использование этого?

LOADADDR указывает адрес, в котором изображение ядра будет расположено компоновщиком. (Это верно для нескольких архитектур (например, Blackfin), но не для ARM.

LOADADDR указует адрес, где образ ядра будет располагаться на U-Boot и хранится в заголовке U-Boot в mkimage. Обычно адрес загрузки (для размещения в памяти) также является начальным адресом (для выполнения). Обратите внимание: файл uImage обычно является только (самораспаковывающимся, сжатым) файлом zImage с оберткой U-Boot.

Могу ли я изменить LOADADDR,

Да, но в соответствии с (Vincent Sanders') Booting ARM Linux, что противоречило бы ARM конвенции:

  • Несмотря на возможность размещать zImage в любом месте в памяти, конвенции гласит, что он будет загружен в базу физической памяти плюс Смещение 0x8000 (32K). Это оставляет пространство для блока параметров , обычно размещенного со смещением 0x100, векторов исключения нулевой страницы и таблиц . Это соглашение очень распространено.

(uImage упоминается в вашем вопросе, вероятно, просто zImage с оберткой U-Boot, поэтому котировка не распространяется.)

есть ли ограничение на длину LOADADDR?

"длина"? Если вы используете 32-разрядный процессор, длина этого адреса будет 32 бита.


ADDENDUM

арка/рука/загрузки/Makefile использует только LOADADDR для построения uImage из zImage.

От (Russel короля) Booting ARM Linux ограничения на этой LOADADDR является:

ядра должен быть помещен в первой 128MiB оперативной памяти. Рекомендуется , чтобы он загружался выше 32MiB, чтобы избежать необходимости переместить перед декомпрессией, что ускорит процесс загрузки .

При загрузке ядра raw (non-zImage) ограничения становятся более жесткими. В этом случае ядро ​​должно быть загружено со смещением в систему равным в TEXT_OFFSET - PAGE_OFFSET.

Ожидаемые местоположения для дерева устройств или ATAG или initramfs могут добавить дополнительные ограничения для этого LOADADDR.

+0

Спасибо за ответ. Да, я использую плату на базе ARM. Я не получаю «LOADADDR указывает адрес, где изображение ядра будет размещено компоновщиком». Не могли бы вы помочь. Согласно моему пониманию, линкер свяжет все «.o» и создает vmlinux.o. Я думаю, что LOADADDR не будет выполнять какую-либо роль при построении uImage, кроме размещения того же значения (значение LOADDR) в заголовке uImage, пожалуйста, исправьте меня, если он будет поврежден. – user3693586

+0

Для ARM, да, вы правильно относитесь к компоновщику. – sawdust

+0

LOADADDR является виртуальным или физическим? Если мы обрабатываем 0x80008000 как физический адрес (поскольку MMU в данный момент не включается), то 0x80008000 укажет на физический адрес, который превышает 2 ГБ. Если у нас есть 2 ГБ оперативной памяти в нашем устройстве, то как это будет обрабатываться? – user3693586

Смежные вопросы