我们正在使用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
使用MMU进行u-boot吗?据我所知,它已在程序集编写的启动代码中关闭。当我尝试在代码中使用_log_begin
时将其定义为extern
,u-boot代码编译会中断并抛出错误:
make 1: * [checkarmreloc]错误1
当我搜索此错误时,我会得到一些patch,其中表示"确保u-boot仅使用相对重定位"。这是什么意思?
答案 0 :(得分:4)
使用MMU进行u-boot吗?
没有。
来自U-Boot 2014-07的README文件:
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重定位自身(内存越高,越靠近顶部)。 再次来自U-Boot 2014-07的README文件:
After booting and sizing and initializing DRAM, the code relocates itself
to the upper end of DRAM.
...表示"确保u-boot仅使用相对重定位"。这是什么意思?
您的代码可以尝试使用绝对(不可重定位)的内存位置,或者允许C分配和重定位数组(即删除节指定符)。