uBoot和Linux内核中涉及到的几个地址参数的理解
来源:互联网 发布:用友软件代理商查询 编辑:程序博客网 时间:2024/05/21 11:10
*************************************************
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
表示不使用。(只能通过uBoot的gunzip解压加载)
)
***********************************************
//uImage存放地址 = 0x21000000
***********************************************
mkimage -A arm -O linux -C gzip -a 0x20008000 -e 0x20008000 -d linux.bin.gz uImage
-A:CPU类型
-O:操作系统
-C:采用的压缩方式
-a:内核加载地址
-e:内核入口地址
***********************************************
uBoot的do_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值为0x20008000,ih_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地址处正式运行。
- uBoot和Linux内核中涉及到的几个地址参数的理解
- 几个地址参数及uboot加载启动内核过程的理解
- Uboot中driver驱动和linux内核驱动的区别
- Uboot中driver驱动和linux内核驱动的区别
- 调整linux内核的几个重要参数
- uBoot和Linux的参数传递关系
- A:UBOOT向LINUX内核传递参数的原理
- 对这段时间涉及到的Linux内核中重要结构体和宏的研究总结
- Linux 信号处理机制中涉及到的相关几个函数解释
- uboot内核参数的传递与内核解析uboot传递的内核参数
- uboot内核参数的传递与内核解析uboot传递的内核参数
- UBOOT引导Linux内核及向内核传递参数的方式
- UBOOT引导Linux内核及向内核传递参数的方式
- UBOOT引导Linux内核及向内核传递参数的方式
- UBOOT引导Linux内核及向内核传递参数的方式
- UBOOT引导Linux内核及向内核传递参数的方式
- Linux内核---16.启动分析4uboot与内核的参数传递
- Linux内核中进程上下文和中断上下文的理解
- 第一篇,纯粹做个记号
- 尚学堂java相关
- 一个添加音乐的DemoMusic类
- auto_ptr_ref的奇妙
- 消息摘要算法-bouncy castle支持的MD4算法扩展
- uBoot和Linux内核中涉及到的几个地址参数的理解
- 三。页面调用方法
- 微软宣布.NET 3.0/3.5主流支持终止日期
- ExtJS 进度条的使用
- 分享.NET开发中经常用到的十大软件
- VC调试入门
- 一不小心搞错了
- VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏
- 可维护性分布式存储系统和分离的分布式系统