[在网络上各位大侠的指导下,用u boot 成功引导linux。正在阅读U boot源码,第一次读U boot 源码,很多地方还不明白。本人会不定时修正文中谬论,也请各路大侠不吝赐教!]
在u boot 中可以使用bootm命令启动 kernel,网络上有大侠用go启动kernel,本人尚不玩转go。工作环境:MINI2440 + Ubuntu 10.04。下面是一些实测记录,有些凌乱,各位看官见谅!
1. 用go 指令执行未使用mkimage工具对linux进行压缩,形成u-boot可引导的uImage.img文件。直接下载zImage.img
[u-boot@MINI2440]# usbslave 500000 30008000
USB host is connected. Waiting a download.
get downloadFileSize = 2517054 !!
Now, Downloading [ADDRESS:30008000h,TOTAL:2517054]
RECEIVED FILE SIZE: 2517054 (491KB/S, 5S)
[u-boot@MINI2440]# go 30008000
## Starting application at 0x30008000 ...
Uncompressing Linux..............................................................................................
-dead-
2. 用go指令执行用mkimage工作处理过的uImage.ing
[u-boot@MINI2440]# usbslave 50000 30008000
USB host is connected. Waiting a download.
get downloadFileSize = 2517114 !!
Now, Downloading [ADDRESS:30008000h,TOTAL:2517114]
RECEIVED FILE SIZE: 2517114 (614KB/S, 4S)
[u-boot@MINI2440]# go 30008040
## Starting application at 0x30008040 ...
Uncompressing Linux..............................................................................................
-dead-
3.用bootm指令执行用mkimage工作处理过的uImage.ing
[u-boot@MINI2440]# usbslave 500000 30008000
USB host is connected. Waiting a download.
get downloadFileSize = 2517114 !!
Now, Downloading [ADDRESS:30008000h,TOTAL:2517114]
RECEIVED FILE SIZE: 2517114 (614KB/S, 4S)
[u-boot@MINI2440]# bootm 30008000
## Booting kernel from Legacy Image at 30008000 ...
Image Name: linux-2.6.32.2
Created: 2011-03-03 11:05:18 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2517040 Bytes = 2.4 MB
Load Address: 30008000
Entry Point: 30008040
Verifying Checksum ... OK
XIP Kernel Image ... OK
OK
Starting kernel ...
Uncompressing Linux.....
-olive-4.用bootm指令执行未用mkimage工作处理过的zImage.ing
[u-boot@MINI2440]# usbslave 500000 30008000
USB host is connected. Waiting a download.
get downloadFileSize = 2517054 !!
Now, Downloading [ADDRESS:30008000h,TOTAL:2517054]
RECEIVED FILE SIZE: 2517054 (614KB/S, 4S)
[u-boot@MINI2440]# bootm 30008000
Wrong Image Format for bootm command
ERROR: can't get kernel image!
[u-boot@MINI2440]#
实践证明:U boot只能启动用mkimage处理过的kernel。mkimage 将一些kernel的基本信息加在kernel的头部。通过在源码添加printf做标记,发现启动kernel是 /common/cmd_bootm.c中名为do_bootm_linux的函数执行的。在执行do_bootm_linux之前,其他程序将kernel从nand、SD等介质上的kernel复制到RAM,如果kernel是压缩的,还需要将其解压。做必要的检查后,使用do_bootm_linux启动kernel。OK,让我们追踪bootm的执行过程。
bootm的大致有7个过程。
1.参数检查
2.boot_start()获取kernel
3.禁止中断
4.bootm_load_os()装载kernel,如果kernel是压缩的还需要将其解压。
5. boot_fn = boot_os[images.os.os];
6. boot_fn(0, argc, argv, &images);
启动linux kernel由do_bootm_linux()执行。
7. 启动正常,boot_fn不会返回。
u boot使用函数指针,巧妙的将kernel需要的参数传递给kernel:
void (*theKernel)(int zero, int arch, uint params);
theKernel()函数的入口地址就是kernel image的入口地址。
theKernel = (void (*)(int, int, uint))images->ep; theKernel (0, machid, bd->bi_boot_params); //通过执行theKernel传递参数给linux kernel。