U-Boot:应用程序崩溃 - 但为什么

时间:2014-01-22 18:35:23

标签: u-boot lego

我正在尝试为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会挂起?

1 个答案:

答案 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

以同样的方式存储小端和大端。