ARM中的Ramdisk的使用

【ARM中的Ramdisk的使用】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,
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自已传参数给核心

    推荐阅读