如何从u-boot启动Linux内核?

4

我的Linux内核镜像uImage在我的U盘中。我想从U-Boot引导它。同时,设备树文件am335x-evm.dtb也在我的U盘中。

我的操作如下:

U-Boot# usb start
(Re)start USB...
USB0:   scanning bus 0 for devices... 1 USB Device(s) found
       scanning usb for storage devices... 1 Storage Device(s) found
U-Boot# fatls usb 0:1
  3821960   uimage
            kit3/
  4065280   modules.tar
            my_modules/
            extra/
            system volume information/
      375   uenv.txt
    40474   am335x-evm.dtb

4 file(s), 4 dir(s)

U-Boot# fatload usb 0:1 0xC0700000 uImage
reading uImage
3821960 bytes read in 2375 ms (1.5 MiB/s)
U-Boot# fatload usb 0:1 0xC0e00000 am335x-evm.dtb
reading am335x-evm.dtb
40474 bytes read in 48 ms (823.2 KiB/s)
U-Boot# bootm 0xC0700000 - 0xC0e00000
## Booting kernel from Legacy Image at c0700000 ...
   Image Name:   Linux-3.12.10-ge35dc10-dirty
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    3821896 Bytes = 3.6 MiB
   Load Address: 80008000
   Entry Point:  80008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at c0e00000
   Booting using the fdt blob at 0xc0e00000
   Loading Kernel Image ... OK
OK
   Using Device Tree in place at c0e00000, end c0e0ce19

Starting kernel ...

非常感谢在这篇帖子中回答我的每个人!现在我可以通过使用U盘中的映像启动系统。我所做的是:

到此为止。怎么办?谢谢!

setenv bootargs "console=ttyO0,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext4 mem=512M coherent_pool=8M loglevel=0 lpj=3317760 rootwait"
usb start; fatls usb 0:1; fatload usb 0:1 0x82000000 uImage-orig-onUSB;fatload usb 0:1 0x80F80000 am335x-evm.dtb;bootm 0x82000000 - 0x80F80000

没有第一句话,系统仍然可以启动并启动GUI程序,显示在屏幕上。但是调试串口将不再有反应!
至于第二句话,如果我使用RAM地址0xC0700000和0xC0e00000,像下面这样,那么它将停止加载内核。原因应该是sawdust在他的答案中提到的。@sawdust
setenv bootargs "console=ttyO0,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext4 mem=512M coherent_pool=8M loglevel=0 lpj=3317760 rootwait"
usb start; fatls usb 0:1; fatload usb 0:1 0xC0700000 uImage-orig-onUSB;fatload usb 0:1 0xC0e00000 am335x-evm.dtb;bootm 0xC0700000 - 0xC0e00000

1
在内核中启用EARLY_PRINTK(以及相应的UART选项)。同样通过bootargs变量传递earlyprintk到cmdline。这样,您就可以看到出了什么问题。还要检查bootargs中的console参数(以及内核中的CMDLINE选项):可能只是使用了错误的/dev/tty...文件。 - Sam Protsenko
2个回答

5
尽管出现了信息“Starting kernel ...”,但内核实际上还没有开始执行(因为必须首先将映像重新定位并解压缩),因此启用< strong> earlyprintk 目前没有任何效果。 看起来可疑的是RAM地址。
典型的“am33xx-evm”板只有512MB RAM,从0x80000000开始。 然而,您正在尝试使用来自0xC0700000到0xC0E0CE19的RAM地址,实际物理内存不存在。 显然,内核和设备树没有正确加载。
替换为
fatload usb 0:1 0xC0700000 uImage
fatload usb 0:1 0xC0e00000 am335x-evm.dtb
bootm 0xC0700000 - 0xC0e00000

尝试使用

fatload usb 0:1 0x80200000 uImage 
fatload usb 0:1 0x80e00000 am335x-evm.dtb
bootm 0x80200000 - 0x80e00000 

我同意关于RAM范围的部分,但是奇怪的是它说校验和是正常的。我认为原帖作者应该详细说明他正在使用的平台。至于另一个问题,图像已经是未压缩的了,我们通常不会收到有关重定位过程的任何消息。 - Eugene Sh.
@EugeneSh。*"它说校验和没问题"* -- 可能存在地址包装。*"镜像已经解压缩了"* -- 不一定:在uImage中使用的最常见的ARM内核映像是zImage,它是自解压缩的,U-Boot总是将其报告为“未压缩”。顺便说一下,“verbose”不是一个动词。 - sawdust
所以,如果正在进行包装并计算校验和,这不意味着图像完全存在于某个内存中吗?对于错误的英语用法感到抱歉。 - Eugene Sh.
其实我有一块贝狗骨头板子,可以尝试使用一个可用的内核。 - Eugene Sh.

2
引导序列看起来没问题。内核和设备树已经正确加载。问题似乎出在内核本身上。可能它只是没有使用正确的设置进行构建。具体来说,控制台设备和早期的printk功能应该被启用。还要检查你的bootargs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接