0

我正在尝试为 U-Boot 运行一个独立的应用程序。

Target 是一块 LEGO 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 会挂起?

4

1 回答 1

3

我自己找到了答案:

在 EV3 砖块上使用的 u-boot 版本中存在一个错误:已经转换为 little-endian 的起始地址被转换了两次,因此结果 - 当然 - 错误。

通过将数字 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 内核。

我的问题是该程序可能会被发布,因此它必须与错误和修复错误的 u-boot 版本一起使用。

因此,我考虑将程序加载到类似的地址

0xC00101C0

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

于 2014-01-23T09:31:53.090 回答