1. 程式人生 > >Linux核心初始化步驟(七)

Linux核心初始化步驟(七)

到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.");
}