2010年(49)
分类: 嵌入式
2010-09-07 14:39:04
从bootm 命令讲起
1 找到linux的内核入口
Bootm命令通过读取uImage的头部0x40字节的信息,将uImage定位到正确的地址,同时找到linux的内核入口地址。
这个地方就涉及到uImage的头部0x40字节信息到底是什么的问题?uboot提供了mkimage命令去把0x40字节加在linux内核头部。
mkimage -n "Kernel
-a 30007fc0,内核的拷贝地址。
-e 30008000,内核的入口地址。
-C 是否对内核压缩
2 向linux内核传递参数
if ((s = getenv("bootargs")) == NULL)
s = "";
strcpy (cmdline, s);
cmd_start = (ulong)&cmdline[0];
cmd_end = cmd_start + strlen(cmdline);
读取bootargs,保存在cmdline字符数组中,并用cmd_start指向cmdline开始处,用cmd_end指向cmdline末尾。
/*
* 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);
注意,除了我一直想知道的bootargs,另外还向kernel传递了kbd、initrd_start、initrd_end三个参数。
Kbd,使用bd_t结构定义,向内核传递很多board信息;
这些信息的来源就是uboot所维系的bd结构中的信息;
Initrd_start和initrd_end应该是告诉内核ramdisk的位置在哪里;
Ramdisk的信息目前我看到了两种方法:
1) 把ramdisk和内核做成一个multiImage,bootm函数及do_boot_linux会根据multiImage自己去找ramdisk在ram中的位置。然后传递给内核。
2) Ramdisk和内核分开,是两个image,然后分别下载到ram中,此时ramdisk的位置可以通过bootargs传递给内核。