init是在內核啓動後,在用戶空間啓動的第一個用戶級進程init進程。內核在經過start_kernel() ---> init_post() ---->run_init_process() ------>啓動init進程。在內核啓動過程中,需要設置內核啓動選項時,應設置爲"init = /init"。如果不存在該文件或未指定,則在/sbin 、/etc、 /bin目錄中查找init文件。
android啓動init進程,那它做了哪些事情呢?
android的init進程主要提供了四大功能:
一、處理子進程終止
通過註冊信號處理器來處理子進程終止。
static void sigchld_handler(int s){
write(signal_fd,&s,1);
}
(這個可以參考linux中進程間的通信)
二、生成設備驅動節點
通過mkdir()和mount()函數生成並掛載目錄
幾種文件系統:
1.tmpfs 虛擬內存文件系統,典型的tmpfs文件系統完全駐留在RAM中,讀寫速度遠快於閃存或硬盤文件系統。
/dev目錄保存中硬件設備訪問所需要的設備驅動程序。在android中,將相關目錄作tmpfs,可以大幅提升設備訪問速度。
2.devpts是一種虛擬終端文件系統
3.proc是一種虛擬文件系統,只存在於內存中,而不佔用外存空間。藉助此文件系統,應用程序可以與內核內部數據結構進行交互。
4.sysfs文件是一種特殊的文件系統,在linux kernel 2.6中引入,用於將系統中的設備組織成層次結構,並向用戶模式程序提供詳細的內核數據結構信息
將proc、devfs、devpts三種系統統一起來。
生成log設備: open_devnull_stdio(); log_init();
open_devnull_stdio()將標準輸出文件重定向至--null--設備中。這就意味做,無法通過標準輸入輸出查看輸出信息,但log_init()函數,提供了log信息設備,生成/dev/__kmsg__設備文件節點。該節點調用內核信息輸出函數printk()。
#define ERROR(x...) log_write(3,"<3>init:" x)
#define NOTICE(x...) log_write(5,"<5>init:" x)
#define INFO(x...) log_write(6,"<6>init:" x);
init進程通過__kmsg__設備定義用於輸出信息的宏。關於宏輸出信息,可以通過dmesg使用程序進程確定,dmesg用於顯示內核信息。
設備文件生成後,開始解析 init.rc文件
parse_config_file("/init.rc");
三、提供屬性服務
在android平臺中,爲了讓運行中的所有進程共享系統運行時所需要的各種設置值,系統開闢了屬性存儲區域(Android shared Memory)
void property_init(void){
init_property_area();
load_properties_from_file(PROP_PATH_RAMDISK_DEFAULT);
}
並提供API訪問該區域,該區域的屬性由key和value構成。在android平臺中,所有進行中的進程都可以訪問屬性值,但僅有init進程才能修改屬性值。
在訪問或更改屬性值時,使用的函數分別爲property_get()與property_set()
四、保存系統所需的環境變量
init.rc和屬性服務一般都是設置相關環境變量。