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 中来设置,就像上面代码中说到的相同:
print?
- aster2_fixup(structmachine_desc*desc,structparam_struct*unused,char**cmdline,structmeminfo*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自已传参数给中心