当前位置: 技术问答>linux和unix
请教 uboot的bootm引导内核
来源: 互联网 发布时间:2017-04-02
本文导语: 本帖最后由 xieweihua2012 于 2012-12-02 18:58:28 编辑 大家好 我在阅读uboot的bootm命令源码时 有些地方不是很明白 在do_bootm函数中,有如下语句 [color=#0000FF]#ifdef CONFIG_ZIMAGE_BOOT #define LINUX_ZIMAGE_MAGIC 0x016f2818 /* find out ke...
我在阅读uboot的bootm命令源码时 有些地方不是很明白
在do_bootm函数中,有如下语句
[color=#0000FF]#ifdef CONFIG_ZIMAGE_BOOT
#define LINUX_ZIMAGE_MAGIC 0x016f2818
/* find out kernel image address */
if (argc ih_os = IH_OS_LINUX;
hdr->ih_ep = ntohl(addr); //0x800020
memmove (&images.legacy_hdr_os_copy, hdr, sizeof(image_header_t)); /* save pointer to image header */
images.legacy_hdr_os = hdr;
images.legacy_hdr_valid = 1;
goto after_header_check;
}
#endif[/color]
对于上面的代码有疑问如下:
1、宏定义 CONFIG_ZIMAGE_BOOT 是不是表示所加载的内核是zImage格式的映像文件?
2、用红色标记的判断语句 if (*(ulong *)(addr + 9*4) == LINUX_ZIMAGE_MAGIC)是什么意思,为什么如果该语句成立就直接跳转到after_header_check呢(略过对映像头文件的校验),难道是因为zImage格式的映像文件没有头部信息吗,如果是这个原因的话,为啥有memmove (&images.legacy_hdr_os_copy, hdr, sizeof(image_header_t)); 这句话呢(这句话的意思应该就是将头部的64个字节信息保存在images.legacy_hdr_os_cpoy所指向的内存里面,这样看的话,好像又有头部信息)
往路过高手们不吝赐教,走过路过不要错过嘛
|
这个zImage也是有的,从我的u-boot2012.10中可以看出,这个头是由一个结构体来描述的:
struct zimage_header {
uint32_t code[9];
uint32_t zi_magic;
uint32_t zi_start;
uint32_t zi_end;
};
不过,在跳的到内核镜像执行的时候确实是跳转到了zImage的首地址,我想应该是zImage的code[9];这部分内容的原因吧,大家知道zImage是自解压格式的,这9*4字节的代码估计就是解压内核或跳转到zImage解压部分的代码。
另外,uImage是由编译u-boot的时候在tools目录下生成的mkimage工具处理生成的内核镜像,它的这个文件头是由mkimage生成的,用于指示u-boot的引导过程。
struct zimage_header {
uint32_t code[9];
uint32_t zi_magic;
uint32_t zi_start;
uint32_t zi_end;
};
不过,在跳的到内核镜像执行的时候确实是跳转到了zImage的首地址,我想应该是zImage的code[9];这部分内容的原因吧,大家知道zImage是自解压格式的,这9*4字节的代码估计就是解压内核或跳转到zImage解压部分的代码。
另外,uImage是由编译u-boot的时候在tools目录下生成的mkimage工具处理生成的内核镜像,它的这个文件头是由mkimage生成的,用于指示u-boot的引导过程。