|
大家好
我在阅读uboot的bootm命令源码时 有些地方不是很明白
在do_bootm函数中,有如下语句
#ifdef CONFIG_ZIMAGE_BOOT
#define LINUX_ZIMAGE_MAGIC 0x016f2818
/* find out kernel image address */
if (argc < 2) {
addr = load_addr;
debug ("* kernel: default image load address = 0x%08lx\n",
load_addr);
} else {
addr = simple_strtoul(argv[1], NULL, 16); //0xc0008000
debug ("* kernel: cmdline image address = 0x%08lx\n", img_addr);
}
if (*(ulong *)(addr + 9*4) == LINUX_ZIMAGE_MAGIC) {
printf("Boot with zImage\n");
addr = virt_to_phys(addr); //0x20008000
hdr = (image_header_t *)addr;
hdr->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
对于上面的代码有疑问如下:
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所指向的内存里面,这样看的话,好像又有头部信息)
往路过高手们不吝赐教,走过路过不要错过嘛
|
|