Использует ли 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 выделить и переместить массив (т.е. удалить спецификатор раздела).

Другие вопросы по тегам