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

    技术2022-05-18  15

    Androidkernel啟動后執行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

    最新回复(0)