引言:根文件系统的noinitramfs已经分析,继续上文未完的initramfs和Android根文件系统分析,这两者有什么关系?
1.initramfs、initrd
对于initramfs,kernel 2.5开始引入,其实质是在内核镜像中附加一个cpio包(cpio一个用于备份、还原的工具,主要用于cpio和tar文件,其实质是文件、目录、节点的描述语言包),在该cpio包中包含了一个小型的文件系统。当内核启动时,会尝试解开这人 cpio包,并且将其中包含的文件系统安装到rootfs中,内核中的一部分初始化代码会放到这个文件系统中,一般为用户空间的init进程。
initamfs的引入可以精简内核的初始化代码,同时是为了更方便地定制内核的初始化过程。这种方式的rootfs是包含在kernel image(即bootimage或secbootimage)之中的。
先看下initramfs的初始化代码:
static int __init populate_rootfs(void)
{
char *err = unpack_to_rootfs(__initramfs_start,
__initramfs_end - __initramfs_start, 0);
#ifdef CONFIG_BLK_DEV_RAM
if (initrd_start) {
err = unpack_to_rootfs((char *)initrd_start,
initrd_end - initrd_start, 1);
if (!err) {
printk(" it is\n");
unpack_to_rootfs((char *)initrd_start,
initrd_end - initrd_start, 0);
free_initrd();
return 0;
}
printk("it isn't (%s); looks like an initrd\n", err);
fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700);
if (fd >= 0) {
sys_write(fd, (char *)initrd_start,
initrd_end - initrd_start);
sys_close(fd);
free_initrd();
}
#else