【发布时间】:2013-08-25 01:44:39
【问题描述】:
我正在尝试在带有 i.MX6 的自定义板上通过 U-boot 启动 Linux(CPU 内核是 ARM Cortex A9)
我们似乎已经成功移植了 Das U-Boot(2009.08)。但是在最后一条 U-Boot 消息中引导 Linux 失败:“正在启动内核 ...”
这是我的相关环境:
bootargs=console=ttymxc1,115200 vmalloc=400M root=/dev/mmcblk0p1 rootwait consoleblank=0 earlyprintk video=mxcfb0:dev=lcd,LCD-ORTUS,if=RGB24 video=mxcfb1:dev=hdmi,1280x720M@60,if=RGB24 calibration tsdev=tsc2004 fbmem=10M,28M
bootcmd=ext2load mmc 0:1 10800000 /boot/uImage ; bootm 10800000
开机输出是
Loading file "/boot/uImage" from mmc device 0:1 (xxa1)
4043552 bytes read
## Booting kernel from Legacy Image at 10800000 ...
Image Name: Linux-3.0.35
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4043488 Bytes = 3.9 MB
Load Address: 10008000
Entry Point: 10008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK
Starting kernel ...
当我在地址 80008000 处对内核进行 objdump 时,我看到入口点位于 arch/arm/kernel/head.S,而不是 arch/arm/boot/compressed/head.S
我看到的是,内核甚至没有解压缩。我尝试在compressed/head.S 中添加一些寄存器操作代码来向 GPIO 发送信号,但没有响应。
我的问题是,如何确保 U-Boot 调用了正确的入口点?
完全相同的内核二进制文件在飞思卡尔的参考板上成功启动,使用相同的 U-Boot 命令。
编辑:我在 U-Boot 中添加了一些痕迹。在调用内核之前,指针 theKernel 是 10008000 而不是 10800000。这是否意味着 U-boot 跳错了位置?
【问题讨论】:
-
你有 JTAG 吗?如果是这样,只需调试它。
-
我认为kernel需要解压后才会启动,启动kernel print后,kernel会跳转到u-boot从kernel image header获取的kernel入口函数。您将压缩内核从引导介质复制到 10800000,bootm 命令将解压缩并将内核放在正确的加载地址,即 10008000,距离 RAM 起始地址 32K 的边界。如果它没有启动,那么很可能原因是机器 ID。我想知道正确的原因是什么?
标签: linux-kernel arm embedded-linux boot u-boot