Android 啟動流程: Init.c 閱讀筆記

來源:互聯網
上載者:User
Android kernel 啟動後會執行Init初始化,代碼在 system/core/init 中。- 創建 /dev、/proc、/sys 目錄,創建/dev/pts目錄(偽終端)和/dev/socket,並分別mount- 創建空設備節點,創建kmsg設備節點,初始化log- 解析init.rc- 讀取儲存在/proc/cmdline中的kernel啟動參數:    - qemu    - androidboot.console    - androidboot.mode       - factory       - factory2    - androidboot.serialno    - androidboot.baseband    - androidboot.carrier    - androidboot.bootloader    - androidboot.hardware- 讀取hardware資訊,如果cmdline中沒有指出則到/proc/cupinfo中找- 解析/init.「hardware資訊」.rc- early-init- 設備初始化,coldboot /sys/class /sys/block /sys/devices,將這些目錄下的uevent檔案找出,並使kernel重建那些在init的設備管理器開始前的設備添加事件。- 初始化property,從/default.prop中讀取property。- 如果ro.debuggable為1,則初始化組合鍵(keychord)監聽- 打開console,如果cmdline中沒有指定console則打開默認的/dev/console- 讀取/initlogo.rle,是一張565 rle 壓縮的位圖,如果成功則在/dev/fb0顯示Logo,如果失敗則將/dev/tty0設為TEXT模式並打開/dev/tty0,輸出文本的ANDROID字樣。- 判斷cmdline 中的參數:  - 如果 bootmode為     - factory,設置ro.factorytest值為1     - factory2,設置ro.factorytest值為2     - 其他的設ro.factorytest值為0  - 如果有serialno則設置ro.serialno,否則為""  - 如果有bootmod則設置ro.bootmod,否則為"unknown"  - 如果有baseband則設置ro.baseband,否則為"unknown"  - 如果有carrier則設置ro.carrier,否則為"unknown"  - 如果有bootloader則設置ro.bootloader,否則為"unknown"  - 設置ro.hardware  - 設置ro.version- 執行所有觸發標識為init的action- 開始property服務,讀取一些property檔案,這一動作必須在前面那些ro.foo設置後做,以便/data/local.prop不能幹預到他們。  - /system/build.prop  - /system/default.prop  - /data/local.prop  - 在讀取默認的property後讀取presistent propertie,在/data/property中- 為sigchld handler創建信號機制- 確認所有初始化工作完成  - device_fd(device init 完成)  - property_set_fd(property server start 完成)  - signal_recv_fd (信號機制建立)- 執行所有觸發標識為early-boot的action- 執行所有觸發標識為boot的action- 基於當前property狀態,執行所有觸發標識為property的action- 註冊輪詢事件:  - device_fd  - property_set_fd  -signal_recv_fd  -如果有keychord,則註冊keychord_fd- 如果支援BOOTCHART,則初始化BOOTCHART- 進入主進程循環:  - 重設輪詢事件的接受狀態,revents為0  - 查詢action隊列  - 重啟需要重啟的進程  - 輪詢註冊的事件    - 如果signal_recv_fd的revents為POLLIN,則得到一個信號,獲取並處理    - 如果device_fd的revents為POLLIN,呼叫handle_device_fd    - 如果property_fd的revents為POLLIN,呼叫handle_property_set_fd    - 如果keychord_fd的revents為POLLIN,呼叫handle_keychord

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.