分析uboot是如何启动内核的
来源:互联网 发布:防止网络诈骗 编辑:程序博客网 时间:2024/04/29 17:44
原文地址:分析uboot是如何启动内核的作者:cdzlllfe
1.uboot启动内核的代码缩减如下:
s = getenv ("bootcmd");
debug ("### main_loop: bootcmd="%s"n", s ? s :"<UNDEFINED>");
if (bootdelay >= 0&& s&& !abortboot (bootdelay))
{
run_command(s, 0);
}
2.假设bootcmd = nand read.jffs2 0x30007FC0 kernel; bootm0x30007FC0
<1> nand read.jffs2 0x30007FC0kernel
nand read.jffs2 0x30007FC0 kernel;
从nand读出内核:从哪里读? 从kernel分区
放到哪里去?-0x30007FC0
下面讲解什么是分区:
就是将nand划分为几个区域,一般如下:
bootloader-》params-》kernel-》root
这些分区的划分是在/include/configs/mini2440.h中写死的:
#define MTDPARTS_DEFAULT"mtdparts=nandflash0:250k@0(bootloader),"
"128k(params),"
"5m(kernel),"
"-(root)"
注:@0表示从0地址开始,250k的bootloader分区可能对某些uboot不够用,这里只是举例而已。
将上面的信息换算成十六进制:
# name 大小 在nand上的起始地址
0 bootloader 0x00040000 0x00000000
1 params 0x00020000 0x00040000
2 kernel 0x00200000 0x00060000
3 root 0xfda00000 0x00260000
那么上面的nand read.jffs2 0x30007FC0 kernel就等价于:
nand read.jffs2 0x30007FC0 0x00060000 0x00200000
注:这里的read.jffs2并不是指定要什么特定的格式,而是用read.jffs2不需要块/页对齐,所以这个kernel的分区大小可以
随意定。
<2> bootm 0x30007FC0
关键函数do_bootm()
flash上存的内核:uImage
uImage = 头部+真正的内核
头部的定义如下:
typedef struct image_header {
uint32_t ih_magic;
uint32_t ih_hcrc;
uint32_t ih_time;
uint32_t ih_size;
uint32_t ih_load;
uint32_t ih_ep;
uint32_t ih_dcrc;
uint8_t ih_os;
uint8_t
s = getenv ("bootcmd");
debug ("### main_loop: bootcmd="%s"n", s ? s :"<UNDEFINED>");
if (bootdelay >= 0&& s&& !abortboot (bootdelay))
{
}
2.假设bootcmd = nand read.jffs2 0x30007FC0 kernel; bootm0x30007FC0
<1> nand read.jffs2 0x30007FC0kernel
nand read.jffs2 0x30007FC0 kernel;
从nand读出内核:从哪里读?
下面讲解什么是分区:
就是将nand划分为几个区域,一般如下:
bootloader-》params-》kernel-》root
这些分区的划分是在/include/configs/mini2440.h中写死的:
#define MTDPARTS_DEFAULT"mtdparts=nandflash0:250k@0(bootloader),"
注:@0表示从0地址开始,250k的bootloader分区可能对某些uboot不够用,这里只是举例而已。
将上面的信息换算成十六进制:
#
0
1
2
3
那么上面的nand read.jffs2 0x30007FC0 kernel就等价于:
nand read.jffs2 0x30007FC0 0x00060000 0x00200000
注:这里的read.jffs2并不是指定要什么特定的格式,而是用read.jffs2不需要块/页对齐,所以这个kernel的分区大小可以
随意定。
<2> bootm 0x30007FC0
关键函数do_bootm()
flash上存的内核:uImage
uImage = 头部+真正的内核
头部的定义如下:
typedef struct image_header {