init進程

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和屬性服務一般都是設置相關環境變量。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章