我正在尝试为U-Boot运行一个独立的应用程序。
Target是乐高EV3砖 - 它有一个TI OMAP(ARM9)CPU。
悬挂前U-Boot的输出是:
U-Boot > fatload mmc 0:1 c0007FC0 uimage
reading uimage
384 bytes read
U-Boot > bootm
## Booting kernel from Legacy Image at c0007fc0 ...
Image Name: ITK EV3 sample OS
Image Type: ARM Linux Standalone Program (uncompressed)
Data Size: 320 Bytes = 0.3 kB
Load Address: c0008000
Entry Point: c0008000
Loading Standalone Program ... OK
OK
我尝试将以下命令放在“uimage”中的地址0xC0008000处:
mov pc, lr (ARM code)
bx lr (ARM code)
bx lr (Thumb code)
这些命令应该简单地返回(取决于ARM或Thumb模式是否处于活动状态)。但是,所有三个命令都会导致U-Boot挂起,因此在最后一次“OK”之后不再进行输出。
为什么U-Boot会挂起?
答案 0 :(得分:3)
我自己找到了答案:
在EV3砖上使用的u-boot版本中有一个错误:已经转换为little-endian的起始地址被转换为两次,因此结果是 - 当然 - 错误
通过在文件中存储数字小端,u-boot的输出将是错误的:
Image Type: ARM Linux Standalone Program (uncompressed)
Data Size: 320 Bytes = 0.3 kB
Load Address: c0008000
Entry Point: 008000c0 <--- actually 0xC0008000!!!
Loading Standalone Program ... OK
OK
U-Boot >
然而启动会起作用。此错误仅影响独立程序,而不影响Linux内核。
我的问题是该程序可能会被发布,所以它必须适用于bug和bug修复的u-boot版本。
因此我考虑将程序加载到
这样的地址0xC00101C0
以同样的方式存储小端和大端。