Android init初始化程式分析

來源:互聯網
上載者:User

/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通訊,如何自動創立裝置節點。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.