2012年5月28日 星期一

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

http://blog.csdn.net/melody_lu123/article/details/6764437


Android內核啟動後會執行初始化初始化,代碼在系統/核心/初始化中。

- 創建為/ dev的/ proc,/ SYS目錄,創建/ dev / PTS的目錄(偽終端)和/ dev /插座的,並分別安裝
- 創建空設備節點,創建kmsg設備節點,初始化log
- 解析init.rc
- 讀取儲存在的/ proc /命令行中的內核啟動參數:
- QEMU
- androidboot.console
- androidboot.mode
- 工廠
- 工廠
- androidboot.serialno
- androidboot.baseband
- androidboot.carrier
- androidboot.bootloader
- androidboot.hardware

- 讀取硬件信息,如果命令行中沒有指出則到:/ PROC / cupinfo的中找
- 解析/ init的“硬件信息”RC
- 早期初始化
- 設備初始化,冷啟動/ sys / class中
- 初始化屬性,從/ default.prop中讀取屬性。
- 如果ro.debuggable為1,則初始化組合鍵(keychord)監聽
- 打開控制台,如果命令行中沒有指定控制台則打開界面風格默認的的/ dev /控制台
- 讀取/initlogo.rle,是一張565 rle壓縮的位圖,如果成功則在/dev/fb0顯示Logo,如果失敗則將/dev/tty0設為TEXT模式並打開/dev/tty0,輸出文本的ANDROID字樣。
- 判斷cmdline 中的參數:
- 如果使用bootmode為
- 工廠,設置ro.factorytest值為1
- factory2,設置ro.factorytest值為2
- 其他的設ro.factorytest值為0
- 如果有serialno則設置ro.serialno,否則為“”
- 如果有bootmod則設置ro.bootmod,否則為“未知”
- 如果有基帶則設置ro.baseband,否則為“未知”
- 如果有運營商則設定ro.carrier,否則為“未知”
- 如果有引導程序則設置ro.bootloader,否則為“未知”
- 設置ro.hardware
- 設置ro.version

- 行動執行所有權的跡象觸發初始化
-開始property服務,讀取一些property文件,這一動作必須在前面那些ro.foo設置後做,以便/data/local.prop不能干預到他們。
- /系統/ build.prop的
- /系統/ default.prop的
- /數據/ local.prop的
- 在讀取界面風格默認的屬性後讀取presistent性質的,在/數據/屬性中

- 為SIGCHLD處理器建立信號機制
- 確認所有權完成了第一次啟動工作
- device_fd(設備初始化完成)
- property_set_fd(財產服務器啟動完成)
- signal_recv_fd(信號機制建立)

- 執行所有觸發標識為早期啟動的行動
- 行動引導標籤執行所有權觸發
- 基於當前屬性狀態,執行所有觸發標識為財產的行動
- 註冊輪詢事件:
- 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

沒有留言:

張貼留言