成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

51CTO專家專欄 李洋談Android系統啟動過程剖析

原創
移動開發 Android
本文為51CTO移動開發頻道邀請安全專家李洋撰寫的專家專欄的第三篇文章。在前文中李洋為我們講述了《Android安全框架》和《Android系統及程序授權機制》,在本文中李洋將向我們介紹《Android系統啟動過程剖析》。

【51CTO獨家特稿】李洋老師在前文中向我們介紹了“Android安全框架”和“Android系統及程序授權機制”。李洋老師將繼續介紹Android系統架構的介紹——《Android系統啟動過程剖析》。

1. 系統啟動流程簡介

在Linux內核啟動后,init 1(1號進程)將作為第一個用戶空間(Linux虛擬內存的大小為232(在32位的x86機器上),內核將這4G字節的空間分為兩部分。最高的1G字節供內核使用,稱為“內核空間”。而較低的3G字節供各個進程使用,稱為“用戶空間”。)的進程來啟動Android系統,該啟動流程可以分為如下5個階段,如下圖:

Android啟動流程可以分為如下5個階段

點擊查看大圖

(1) 啟動準備:該階段包括創建文件系統的基本目錄、打開基本輸入、輸出設備,初始化日志功能等;

(2) 解析init.rc文件:該階段對init.rc腳本文件進行解析,主要對Service(服務)和Action(動作)進行解析。其中,Service由命令(Command)和一系列服務的附加內容(Option,選項)組成,如:“service vold /system/bin/vold”為一個Service,而“socket vold stream 0660 root mount“則為配合該服務使用的Option;Action則由一系列的命令組成,如:“on init mkdir /system”為系統初始化時建立系統文件夾的Action;

(3) 觸發需要執行的action:Action需要在Triggers(觸發條件)中調用,本階段對需要執行的Action進行觸發,并根據觸發條件將需要執行的Action放入Action隊列;

(4) 執行在action隊列中的命令:對上一階段觸發的Action以及Service進行執行。并在此過程中,派生了Zygote和Service Manager兩個非常重要的進程;

(5) 循環處理事件:init進程進入無限循環,處理設備插入/拔出,服務屬性狀態變化和signal事件等。

2. 源碼分析結果

對android-2.3.3_r1版本中的如下源碼文件進行分析:

(1) init.c:路徑為system/core/init/init.c

(2) init_parser.c:路徑為system/core/init/ init_parser.c

(3) builtins.c:路徑為system/core/init/ builtins.c

(4) property_service.c:路徑為system/core/init/property_service.c

(5) keycords.c:路徑為system/core/init/keycords.c

(6) signal_handler.c:路徑為system/core/init/signal_handler.c

總結得出系統啟動流程對應的源代碼文件及函數如下(注:以下函數間的順序執行關系使用“>”表示;函數間的調用執行關系使用“à”表示)

2.1 第一階段(啟動準備)

具體的函數執行過程如下:

 mkdir > mount > open_devnull_stdio > log_init

2.2 第二階段(解析init.rc文件)

具體的函數調用過程如下:

 init_parse_config_fileàparse_configà parse_new_sectionàparse_service (或者parse_action)-> parse_line_service(或者parce_line_action)

2.3 第三階段(觸發需要執行的action)

具體的調用過程如下:

 action_for_each_trigger("boot", action_add_queue_tail);à action_add_queue_tail ( class_start default) à action_remove_queue_head à do_class_start

2.4 第四階段(執行在action隊列中的命令)

具體的調用過程如下:

 execute_one_commandà action_remove_queue_head àdo_class_start àservice_for_each_classà service_start_if_not_disabledà service_start

2.5 第五階段(循環處理)

具體的循環處理過程如下:

  1. for (; ;) { 
  2. poll > handle_property_set_fd > handle_keychord > handle_signal 

2.6 主要函數介紹

函數名 所在文件 功能概述
main system/core/init/init.c 1號進程init的入口函數。主要分析init.rc配置文件,執行基本的action和啟動必備的native service,然后進入一個infinite loop 處理來自property, signal的event 
mkdir system/core/init/init.c 建立文件系統的基本目錄
mount system/core/init/init.c 裝載文件系統
open_devnull_stdio system/core/init/init.c 打開基本輸入、輸出設備
log_init system/core/init/init.c 初始化日志功能
init_parse_config_file system/core/init/ init_parser.c 讀取init.rc文件內容到內存數據區
parse_config system/core/init/ init_parser.c 識別init.rc文件中的 Section(service and action series )和Text
parse_new_section system/core/init/ init_parser.c 識別section類別
parse_service system/core/init/ init_parser.c 對service section第一行進行分析
parse_line_service system/core/init/ init_parser.c 對service section的option選項進行分析
parse_action system/core/init/ init_parser.c 對action section第一行進行分析
parse_line_action system/core/init/ init_parser.c 對action section的每一行獨立的命令進行分析
action_for_each_trigger system/core/init/ init_parser.c 觸發某個action的執行 
action_add_queue_tail system/core/init/ init_parser.c 將某個action的從action_list加到action_queue
execute_one_command system/core/init/init.c 執行當前action的一個command
action_remove_queue_head system/core/init/ init_parser.c 從action_queue鏈表上移除頭結點(action)
do_class_start system/core/init/ builtins.c class_start default對應的入口函數,主要用于啟動native service
service_for_each_class system/core/init/ init_parser.c 遍歷service_list鏈表上的所有結點
service_start_if_not_disabled system/core/init/ builtins.c 判斷service的flag是否disabled,如果不是,則調用相關函數,準備啟動service
service_start system/core/init/init.c 啟動service的主要入口函數,設置service數據結構的相關數據結構后,調用fork創建一個新的進行,然后調用execve執行新的service
fork Lib function(ulibc) 進程創建函數
execve Lib function(ulibc) 調用執行新的service
poll Lib function(ulibc) 查詢property_set_fd,signal_fd和keychord_fd文件句柄是否有服務請求
handle_property_set_fd system/core/init/property_service.c 處理系統屬性服務請求,如:service, wlan和dhcp等等
handle_keychord system/core/init/keycords.c 處理注冊在service structure上的keychord,通常是啟動service
handle_signal system/core/init/signal_handler.c 處理SIGCHLD signal

 

 【編輯推薦】

 

責任編輯:佚名 來源: 51CTO.com
相關推薦

2011-08-01 13:35:08

Android安全框架權限

2011-08-12 09:06:48

Android系統應用程序

2011-09-06 13:56:43

李洋iOS安全機制

2011-08-29 13:52:15

李洋Android應用

2011-11-03 09:24:57

李洋簽名

2011-09-15 08:58:41

Android短信丟失技術原因

2012-07-16 10:21:48

Android進程線程

2009-12-03 10:00:46

Linux系統啟動

2010-08-26 08:57:04

AndroidAndroid開發

2010-01-19 11:21:20

51CTO駐站專家

2010-05-06 14:05:15

Unix系統

2018-03-13 13:00:03

Linux運維啟動分析

2012-08-27 09:52:48

Android沙箱模型

2018-10-18 14:06:15

Linux系統過程

2011-09-22 09:51:41

2016-08-23 18:15:26

2012-07-23 13:22:42

Intent Filt安全Android

2009-08-11 09:03:45

Windows 7系統啟動

2025-06-18 09:01:27

Linux系統啟動系統

2012-02-13 12:47:41

Android 4.0Launcher源碼分析
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美在线 | 婷婷久久五月天 | 久久99国产精一区二区三区 | 五月婷婷丁香 | 欧美a区 | 久久久久亚洲精品 | 国产精品亚洲一区 | 色.com| 国产99久久久国产精品 | 亚洲看片网站 | 亚洲综合无码一区二区 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 伊人伊成久久人综合网站 | 在线播放一区二区三区 | 在线免费看黄 | 久久精品91久久久久久再现 | 91成人在线 | av在线免费网| 热re99久久精品国产99热 | 中文字幕人成乱码在线观看 | 我我色综合 | 亚洲精品久久久久久久久久久久久 | 免费一看一级毛片 | 日韩高清一区 | 成人av网站在线观看 | 拍拍无遮挡人做人爱视频免费观看 | 亚洲激情一级片 | 欧美精品一区二区三区四区 在线 | 亚洲免费网站 | 国产精品久久久久久吹潮日韩动画 | 国产一级毛片视频 | 欧美午夜精品理论片a级按摩 | 成人免费一级视频 | 午夜三级视频 | www.日韩| 色五月激情五月 | 国产一级在线观看 | 99精品免费视频 | 激情一区二区三区 | 天天综合日日夜夜 | 亚州精品天堂中文字幕 |