【原】initramfs挂载过程(HiS)

标签:
linuxinitramfsrootfs嵌入式it |
分类: Linux-文件系统 |
initramfs挂载过程(HiS)
使用内存作为第一个rootfs的相关技术目前查到有三个:一个是版本较老的initrd(号称:传统格式),处理过程麻烦;另外一个是相对较新cpio-initrd,处理过程相对简单清晰,这两个本文不做介绍。
本文重点记录了针对HiS3716C的开发板的initramfs挂载过程(这个也属于cpio格式,存在于内核之中),其中一些函数功能介绍文字来源于网络博客。
一 编译配置
编译内核时,编译内核脚本里指明了ramdisk的目录,即
make
执行menuconfig后,相关的ramdisk的选项也已经选上。http://s5/mw690/001pjfmXzy6GST448Ly64&690
可见,ramdisk编译进了内核。
二 挂载过程分析
2.1 vfs_cache_init
init/main.c
-->fs/dcache.c
在vfs_cache_init中,重要操作mnt_init()会创建一个rootfs,这是个虚拟的rootfs,即内存文件系统。
2.2 mnt_init
在mnt_init中,重要操作有两个:
2.2.1
2.2.2
2.3 init_mount_tree
在init_mount_tree中,有两个重要操作,
2.3.1
2.3.2
可能有人会问,为什么不直接把真实的文件系统配置为根文件系统?
因为,内核中没有根文件系统的设备驱动,如USB等存放根文件系统的设备驱动,而且即便你将根文件系统的设备驱动编译到内核中,此时它们还尚未加载,其实所有的Driver是由在后面的Kernel_Init线程进行加载。所以需要CPIO
2.4 k ernel_init
接下来,kernel_start最后会去调用rest_init()并会去创建系统中的第一个进程kernel_init,并由其调用所有模块的初始化函数。有三个重要操作
2.4.1
函数do_basic_setup()调用所有模块的初始化函数,包括initramfs的初始化函数populate_rootfs。这部分代码在init/initramfs.c中,函数populate_rootfs通过如下方式导出:
在populate_rootfs中,有如下重要操作,HiS开发板只用了“操作(1)”:
(1)
解压包到rootfs,其实,initramfs也是压缩过后的cpio文件。
(2)
(3)
2.4.2
ramdisk_execute_command值通过“rdinit=”指定,如果未指定,则采用默认的值/init。
2.4.3
ramdisk_execute_command
prepare_namespace();}
检查根文件系统中是否存在文件ramdisk_execute_command,如果存在的话则往下执行init_post(),否则执行prepare_namespace()挂载根文件系统。HiS是直接执行init_post,在init_post中,重要操作是执行init脚本。