1、VFS注冊
default_rootfs()主要往rootfs中生成兩個目錄/dev和/root以及一個設(shè)備文件/dev/console。似乎在rootfs中的init文件必須位于根目錄下,即/init,否則系統(tǒng)會嘗試mount其他的文件系統(tǒng)。
populate_rootfs()如果內(nèi)核支持initrd,但并沒有配置CONFIG-INITRAMFS_SOURCE選項(xiàng)的話,內(nèi)核在編譯的時候會自動生成一個最小的cpio包附在內(nèi)核中,這個自帶的cpio包的內(nèi)容與default_rootfs生成的一樣。
cpio包類型的initrd被填充到rootfs中去,接下來初始化ramdiak_execute_command,這個變量表示在cpio包中被執(zhí)行的第一個程序,可通過在內(nèi)核啟動參數(shù)中給rdinit=賦值來確定。接下來檢查在rootfs中是否存在變量ramdisk_execute_command所指的文件。如果有,就說明cpio包類型的initrd成功加載了,那就不需要內(nèi)核再調(diào)用prepare_namespace()來掛載根文件系統(tǒng),這些都留給cpio包中的ramdisk_execute_command所指的程序去完成。如果沒有,就說明內(nèi)核沒有成功用上cpio包類型的initrd,還需要調(diào)用prepare_namespace()來繼續(xù)準(zhǔn)備加載根文件系統(tǒng),并清空變量ramdisk_execute_command。無論怎樣,內(nèi)核都會繼續(xù)執(zhí)行init_post.
在init_post中調(diào)用run_init_process,會依次執(zhí)行指定的init文件,如果失敗,就會執(zhí)行/sbin/init,/etc/init,,/bin/init,/bin/sh。注意的是,run_init_process在調(diào)用相應(yīng)程序運(yùn)行的時候,用的是kernel_execve。也就是說調(diào)用進(jìn)程會替換當(dāng)前進(jìn)程。只要上述任意一個文件調(diào)用成功,就不會返回到這個函數(shù)。如果上面幾個文件都無法執(zhí)行。打印出沒有找到init文件的錯誤。