U boot 引导linux kernel过程

[在网络上各位大侠的指导下,用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。

转载于:https://my.oschina.net/felixliang/blog/79038

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值