Linux核心初始化步驟(七)
阿新 • • 發佈:2018-12-01
到init_post函式為止,核心的初始化已經基本結束,接著會產生使用者程序
/* This is a non __init function. Force it to be noinline otherwise gcc * makes it inline to init() and it becomes part of init.text section */ static noinline int init_post(void) { /* need to finish all async __init code before freeing the memory */ async_synchronize_full(); /*所有的初始化函式都已經被呼叫,捨棄記憶體的__init_begin至__init_end(包括.init.setup .initcall.init等section之間的資料。所有使用__init標記過的函式和使用__initdata標記過的 資料,在free_initmem函式執行後,都不能使用,它們曾經獲得的記憶體現在可以重新用於 其他目的*/ free_initmem(); mark_rodata_ro(); system_state = SYSTEM_RUNNING; numa_default_policy(); current->signal->flags |= SIGNAL_UNKILLABLE; if (ramdisk_execute_command) { run_init_process(ramdisk_execute_command); printk(KERN_WARNING "Failed to execute %s\n", ramdisk_execute_command); } /* * We try each of these until one succeeds. * * The Bourne shell can be used instead of init if we are * trying to recover a really broken machine. */ if (execute_command) { run_init_process(execute_command); printk(KERN_WARNING "Failed to execute %s. Attempting " "defaults...\n", execute_command); } /*接下來的幾行會在幾個地方查詢init,按照可能性由高到低的順序依次是:/sbin/init, 這個是init標準的位置;/etc/init和/bin/init,兩個可能的位置。如果在這3個地方都沒 有發現init,也就無法到它的同名者了,系統可能就此崩潰。*/ run_init_process("/sbin/init"); run_init_process("/etc/init"); run_init_process("/bin/init"); /*試圖建立一個互動的shell(/bin/sh)來代替,希望root使用者可以修復這種錯誤並重新啟動 機器*/ run_init_process("/bin/sh"); /*由於某些原因,init甚至不能建立shell。當前面所有的情況都失敗時,呼叫panic。這樣 核心就會試圖同步磁碟,確保其狀態一致,如果超過了核心選項中定義的時間,它也可能 會重新啟動機器*/ panic("No init found. Try passing init= option to kernel. " "See Linux Documentation/init.txt for guidance."); }