1. 前言
本专题文章承接之前《kernel启动流程_head.S的执行》专题文章,我们知道在head.S执行过程中保存了bootloader传递的启动参数、启动模式以及FDT地址等,创建了内核空间的页表,最后为init进程初始化好了堆栈,并跳转到start_kernel执行。
在《kernel启动流程-start_kernel的执行_7.arch_call_rest_init》中提到kernel_init->do_basic_setup->do_initcalls会遍历执行所有的init函数,这其中会执行populate_rootfs函数,populate_rootfs会将initrd释放到rootfs的“/”目录,本文重点介绍start_kernel的cpio initrd解包的主要流程.
kernel版本:5.10
平台:arm64
2. rootfs挂载
rest_init
\--kernel_thread(kernel_init, NULL, CLONE_FS);
|--kernel_init
| |--kernel_init_freeable
| | |--do_basic_setup
| | | |--populate_rootfs
| | | | //情形1,通过释放根文件系统到kernel rootfs根目录/
| | | |--unpack_to_rootfs(__initramfs_start, __initramfs_size);
| | | |--if (!initrd_start || IS_ENABLED(CONFIG_INITRAMFS_FORCE)) goto done
| | | | //情形2,通过dts传递的内存地址释放根文件系统到kernel rootfs根目录/
| | | |--unpack_to_rootfs((char *)initrd_start, initrd_end -</

本文承接之前文章,聚焦kernel启动时cpio initrd解包主要流程。介绍了rootfs挂载的三种方式,以与内核打包的initramfs为例说明populate_rootfs将initrd释放到rootfs的过程,包括文件处理的多种状态,还以GotName为例说明释放过程。
最低0.47元/天 解锁文章
1085

被折叠的 条评论
为什么被折叠?



