Kernel 如何从u-boot引导Linux内核?

Kernel 如何从u-boot引导Linux内核?,kernel,u-boot,Kernel,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# fa

我的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程序,该程序将显示在显示器上。但是调试串口没有任何反应了

至于第二句话,如果我使用内存地址0xC0700000和0xC0e00000,如下所示,那么它将停止加载内核。原因应该是锯末在他的回答中提到的@锯末

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

尽管有消息“正在启动内核…”,但内核尚未实际开始执行(因为必须首先重新定位映像并解压缩),因此启用earlyprintk将不会有任何效果。
看起来可疑的是RAM地址

典型的“am33xx evm”板只有512MB的RAM,从0x8000000开始。
然而,您正在尝试使用从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 

在内核中启用
EARLY\u PRINTK
(以及相应的UART选项)。还可以通过
bootargs
变量将
earlyprintk
传递到cmdline。这样你就会知道哪里出了问题。还要检查
bootargs
中的
console
参数(以及内核中的
CMDLINE
选项):可能是您使用了错误的
/dev/tty…
文件。我同意RAM范围部分,但奇怪的是,它说校验和是正确的。我认为OP应该在他使用的平台上详细说明。至于另一个,图像已经解压缩,我们通常不会收到任何关于重新定位过程的消息。@EugeneSh。“它说校验和是正确的”——可能正在进行地址包装。“映像已经解压”——不一定:uImage中最常用的ARM内核映像是zImage,它是自解压的,U-Boot总是将其报告为“解压”。顺便说一句,“verbose”不是动词。因此,如果正在进行包装并计算校验和,这不是意味着图像已完全存储在内存中的某个位置吗?对不起,我的英语用法有误。事实上,我有一个比格犬骨头在附近的某个地方,可以用一个工作的内核来试试。。