解决 uboot data abort报错

本文记录了作者在解决U-Boot中遇到的data abort错误的过程,包括尝试通过反汇编定位错误、考虑非对齐访问问题、分析bdinfo获取的偏移量,并深入研究大小端转换可能引发的问题,最终发现错误可能与SD卡的mmc设备有关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新手解决bug 一步一坑-_-! 一切从最基础的开始 加油
报错内容如下:

536 bytes read in 6 ms (86.9 KiB/s)
** File not found /boot/dtb/sunxi/sun50i-h6-orangepi3.dtb **
data abort
pc : [<7edf1270>]          lr : [<7ed96fbc>]
sp : 79cb85a4  ip : 00000065     fp : 7ed977dc
r10: 00000003  r9 : 79cffe60     r8 : 00000000
r7 : 7ade66c0  r6 : 00000000     r5 : 43000000  r4 : 7ee50514
r3 : 00000000  r2 : f7932b91     r1 : b4932b91  r0 : 43000000
Flags: nzCv  IRQs on  FIQs off  Mode SVC_32
Resetting CPU ...

resetting ...

在网上查找资料发现有解决办法记一次uboot 中出现的 data abort 错误
该文章中讲 先将生成的uboot 文件 使用命令反汇编生成 .s 文件 然后找到出错的地方就可以定位到出错的函数 出错的语句 进而解决问题

但我在使用 命令 objdump -S u-boot > u-boot.s 反汇编的时候 报错

u-boot:     file format elf32-little

objdump: can't disassemble for architecture UNKNOWN!

这个报错是架构不正确 因此换了交叉编译反汇编 aarch64-linux-gnu-objdump -S u-boot > u-boot.s 成功生成 u-boot.s文件。
但是 我这个出错的位置 很奇怪 查看了 u-boot.s 文件 通篇都是 4 开头的地址 但我报错的位置 是 7edf1270 就很奇怪 因此 定位不出 出错的函数 和 出错的语句 陷入僵局 继续查找资料!!!

上面这篇参考博客中写 这些错误是由于非对齐访问出现的 因此在uboot 源码 start.s 中开启非对齐访问可以解决该问题
如下:

/*
	 * disable MMU stuff and caches
	 */
	mrc	p15, 0, r0, c1, c0, 0
	bic	r0, r0, #0x00002000	@ clear bits 13 (--V-)
	bic	r0, r0, #0x00000007	@ clear bits 2:0 (-CAM)
	orr	r0, r0, #0x00000000	@ set bit 1 (--A-) Align	  change Original value is #0x00000002
	orr	r0, r0, #0x00000800	@ set bit 11 (Z---) BTB
### 回答1: 这个错误提示表明,在编译内核时未包含FDT(Flattened Device Tree)和ATAGS(Auxiliary Table Attribute)的支持。 FDT和ATAGS是在启动过程中用于传递设备树和系统配置信息的方法。如果内核没有包含这些支持,则引导过程可能会失败。请重新编译内核,确保包含FDT和ATAGS的支持。 ### 回答2: U-Boot是一款开源的引导加载程序,用于在嵌入式系统上启动操作系统内核。当出现"FDT and ATAGS support not compiled in-hanging"的报错时,意味着U-Boot的配置中没有启用对设备树(Device Tree)和ATAGS的支持。 设备树是一种描述嵌入式系统硬件和设备信息的数据结构,它允许操作系统内核在不同的硬件平台上运行,而无需针对每个硬件平台编写不同的内核镜像。而ATAGS(Android Tagged Attributed Memory)是Android系统的一种启动参数传递方式。 导致这个报错的原因可能是在编译U-Boot时没有选择启用设备树和ATAGS的选项。为了解决这个问题,我们需要重新编译U-Boot,并在配置过程中启用对设备树和ATAGS的支持。 首先,我们需要获取到U-Boot的源代码。可以从U-Boot官方网站或代码仓库下载。然后,打开U-Boot的配置文件(通常是在源代码根目录下的.config文件),查找关于设备树和ATAGS的选项。 在配置文件中,找到以下选项并确保它们被设置为"y"或"m": - CONFIG_OF_CONTROL # 启用设备树支持 - CONFIG_ANDROID_BOOT_IMAGE # 启用ATAGS支持 保存配置文件,然后执行编译过程。具体编译过程可能会因硬件平台和编译工具链而有所不同。可以按照U-Boot官方网站提供的文档或README文件中的指导进行编译。 编译完成后,将生成的U-Boot二进制文件烧写到目标嵌入式设备上,并重新启动设备。现在,U-Boot应该能够成功启动,并且不再显示"FDT and ATAGS support not compiled in-hanging"的报错。 总结:在解决这个问题时,我们需要重新编译U-Boot并在配置中启用对设备树和ATAGS的支持。这样,U-Boot就能够成功启动,并顺利加载内核,进入操作系统。 ### 回答3: 当uboot引导内核时,如果出现"FDT and ATAGS support not compiled in-hanging"的报错信息,表示uboot没有编译支持FDT(Flattened Device Tree)和ATAGS(Android Tagged Memory)的功能,导致系统无法正常启动而卡住。 FDT是一种描述硬件设备的数据结构,它通过将硬件设备的信息以树状结构表示,提供给内核进行设备初始化和驱动加载。而ATAGS则是一种特定于Android系统的内存信息描述结构,用于传递内核启动所需的参数和设备信息。 当uboot没有编译支持FDT和ATAGS功能时,它无法正确地读取设备的硬件信息和传递给内核所需的参数,导致内核无法正常启动,最终进入死循环(hanging)状态。 要解决这个问题,需要重新编译uboot并确保编译过程中启用了FDT和ATAGS的支持。具体的步骤如下: 1. 下载uboot源码,并进入源码所在目录。 2. 使用适当的交叉编译工具链,设置编译uboot的环境变量。 3. 执行make命令进入配置界面。 4. 在配置界面中,在相关选项中启用FDT和ATAGS的支持。切记,这些选项可能位于不同的配置菜单中,具体位置可能因不同版本的uboot而异。 5. 保存配置,退出配置界面。 6. 执行make命令进行编译,生成新的uboot镜像。 7. 将新生成的uboot镜像烧录到目标设备中,并重新启动。 通过重新编译uboot并启用FDT和ATAGS的支持,应该能够解决"uboot引导内核报错FDT and ATAGS support not compiled in-hanging"的问题,使系统能够正常启动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值