Использует ли armv7 u-boot MMU?
Мы используем пользовательскую доску Beaglebone черного цвета. Я отредактировал файл сценария компоновщика, чтобы добавить раздел памяти для записи туда некоторой информации:
. = ALIGN(4);
.logging :
{
_log_begin = .;
_log_end = . + 0x2000;
}
Я определил массив в файле C следующим образом:
char log_arr[0x2000] __attribute__ ((section(".logging")));
Теперь, если я печатаю log_arr
адрес, это выводит 0x8ffa2774
, но когда я проверяю u-boot.map
файл, я вижу log_arr
находится по адресу 0x8084b774
,
U-boot использует MMU? Насколько я знаю, он выключен в написанном на ассемблере коде запуска. Когда я пытаюсь использовать _log_begin
в коде, определив его как extern
, компиляция кода u-boot обрывается и выдает ошибку:
сделать 1: * [checkarmreloc] Ошибка 1
Когда я ищу эту ошибку, я получаю патч, который говорит: "Убедитесь, что u-boot использует только относительные перемещения". Что это значит?
1 ответ
U-boot использует MMU?
Нет.
Из файла README U-Boot 2014-07:
U-Boot runs in system state and uses physical addresses, i.e. the
MMU is not used either for address mapping nor for memory protection.
Разница в значениях адреса из карты компоновщика по сравнению со значением времени выполнения, вероятно, связана с перемещением U-Boot (больше в памяти, ближе к вершине).
Снова из файла README U-Boot 2014-07:
After booting and sizing and initializing DRAM, the code relocates itself
to the upper end of DRAM.
... который говорит "убедитесь, что u-boot использует только относительные перемещения". Что это значит?
Ваш код может попытаться использовать абсолютные (не перемещаемые) области памяти, или же позволить C выделить и переместить массив (т.е. удалить спецификатор раздела).