博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

jiuzhuaxiong

创造属于你的天空,有了问题可以跟大家一起讨论! 在LINUX和VXWORKS嵌入式开发中学到了一些经验跟大家分享!
  jiuzhuaxiong.cublog.cn

关于作者
姓名:HugBear2008
QQ:280051265
年龄:25
位置:中国.广州
E-MAIL:jiuzhuaxiong@163.com
|| << >> ||
我的分类


uBoot和Linux内核中涉及到的几个地址参数的理解

接续前一篇《AT91RM9200uBootLinux-2.4.19的参数传递关系》,本篇谈一谈其中使用到的几个地址参数的具体含义

*************************************************

arch/arm/Makefile     

//内核运行虚拟地址TEXTADDR  = 0xC0008000

*************************************************

arch/arm/boot/Makefile       

//内核加载地址ZRELADDR     = 0x20008000

*************************************************

arch/arm/boot/compressed/Makefile

//自解压程序地址ZTEXTADDR  = 0x00000000

linux-2.4.19-rmk7内核的自解压函数gunzip位于

 /lib/inflate.c中,为gzip-1.0.3版本,现在在PC上使用gzip

 函数压缩出来的文件不能被gzip-1.0.3版本的gunzip识别,所以linux-2.4.19-rmk7

 内核自解压的功能等于不能使用,默认值ZTEXTADDR= 0x00000000

表示不使用。(只能通过uBootgunzip解压加载)

***********************************************

//uImage存放地址          = 0x21000000

***********************************************

mkimage -A arm -O linux -C gzip -a 0x20008000 -e 0x20008000 -d linux.bin.gz uImage

-A:CPU类型

-O:操作系统

-C:采用的压缩方式

-a:内核加载地址

-e:内核入口地址

***********************************************

uBootdo_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);

函数将检验存放到0x21000000地址处的经过mkimage格式化的uImage数据的头部

typedef struct image_header {

uint32_t ih_magic;  /* Image Header Magic Number */

uint32_t ih_hcrc;   /* Image Header CRC Checksum */

uint32_t ih_time;   /* Image Creation Timestamp */

uint32_t ih_size;   /* Image Data Size */

uint32_t ih_load;   /* Data Load Address */

uint32_t ih_ep;     /* Entry Point Address */

uint32_t ih_dcrc;  /* Image Data CRC Checksum */

uint8_t  ih_os;     /* Operating System */

uint8_t  ih_arch;  /* CPU architecture */

uint8_t  ih_type;  /* Image Type */

uint8_t  ih_comp;  /* Compression Type */

uint8_t  ih_name[IH_NMLEN]; /* Image Name */

}image_header_t;

(ih_ep值为0x20008000ih_load值为0x20008000)

如果头部各个域值和crc合法,那么do_bootm将调用如下gunzip解压函数对

0x21000000 +sizeof(image_header_t)地址处的压缩内核进行解压:

gunzip((void*)ntohl(hdr->ih_load),0x400000,data,(int*)&len)

1.hdr->ih_load   为输出数据地址0x20008000

2.0x400000       gunzip解压输出数据上限值-4M

3.data           为输入数据地址data=0x21000000 +sizeof(image_header_t);

4.Len            为输入数据长度len = ntohl(hdr->ih_size );

                  解压完成后将会存储解压后数据的实际大小

压缩的Linux内核文件uImage,经由gunzip解压函数后,通过

do_bootm_linux (cmdtp, flag, argc, argv,addr, len_ptr, verify);

函数向Linux内核传递内核运行所需的5个参数

kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))hdr->ih_ep ;

1.hdr->ih_ep     0x20008000

/*

* Linux Kernel Parameters:

* r3: ptr to board info data

* r4: initrd_start or 0 if no initrd

* r5: initrd_end - unused if r4 is 0

* r6: Start of command line string

* r7: End of command line string

*/

(*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);

这样完成了Linux系统启动所需要5个参数的传递,至此uBoot的工作已经结束,Linux将在0x20008000地址处正式运行。


发表于: 2008-03-26,修改于: 2008-03-26 00:19,已浏览211次,有评论0条 推荐 投诉


网友评论
 发表评论