虚拟根文件系统与真实根文件系统

本文深入探讨了initramfs和initrd在Linux内核启动过程中的作用,以及它们与根文件系统的关系。initramfs是内核镜像的一部分,包含了小型文件系统,而initrd是单独的文件,需要bootloader加载。两者在解压后,根据不同的处理逻辑,最终切换到真实根文件系统。文章还提到了Android系统中用户空间的init进程及其在系统启动中的角色。
摘要由CSDN通过智能技术生成

引言:根文件系统的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
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值