日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
51CTO專(zhuān)家專(zhuān)欄李洋談Android系統(tǒng)啟動(dòng)過(guò)程剖析

【獨(dú)家特稿】李洋老師在前文中向我們介紹了“Android安全框架”和“Android系統(tǒng)及程序授權(quán)機(jī)制”。李洋老師將繼續(xù)介紹Android系統(tǒng)架構(gòu)的介紹——《Android系統(tǒng)啟動(dòng)過(guò)程剖析》。

十堰鄖陽(yáng)網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

1. 系統(tǒng)啟動(dòng)流程簡(jiǎn)介

在Linux內(nèi)核啟動(dòng)后,init 1(1號(hào)進(jìn)程)將作為第一個(gè)用戶空間(Linux虛擬內(nèi)存的大小為232(在32位的x86機(jī)器上),內(nèi)核將這4G字節(jié)的空間分為兩部分。最高的1G字節(jié)供內(nèi)核使用,稱(chēng)為“內(nèi)核空間”。而較低的3G字節(jié)供各個(gè)進(jìn)程使用,稱(chēng)為“用戶空間”。)的進(jìn)程來(lái)啟動(dòng)Android系統(tǒng),該啟動(dòng)流程可以分為如下5個(gè)階段,如下圖:

點(diǎn)擊查看大圖

(1) 啟動(dòng)準(zhǔn)備:該階段包括創(chuàng)建文件系統(tǒng)的基本目錄、打開(kāi)基本輸入、輸出設(shè)備,初始化日志功能等;

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

(3) 觸發(fā)需要執(zhí)行的action:Action需要在Triggers(觸發(fā)條件)中調(diào)用,本階段對(duì)需要執(zhí)行的Action進(jìn)行觸發(fā),并根據(jù)觸發(fā)條件將需要執(zhí)行的Action放入Action隊(duì)列;

(4) 執(zhí)行在action隊(duì)列中的命令:對(duì)上一階段觸發(fā)的Action以及Service進(jìn)行執(zhí)行。并在此過(guò)程中,派生了Zygote和Service Manager兩個(gè)非常重要的進(jìn)程;

(5) 循環(huán)處理事件:init進(jìn)程進(jìn)入無(wú)限循環(huán),處理設(shè)備插入/拔出,服務(wù)屬性狀態(tài)變化和signal事件等。

2. 源碼分析結(jié)果

對(duì)android-2.3.3_r1版本中的如下源碼文件進(jìn)行分析:

(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

總結(jié)得出系統(tǒng)啟動(dòng)流程對(duì)應(yīng)的源代碼文件及函數(shù)如下(注:以下函數(shù)間的順序執(zhí)行關(guān)系使用“>”表示;函數(shù)間的調(diào)用執(zhí)行關(guān)系使用“à”表示)

2.1 第一階段(啟動(dòng)準(zhǔn)備)

具體的函數(shù)執(zhí)行過(guò)程如下:

 mkdir > mount > open_devnull_stdio > log_init

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

具體的函數(shù)調(diào)用過(guò)程如下:

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

2.3 第三階段(觸發(fā)需要執(zhí)行的action)

具體的調(diào)用過(guò)程如下:

 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 第四階段(執(zhí)行在action隊(duì)列中的命令)

具體的調(diào)用過(guò)程如下:

 execute_one_commandà action_remove_queue_head àdo_class_start àservice_for_each_classà service_start_if_not_disabledà service_start

2.5 第五階段(循環(huán)處理)

具體的循環(huán)處理過(guò)程如下:

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

2.6 主要函數(shù)介紹

函數(shù)名所在文件功能概述
mainsystem/core/init/init.c1號(hào)進(jìn)程init的入口函數(shù)。主要分析init.rc配置文件,執(zhí)行基本的action和啟動(dòng)必備的native service,然后進(jìn)入一個(gè)infinite loop 處理來(lái)自property, signal的event 
mkdirsystem/core/init/init.c建立文件系統(tǒng)的基本目錄
mountsystem/core/init/init.c裝載文件系統(tǒng)
open_devnull_stdiosystem/core/init/init.c打開(kāi)基本輸入、輸出設(shè)備
log_initsystem/core/init/init.c初始化日志功能
init_parse_config_filesystem/core/init/ init_parser.c讀取init.rc文件內(nèi)容到內(nèi)存數(shù)據(jù)區(qū)
parse_configsystem/core/init/ init_parser.c識(shí)別init.rc文件中的 Section(service and action series )和Text
parse_new_sectionsystem/core/init/ init_parser.c識(shí)別section類(lèi)別
parse_servicesystem/core/init/ init_parser.c對(duì)service section第一行進(jìn)行分析
parse_line_servicesystem/core/init/ init_parser.c對(duì)service section的option選項(xiàng)進(jìn)行分析
parse_actionsystem/core/init/ init_parser.c對(duì)action section第一行進(jìn)行分析
parse_line_actionsystem/core/init/ init_parser.c對(duì)action section的每一行獨(dú)立的命令進(jìn)行分析
action_for_each_triggersystem/core/init/ init_parser.c觸發(fā)某個(gè)action的執(zhí)行 
action_add_queue_tailsystem/core/init/ init_parser.c將某個(gè)action的從action_list加到action_queue
execute_one_commandsystem/core/init/init.c執(zhí)行當(dāng)前action的一個(gè)command
action_remove_queue_headsystem/core/init/ init_parser.c從action_queue鏈表上移除頭結(jié)點(diǎn)(action)
do_class_startsystem/core/init/ builtins.cclass_start default對(duì)應(yīng)的入口函數(shù),主要用于啟動(dòng)native service
service_for_each_classsystem/core/init/ init_parser.c遍歷service_list鏈表上的所有結(jié)點(diǎn)
service_start_if_not_disabledsystem/core/init/ builtins.c判斷service的flag是否disabled,如果不是,則調(diào)用相關(guān)函數(shù),準(zhǔn)備啟動(dòng)service
service_startsystem/core/init/init.c啟動(dòng)service的主要入口函數(shù),設(shè)置service數(shù)據(jù)結(jié)構(gòu)的相關(guān)數(shù)據(jù)結(jié)構(gòu)后,調(diào)用fork創(chuàng)建一個(gè)新的進(jìn)行,然后調(diào)用execve執(zhí)行新的service
forkLib function(ulibc)進(jìn)程創(chuàng)建函數(shù)
execveLib function(ulibc)調(diào)用執(zhí)行新的service
pollLib function(ulibc)查詢property_set_fd,signal_fd和keychord_fd文件句柄是否有服務(wù)請(qǐng)求
handle_property_set_fdsystem/core/init/property_service.c處理系統(tǒng)屬性服務(wù)請(qǐng)求,如:service, wlan和dhcp等等
handle_keychordsystem/core/init/keycords.c處理注冊(cè)在service structure上的keychord,通常是啟動(dòng)service
handle_signalsystem/core/init/signal_handler.c處理SIGCHLD signal

 

 【編輯推薦】

  1. 專(zhuān)家專(zhuān)欄 李洋談Android安全框架
  2. 專(zhuān)家專(zhuān)欄 李洋談Android系統(tǒng)及程序授權(quán)機(jī)制

文章名稱(chēng):51CTO專(zhuān)家專(zhuān)欄李洋談Android系統(tǒng)啟動(dòng)過(guò)程剖析
標(biāo)題URL:http://www.5511xx.com/article/dhosjeo.html