Linux启用时,initrd可以在内存中,也可以在 Flash或其它可用的配备上;initrd文件样式为: romfs/Minix/ext2/gzip;相干的函数:drivers/block/rd.c: identify_ramdisk_image ;
加载方位: init/main.c: prepare_namespace;
必需的参数为:initrd_start 和 initrd_end;
ARM怎么递送initrd参数:ARM递送initrd参数可以分为两种景象:
1.从外表取得的景象:
arch/arm/kernel/setup.c: 从 TAG参数中取得(tags简单来说内存中一段具有定然样式的标签数据和参数,中心和Loader所共知的一种样式,由loader来结构,由中心来读取);穿越Loader或中心一举成名的召唤行参数中应包含 root=/dev/ram的参数;
2.不从外表取得的景象:
可以在 fix_up 中来设置,就像上面代码中说到的相同:
aster2_fixup(struct machine_desc *desc, struct param_struct *unused,dyramics.com
char **cmdline, struct meminfo *mi)
{
ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
setup_ramdisk(1, 0, 0, CONFIG_BLK_DEV_RAM_SIZE);
setup_initrd(0x04200000, 4 * 1024 * 1024);
}
这段代码的收成有几个:
(1)榜首行:设置根文件体系为 ramdisk(相当于root=/dev/ram0,这种景象下中心召唤行参数可以无需要这一行)
(2) 第二行:加载ramdisk;
(3) 第三行:穿越setup_initrd设置initrd的参数,即(虚拟的)开端和告终地址;
Loader向内核传参数穿越这么的代码:BOOT_PARAMS(0x04000100); 0x04000100是个极其重要的地址,中心将从这个地址开端剖析 tag参数,可以递送的参数包含:物理内存音讯(ATAG_MEM)、ramdisk音讯(ATAG_RAMDISK从前不再使用),initrd音讯(ATAG_INITRD2),序列号(ATAG_SERIAL),版本号(ATAG_REVISION),召唤行参数(ATAG_CMDLINE)等。Loader可以部份或全部设定这些符号。
递送 initrd 参数的条件是, image文件中包含 initrd文件,即穿越 mkimage生成一个中心与initrd稠浊的image文件,然后用bootm,这个参数就可以传给中心了。中心代码中界说的参数地址BOOT_PARAMS(0x04000100)与u-boot中的参数地址定然一致。
如果要能加载 initrd 到 ramdisk中,那么 Loader应当将 initrd加载到 (虚)0x04200000方位,让Loader自已传参数给中心。