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程序,由該程序負責加載驅動程序和掛載磁盤文件系統以及其他的初始化工作。