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

How to boot Linux kernel from u-boot?

我的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 ...

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

结果: 感谢所有在 post 中回答的人!现在我可以使用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程序,显示在屏幕上。但是调试串口就没有反应了!

关于第二句,如果我像下面这样使用0xC0700000和0xC0e00000的ram地址,那么它就会停止加载内核。原因应该是木屑在他的回答中提到的。 @木屑

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

启动顺序看起来不错。内核和设备树已正确加载。问题似乎出在内核本身。可能它只是没有使用正确的设置构建。具体来说,应该启用控制台设备和早期 printk 设施。还要检查你的 bootargs.

尽管消息"Starting kernel ...",内核并没有真正开始执行(因为图像必须首先重新定位并且还未压缩),因此启用earlyprintk 还没有效果。
看起来可疑的是 RAM 地址。

典型的 "am33xx-evm" 板从 0x80000000 开始只有 512MB RAM。
但是您正在尝试使用从 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