zoukankan      html  css  js  c++  java
  • Android 啟動流程: Init.c 閱讀筆記

    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
  • 相关阅读:
    vue数据传递--我有特殊的实现技巧
    解决Vue引入百度地图JSSDK:BMap is undefined 问题
    vue-quill-editor-upload : 实现vue-quill-editor上传图片到服务器
    vue.js的<slot>
    实例化vue发生了什么?(详解vue生命周期)
    vue2实现自定义样式radio单选框
    vue-lazyload插件
    Axios 使用时遇到的问题
    Vue组件开发 -- Markdown
    Javascript系列——对象元素的数组去重实现
  • 原文地址:https://www.cnblogs.com/cnhome/p/1664057.html
Copyright © 2011-2022 走看看