Binary U-Boot如何运行独立的二进制程序?

Binary U-Boot如何运行独立的二进制程序?,binary,yocto,u-boot,instruction-set,Binary,Yocto,U Boot,Instruction Set,我编译了一个简单的二进制文件(hello.bin)并将其存储在存储卡上 我正在运行一个带有I.mx 6四处理器的NXP Sabre开发工具包。我已经启动了U-boot,正在尝试访问二进制文件并使其运行 hello.bin可用,因为以下命令有效: => fatload mmc 1:4 0x20005000 hello.bin reading hello.bin 按照我的理解,文件应该加载到内存中的地址0x2000000 所以我想测试二进制文件是否存在 => md 0x20005000

我编译了一个简单的二进制文件(hello.bin)并将其存储在存储卡上

我正在运行一个带有I.mx 6四处理器的NXP Sabre开发工具包。我已经启动了U-boot,正在尝试访问二进制文件并使其运行

hello.bin可用,因为以下命令有效:

=> fatload mmc 1:4 0x20005000 hello.bin
reading hello.bin
按照我的理解,文件应该加载到内存中的地址0x2000000

所以我想测试二进制文件是否存在

=> md 0x20005000
20005000: 464c457f 00010101 00000000 00000000    .ELF............
20005010: 00280002 00000001 00010315 00000034    ..(.........4...
20005020: 000028f4 05000400 00200034 00280009    .(......4. ...(.
20005030: 00240025 70000001 00000454 00010454    %.$....pT...T...
看起来不错,因为起始位与我复制到SD卡的文件相匹配

当我尝试启动二进制文件时,设备会报告未定义的指令:

=> go 0x20005000
## Starting application at 0x20005000 ...
undefined instruction
pc : [<20005158>]          lr : [<4ff71403>]
reloc pc : [<e7897158>]    lr : [<17803403>]
sp : 4f56dd50  ip : 00000000     fp : 00000002
r10: 4f56f938  r9 : 4f56deb0     r8 : 4ffc3c40
r7 : 4ff713d9  r6 : 00000002     r5 : 20005000  r4 : 4f56f93c
r3 : 20005000  r2 : 4f56f93c     r1 : 4f56f93c  r0 : 00000000
Flags: nzCv  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...
=>转到0x2000000
##正在0x2000000处启动应用程序。。。
未定义指令
pc:[]lr:[]
重新登录pc:[]lr:[]
sp:4f56dd50 ip:00000000 fp:00000002
r10:4f56f938 r9:4f56deb0 r8:4ffc3c40
r7:4ff713d9 r6:00000002 r5:20005000 r4:4f56f93c
r3:20005000 r2:4f56f93c r1:4f56f93c r0:00000000
标志:nzCv IRQs关闭FIQs关闭模式SVC_32
正在重置CPU。。。

感谢您的帮助

请在


go不需要ELF二进制文件的开始,而是输入例程的地址。如果要访问U-Boot例程,必须重新定位二进制文件。

请在

go不需要ELF二进制文件的开始,而是输入例程的地址。如果要访问U-Boot例程,必须重新定位二进制文件

我编译了一个简单的二进制文件(hello.bin)并将其存储在存储卡上

您忽略了许多重要的细节。
您是如何编译此程序的,例如什么工具链、什么makefile?
您是否将此程序与库链接

按照我的理解,文件应该加载到内存中的地址0x2000000

你是怎么理解的

通常,独立程序的加载地址取决于几个因素。
首先必须考虑(目标板上)可用内存的地址。
其次,除非独立程序是可重新定位的(在您的情况下不太可能),否则必须按照链接程序时定义的加载/启动地址加载程序。
程序的加载和启动地址可以从其映射文件(即链接器输出)中获得

当我尝试启动二进制文件时,设备会报告未定义的指令:

=> go 0x20005000
## Starting application at 0x20005000 ...
undefined instruction
pc : [<20005158>]          lr : [<4ff71403>]
reloc pc : [<e7897158>]    lr : [<17803403>]
sp : 4f56dd50  ip : 00000000     fp : 00000002
r10: 4f56f938  r9 : 4f56deb0     r8 : 4ffc3c40
r7 : 4ff713d9  r6 : 00000002     r5 : 20005000  r4 : 4f56f93c
r3 : 20005000  r2 : 4f56f93c     r1 : 4f56f93c  r0 : 00000000
Flags: nzCv  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...
这就是ELF头被“执行”时发生的情况。
由于文件显然包含ELF头,因此其文件扩展名应为.ELF,而不是.bin
这个可执行文件是如何获得误导性名称的

您可能没有构建独立的二进制图像文件。
U-Boot源代码的examples/standalone/目录包含用于构建独立二进制文件的示例代码和生成文件,例如ahello\U world.bin
请确保为您的电路板正确定义配置\u独立\u加载\u地址
默认加载地址肯定不合适



=>bdinfo命令告诉我有关DRAM库的一些信息,从0x10000000(7个零)开始,到0x4000000结束

(首先,不要在评论中添加显著信息。使用编辑功能将其添加到原始帖子中。)
您提供的“信息”毫无意义(即结束地址小于开始地址)。避免解释信息,而是简单地呈现(复制粘贴)实际输出

然后我使用fatload mmc 1:4 0x10005000 hello.bin代替,这似乎很有效。我想我是写信给一个出界的地址

fatload
命令仅将文件内容复制到内存中。该拷贝的真正成功是通过验证内存来确认的,而不是通过命令的完成来确认的。
您的评论令人困惑,因为您之前没有提到任何加载问题

go 0x10005000仍然不工作

尝试任意加载/启动地址不是一种有效的调试技术。
“似乎有效”或“仍然无效”的总和是对结果的低质量描述。

我编译了一个简单的二进制文件(hello.bin)并将其存储在存储卡上

您忽略了许多重要的细节。
您是如何编译此程序的,例如什么工具链、什么makefile?
您是否将此程序与库链接

按照我的理解,文件应该加载到内存中的地址0x2000000

你是怎么理解的

通常,独立程序的加载地址取决于几个因素。
首先必须考虑(目标板上)可用内存的地址。
其次,除非独立程序是可重新定位的(在您的情况下不太可能),否则必须按照链接程序时定义的加载/启动地址加载程序。
程序的加载和启动地址可以从其映射文件(即链接器输出)中获得

当我尝试启动二进制文件时,设备会报告未定义的指令:

=> go 0x20005000
## Starting application at 0x20005000 ...
undefined instruction
pc : [<20005158>]          lr : [<4ff71403>]
reloc pc : [<e7897158>]    lr : [<17803403>]
sp : 4f56dd50  ip : 00000000     fp : 00000002
r10: 4f56f938  r9 : 4f56deb0     r8 : 4ffc3c40
r7 : 4ff713d9  r6 : 00000002     r5 : 20005000  r4 : 4f56f93c
r3 : 20005000  r2 : 4f56f93c     r1 : 4f56f93c  r0 : 00000000
Flags: nzCv  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...
这就是ELF头被“执行”时发生的情况。
由于文件显然包含ELF头,因此其文件扩展名应为.ELF,而不是.bin
这个可执行文件是如何获得误导性名称的

您可能没有构建独立的二进制图像文件。
U-Boot源代码的examples/standalone/目录包含用于构建独立二进制文件的示例代码和生成文件,例如ahello\U world.bin
请确保为您的电路板正确定义配置\u独立\u加载\u地址
默认加载地址肯定不合适



=>bdinfo命令告诉我有关DRAM库的一些信息,从0x10000000(7个零)开始,然后