BeagleBone Black自定义uImage启动故障求助
Hey,我看你折腾自制uImage启动BBB的时候卡在U-Boot SPL阶段了,这个问题我之前帮朋友排查过好几次,大概率是镜像生成、启动配置或者文件结构的问题,给你列几个关键排查点:
先把mkimage的参数掰正
BBB的ARM架构对uImage的加载/入口地址有严格要求,你生成uImage的时候必须用对参数。正确的命令应该是这样的:mkimage -A arm -O linux -T kernel -C none -a 0x80008000 -e 0x80008000 -n "Custom Linux Kernel" -d zImage uImage重点注意
-a和-e都是0x80008000,这是BBB默认的内核加载地址,写错的话SPL根本找不到内核入口。另外,一定要用zImage作为输入文件,别直接用编译出来的vmlinux,zImage是针对ARM优化压缩过的镜像,vmlinux是未压缩的,U-Boot不认。检查SD卡的启动分区和文件完整性
BBB的启动SD卡第一分区必须是FAT32格式,里面得有MLO、u-boot.img、uImage还有对应的设备树文件(比如am335x-bone-black.dtb)。你替换自制uImage的时候,别把原来的MLO和u-boot.img搞丢或者换成不兼容的版本——U-Boot和内核得是配套的,比如老版本U-Boot可能不支持新内核的某些特性。U-Boot环境变量得对齐
如果SPL能启动但找不到内核,大概率是bootcmd环境变量配置错了。你可以按住BBB的用户按键(上电前按住,直到进入U-Boot命令行),然后输入printenv bootcmd看看配置。正确的加载命令应该类似:fatload mmc 0:1 0x80008000 /uImage; fatload mmc 0:1 0x80F00000 /am335x-bone-black.dtb; bootm 0x80008000 - 0x80F00000确保路径和你的uImage、dtb文件名完全一致,要是你把uImage放到子文件夹里,路径也得改对。
内核编译配置别踩坑
编译内核的时候必须启用BBB对应的设备树支持,还有串口控制台(CONFIG_SERIAL_AMPLART_CONSOLE),不然就算内核启动了你也看不到输出。另外,内核架构要选ARMv7,BBB的Cortex-A8是ARMv7架构,别选错成ARMv6了。验证uImage的完整性
生成完uImage后,用file uImage命令检查一下,正常输出应该包含Linux/ARM, OS Kernel Image,还有正确的加载和入口地址。如果输出不对,直接删掉重新生成,大概率是mkimage参数错了。
按照这几步排查下来,应该能解决SPL启动失败的问题,要是还有细节问题,可以把U-Boot的完整报错信息贴出来再细化排查。
内容的提问来源于stack exchange,提问作者rohit

