rootfs源码调用过程:
init/main.c-> start_kernel()->vfs_caches_init(totalram_pages)--> mnt_init()--> /** *sysfs用来记录和展示linux驱动模型,sysfs先于rootfs挂载是为全面展示linux驱动模型做好准备。 *mnt_init()调用sysfs_init()注册并挂载sysfs文件系统,然后调用kobject_create_and_add()创建"fs"目录。 **/ sysfs_init(); /**init_rootfs()注册rootfs,然后调用init_mount_tree()挂载rootfs。**/ init_rootfs(); init_mount_tree();
1、sysfs文件系统目前还没有挂载到rootfs的某个挂载点上,后续init程序会把sysfs挂载到rootfs的sys挂载点上;
2、rootfs是基于内存的文件系统,所有操作都在内存中完成;也没有实际的存储设备,所以不需要设备驱动程序的参与。基于以上原因,linux在启动阶段使用rootfs文件系统,当磁盘驱动程序和磁盘文件系统成功加载后,linux系统会将系统根目录从rootfs切换到磁盘文件系统。
前面只是注册和挂载上了rootfs,rootfs这颗大树是如何丰富起来的呢?
init/main.c-> start_kernel()-> rest_init()--> kernel_init-> do_basic_setup()-> do_initcalls() //这里会根据优先级,加载initcall
rootfs_initcall(populate_rootfs) --> populate_rootfs函数加载:initrd。
initrd文件系统提供了init程序,在linux初始化阶段的后期会跳转到init程序,由该程序负责加载驱动程序和挂载磁盘文件系统以及其他的初始化工作。