/system/core/init初始化程式 1.執行sigaction函數,對SIGCHILD訊號進行處理。實際上暫時屏蔽 2.設定umask來清空後面建立檔案的mask 3. 建立檔案系統mount point & mount 記憶體檔案系統 4. open_devnull_stdio 0 1 2 is the fd. They are all the file descriptor of /dev/__null__ 5.open /dev/__kmsg__ as log fd. 6.parse_config_file 首先開啟/init.rc然後讀出所有的資料到記憶體,然後調用parse_config函數進行分析。將comand,service等放入鏈表中等待處理。 7.import_kernel_cmdline 會從/proc/cmdline中擷取bootargs,然後分析之,並使用import_kernel_nv填充qemu,console,bootmode,serialno,baseband,carrier,bootloader,hardware變數。如果設定了android.ril參數,還要設定對應的permissions,也就是uid,gid。 8.get_hardware_name根據/dev/cpuinfo擷取hardware和rev參數,放到hardware和revision全域變數中 9. 解析init.hardware.rc config檔案,然後執行early init中的action,通過drain_action_queue 10. 執行device_init,首先open_uevent_socket,然後設定socket的屬性。最後對/sys/class、/sys/block、/sys/devices執行coldboot。 11.在向/sys/class等目錄下的uevent檔案寫入”add/n”之後,從uevent的socket接收訊息,並對訊息進行解析,完成對uevent結構的賦值。然後根據uevent以及在全域devperms預定義的許可權建立各個dev下的目錄和裝置節點 12.初始化__system_property_area__(開啟ashmem裝置,申請記憶體,並將之初始化為prop_area結構) 13.執行property_init,讀取buid.prop,然後將之設定到property中 14.根據build.prop中設定過的ro.debuggerable,確定是否open_keychord 15. 開啟console,如果console數組設定過,會使用console數組的設定,如果沒有,預設會使用/dev/console作為console。如果有console裝置,have_console變數為1 16.設定一些property,比如ro.serialno,ro.bootmode,ro.baseband,ro.carrier,ro.bootloader,ro.hardware,ro.revision 17. 執行init.rc和init.hardware.rc裡的init組 18.從/system/build.prop、system/default.prop、data/local.prop中讀取property並設定,讀取property讀取data/propery下的各個persist值,根據檔案名稱和內容設定property 19.建立property_service socket並進行監聽 20.建立配對的socket 21.確保uevent的socket fd、property_service的fd,signal_receive的fd全部有效 22. run all property triggers based on current state of the properties 23.建立並開啟以下log檔案。 #define LOG_ROOT "/data/bootchart" #define LOG_STAT LOG_ROOT"/proc_stat.log" #define LOG_PROCS LOG_ROOT"/proc_ps.log" #define LOG_DISK LOG_ROOT"/proc_diskstats.log" 24.調用acct函數,記錄核心每次進程的terminate訊息。寫入LOG_ROOT"/kernel_pacct" 25.將/proc/cmdline、/proc/version、/proc/cpuinfo寫入LOG_ROOT"/header"。Bootchart會根據#define LOG_STARTFILE "/data/bootchart-start"設定的時間進行記錄 26.進入死迴圈,在內部對前面提到的幾個fd進行poll操作,並在poll成功之後,handle_device_fd或handle_property_set_fd或handle_keychord 從以上分析中可以看出需要注意的幾個事項,比如permissions,還可以根據data/bootchard下的幾個log檔案分析log資訊。還可以知道untracket pid的原因。幾個prop檔案的載入順序,如何讓系統從ramdisk啟動並且載入loop裝置。rc檔案的更多選項。socket通訊,如何自動創立裝置節點。 |