前文已經介紹完init進程第一階段的初始化,接下來咱們開始講解init進程第二階段初始化過程,首先是屬性的設置。android
如代碼3-10所示,第二階段一開始,即在「/dev」目錄下建立「.booting」文件,以通知其它進程當前正處於啓動過程。ionic
close(open("/dev/.booting", O_WRONLY | O_CREAT | O_CLOEXEC, 0000));
代碼 3-10 建立「/dev/.booting」函數
在Android系統中,屬性是一種特殊的資源,Android系統經過屬性暴露設備和運行時信息,應用程序經過讀寫屬性可以得到相應的信息,以及控制系統的行爲,如代碼3-11所示是屬性的初始化。性能
property_init();[1]
代碼 3-11 main()-屬性內存區域初始化命令行
在Android系統中,全部進程共享系統設置值,爲此提供了一塊屬性內存區域。init進程調用代碼3-12所示的property_init()函數,建立並初始化該內存區域。具體實現是property_init()函數經過調用__system_property_area_init()[2]函數完成。code
首先,__system_property_area_init()函數在頂級目錄下建立 「/dev/__properties__」子目錄,用於保存屬性的上下文文件。然後打開「/property_contexts」[3]文件,遍歷其中的屬性前綴及控制訪問權限的上下文,將它們加載到內存中的鏈表。隨後將鏈表中的每個上下文在「/dev/__properties__」目錄中都建立一個同名的文件,其中保存着受其控制的屬性。最後把「/dev/__properties__」中的上下文文件映射到共享內存中,實現對屬性的權限控制。進程
系統中其它進程經過執行中的進程所提供的API訪問屬性域中的設置值,但更改屬性值僅能在init進程中進行。當修改屬性值時,要預先向init進程提交值變動請求,而後init進程處理該請求,並修改屬性值。內存
代碼3-12將屬性初始化到內存中。資源
process_kernel_dt(); (1) process_kernel_cmdline(); (2) export_kernel_boot_props(); (3)
代碼 3-12 main()-屬性初始化cmd
(1)初始化DT(Device Tree)的屬性集,即訪問「/proc/device-tree/firmware/android 」目錄,先看compatible文件內容是不是「android,firmware」,而後這個目錄下每一個文件名做爲屬性,文件裏面的內容做爲屬性值。
(2)處理內核命令行,讀取「/proc/cmdline」文件中的內容,而後調用import_kernel_nv()函數設置系統屬性,此處只將「/proc/cmdline」中前綴爲「androidboot.」的值設置到屬性中。1中設置的DT屬性集優先級高於此處設置的屬性。
(3)設置內核啓動的變量,根據系統已有的屬性設置,若有值則保持不變,不然設置成初始值。
上述步驟基本就將Android系統所需的屬性初始化好。正如前面咱們介紹的,init進程是其它全部進程的父進程,它須要監視和處理子進程的終止,爲此須要初始化信號處理器,下一篇咱們將介紹這方面的內容。
[1] property_init()函數在system/core/init/property_service.cpp中定義。
[2] __system_property_area_init()函數在bionic/libc/bionic/system_properties.cpp中定義。
[3] property_contexts文件定義在system/sepolicy/property_contexts。