日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解Android系統(tǒng)啟動(dòng)過(guò)程

瀏覽:50日期:2022-09-20 09:39:28
計(jì)算機(jī)是如何啟動(dòng)的

計(jì)算機(jī)的硬件包括:CPU,內(nèi)存,硬盤,顯卡,顯示器,鍵盤鼠標(biāo)等輸入輸出設(shè)備。所有的軟件都是存放在硬盤中,程序執(zhí)行時(shí),需要將程序從硬盤上讀取到內(nèi)存中,然后加載到CPU中來(lái)運(yùn)行。當(dāng)按下開(kāi)機(jī)鍵時(shí),內(nèi)存中什么都沒(méi)有,因此需要借助某種方式,將操作系統(tǒng)加載到內(nèi)存中,而完成這項(xiàng)任務(wù)的就是BIOS。

引導(dǎo)階段

BIOS:BIOS是主板芯片上的一個(gè)程序,計(jì)算機(jī)通電后,第一件事情就是讀取BIOS。

BIOS首先進(jìn)行硬件檢測(cè),檢查計(jì)算機(jī)硬件能否滿足運(yùn)行的基本條件。如果硬件出現(xiàn)問(wèn)題,主板發(fā)出不同的蜂鳴聲,啟動(dòng)停止。如果沒(méi)有問(wèn)題,屏幕會(huì)顯示CPU,內(nèi)存,硬盤等信息。

硬件自檢完成后,BIOS將控制權(quán)交給下一個(gè)階段的啟動(dòng)程序。這時(shí)候BIOS需要知道下一個(gè)啟動(dòng)程序存放在哪個(gè)設(shè)備中。也就是BIOS需要一個(gè)外部存儲(chǔ)設(shè)備的排序。優(yōu)先交給排在前面的設(shè)備。這就是我們?cè)贐IOS中設(shè)置的啟動(dòng)排序。

當(dāng)?shù)谝粋€(gè)存儲(chǔ)設(shè)備被激活后,設(shè)備讀取設(shè)備的第一個(gè)扇區(qū),也就是前512字節(jié)。如果這512個(gè)字節(jié)的最后兩個(gè)字節(jié)是0x55和0xAA,表明設(shè)備是可以用作系統(tǒng)啟動(dòng)的。如果不是,那么就會(huì)順序啟動(dòng)下一個(gè)設(shè)備。

這前512個(gè)字節(jié),就叫做“主引導(dǎo)記錄”(縮寫MBR)。它負(fù)責(zé)磁盤操作系統(tǒng)對(duì)硬盤進(jìn)行讀寫時(shí)分區(qū)合法型判斷、分區(qū)引導(dǎo)信息定位。MBR不屬于任何一個(gè)CIA做系統(tǒng),它先于操作系統(tǒng)而被調(diào)入內(nèi)存,并發(fā)揮作用。然后才將控制權(quán)交給主分區(qū)內(nèi)的操作系統(tǒng),并用主分區(qū)信息來(lái)管理硬盤。

MBR主要作用是告訴計(jì)算機(jī)到硬盤的哪個(gè)位置去找操作系統(tǒng)。計(jì)算機(jī)從MBR中讀取前446字節(jié)的機(jī)器碼后,不再轉(zhuǎn)交控制權(quán),而是運(yùn)行實(shí)現(xiàn)安裝的“啟動(dòng)管理器”(boot loader),由用戶選擇啟動(dòng)哪個(gè)操作系統(tǒng)。

加載內(nèi)核階段

選擇完操作系統(tǒng)以后,控制權(quán)交給操作系統(tǒng),操作系統(tǒng)內(nèi)核被載入內(nèi)存。

以Linux為例,先載入/boot下面的kernel。內(nèi)核加載完成后,運(yùn)行第一個(gè)程序 /sbin/init。它根據(jù)配置文件產(chǎn)生init進(jìn)程。它是Linux啟動(dòng)后的第一個(gè)進(jìn)程,pid為1.其他進(jìn)程都是它的后代。

然后init線程加載系統(tǒng)的各個(gè)模塊。比如:窗口程序和網(wǎng)絡(luò)程序,直至執(zhí)行/bin/login程序執(zhí)行,跳出登錄頁(yè)面,等待用戶輸入用戶名密碼。

至此,系統(tǒng)啟動(dòng)完成。

Android的啟動(dòng)過(guò)程

Android是基于Linux系統(tǒng)的。但是 它沒(méi)有BIOS程序,取而代之的是BootLoader(系統(tǒng)啟動(dòng)加載器)。類似于BIOS,在系統(tǒng)加載前,用于初始化硬件設(shè)備,最終調(diào)用系統(tǒng)內(nèi)核準(zhǔn)備好環(huán)境。在Android中沒(méi)有硬盤,而是ROM,類似于硬盤存放操作系統(tǒng),用戶程序等。ROM跟硬盤一樣也會(huì)劃分為不同的區(qū)域,用于放置不同的程序,在Android中主要?jiǎng)澐譃橐韵聨讉€(gè)區(qū)域:

/boot :存放引導(dǎo)程序,包括內(nèi)核和內(nèi)存操作程序/system:相當(dāng)于電腦C盤,存放Android系統(tǒng)和系統(tǒng)應(yīng)用/recover:回復(fù)分區(qū)。可以進(jìn)入該分區(qū)進(jìn)行系統(tǒng)回復(fù)/data:用戶數(shù)據(jù)區(qū),包含了用戶的數(shù)據(jù):聯(lián)系人、短信、設(shè)置、用戶安裝的程序/cache:安卓系統(tǒng)緩存區(qū),保存系統(tǒng)經(jīng)常訪問(wèn)的數(shù)據(jù)和應(yīng)用程序/misc:雜項(xiàng)內(nèi)容/sdcard:用戶自己的存儲(chǔ)區(qū)域。存放照片視頻等Android系統(tǒng)啟動(dòng)跟PC相似。當(dāng)開(kāi)機(jī)時(shí),首先加載BootLoader,BootLoader會(huì)讀取ROM找到系統(tǒng)并將內(nèi)核加載進(jìn)RAM中。

當(dāng)內(nèi)核啟動(dòng)后會(huì)初始化各種軟硬件環(huán)境,加載驅(qū)動(dòng)程序,掛載跟文件系統(tǒng)。最后階段會(huì)啟動(dòng)執(zhí)行第一個(gè)用戶空間進(jìn)程init進(jìn)程。

init進(jìn)程

init是用戶的第一個(gè)進(jìn)程,pid=1。kernal啟動(dòng)后會(huì)調(diào)用/system/core/init/init.cpp的main()方法。

int main(int argc,char ** argv){ ... if(is_first_stage){ //創(chuàng)建和掛在啟動(dòng)所需要的文件目錄 mount('tmpfs','/dev','tmpfs',MS_NOSUID,'mode=0755'); mkdir('/dev/pts',0755); //創(chuàng)建和掛在很多... ... } ... //對(duì)屬性服務(wù)進(jìn)行初始化 property_init(); ... //用于設(shè)置子進(jìn)程信號(hào)處理函數(shù)(如Zygote),如果子進(jìn)程異常退出,init進(jìn)程會(huì)調(diào)用該函數(shù)中設(shè)定的信號(hào)處理函數(shù)來(lái)處理 signal_handler_init(); ... //啟動(dòng)屬性服務(wù) start_property_service(); ... //解析init.rc配置文件 parser.ParseConfig('/init.rc');}

首先初始化 Kernel log,創(chuàng)建一塊共享的內(nèi)存空間,加載 /default.prop 文件,解析 init.rc 文件。

init.rc 文件

init.rc 文件是 Android 系統(tǒng)的重要配置文件,位于 /system/core/rootdir/ 目錄中。 主要功能是定義了系統(tǒng)啟動(dòng)時(shí)需要執(zhí)行的一系列 action 及執(zhí)行特定動(dòng)作、設(shè)置環(huán)境變量和屬性和執(zhí)行特定的 service。

init.rc 腳本文件配置了一些重要的服務(wù),init 進(jìn)程通過(guò)創(chuàng)建子進(jìn)程啟動(dòng)這些服務(wù),這里創(chuàng)建的 service 都屬于 native 服務(wù),運(yùn)行在 Linux 空間,通過(guò) socket 向上層提供特定的服務(wù),并以守護(hù)進(jìn)程的方式運(yùn)行在后臺(tái)。

通過(guò) init.rc 腳本系統(tǒng)啟動(dòng)了以下幾個(gè)重要的服務(wù):

service_manager:?jiǎn)?dòng) binder IPC,管理所有的 Android 系統(tǒng)服務(wù) mountd:設(shè)備安裝 Daemon,負(fù)責(zé)設(shè)備安裝及狀態(tài)通知 debuggerd:?jiǎn)?dòng) debug system,處理調(diào)試進(jìn)程的請(qǐng)求 rild:?jiǎn)?dòng) radio interface layer daemon 服務(wù),處理電話相關(guān)的事件和請(qǐng)求 media_server:?jiǎn)?dòng) AudioFlinger,MediaPlayerService 和 CameraService,負(fù)責(zé)多媒體播放相關(guān)的功能,包括音視頻解碼 surface_flinger:?jiǎn)?dòng) SurfaceFlinger 負(fù)責(zé)顯示輸出 zygote:進(jìn)程孵化器,啟動(dòng) Android Java VMRuntime 和啟動(dòng) systemserver,負(fù)責(zé) Android 應(yīng)用進(jìn)程的孵化工作 在這個(gè)階段你可以在設(shè)備的屏幕上看到 “Android” logo 了。

以上工作執(zhí)行完,init 進(jìn)程就會(huì)進(jìn)入 loop 狀態(tài)。

service_manager 進(jìn)程

ServiceManager 是 Binder IPC 通信過(guò)程中的守護(hù)進(jìn)程,本身也是一個(gè) Binder 服務(wù)。ServiceManager 進(jìn)程主要是啟動(dòng) Binder,提供服務(wù)的查詢和注冊(cè)。

surface_flinger 進(jìn)程

SurfaceFlinger 負(fù)責(zé)圖像繪制,是應(yīng)用 UI 的和興,其功能是合成所有 Surface 并渲染到顯示設(shè)備。SurfaceFlinger 進(jìn)程主要是啟動(dòng) FrameBuffer,初始化顯示系統(tǒng)。

media_server 進(jìn)程

MediaServer 進(jìn)程主要是啟動(dòng) AudioFlinger 音頻服務(wù),CameraService 相機(jī)服務(wù)。負(fù)責(zé)處理音頻解析播放,相機(jī)相關(guān)的處理。

Zygote 進(jìn)程

zygote有兩個(gè)作用:?jiǎn)?dòng)systemService和孵化應(yīng)用進(jìn)程。

Zygote 進(jìn)程孵化了所有的 Android 應(yīng)用進(jìn)程,是 Android Framework 的基礎(chǔ),該進(jìn)程的啟動(dòng)也標(biāo)志著 Framework 框架初始化啟動(dòng)的開(kāi)始。

Zygote啟動(dòng)主要調(diào)用app_main.cpp的main()中的AppRuntime的start方法來(lái)啟動(dòng)Zygote進(jìn)程

int main(int argc,char* const argv[]){ while( i < argc ){ const char* arg=argv[i++]; if(strcmp(arg,'--zygote')==0){ //如果當(dāng)前進(jìn)程在Zygote中,則設(shè)置zygote=true zygote=true; niceName=ZYGOTE_NICE_NAME; }else if(strcmp(arg,'--start-system-server')==0){ //如果當(dāng)前進(jìn)程在SystemServer中,將startSystemServer=true startSystemServer=true; } } //承接上面Init進(jìn)程中的代碼 if(zygote){ //啟動(dòng)Zygote進(jìn)程 runtime.start('com.android.internal.os.ZygoteInit',args,zygote); }}

Zygote 服務(wù)進(jìn)程的主要功能:

注冊(cè)底層功能的 JNI 函數(shù)到虛擬機(jī) 預(yù)加載 Java 類和資源 fork 并啟動(dòng) system_server 核心進(jìn)程 作為守護(hù)進(jìn)程監(jiān)聽(tīng)處理“孵化新進(jìn)程”的請(qǐng)求

當(dāng) Zygote 進(jìn)程啟動(dòng)后, 便會(huì)執(zhí)行到 frameworks/base/cmds/app_process/App_main.cpp 文件的 main() 方法。

system_server 進(jìn)程

system_server 進(jìn)程 由 Zygote 進(jìn)程 fork 而來(lái)。

//首先會(huì)調(diào)用 ZygoteInit.startSystemServer() 方法ZygoteInit.startSystemServer() //fork 子進(jìn)程 system_server,進(jìn)入 system_server 進(jìn)程。ZygoteInit.handleSystemServerProcess() //設(shè)置當(dāng)前進(jìn)程名為“system_server”,創(chuàng)建 PathClassLoader 類加載器。RuntimeInit.zygoteInit() //重定向 log 輸出,通用的初始化(設(shè)置默認(rèn)異常捕捉方法,時(shí)區(qū)等),初始化 Zygote -> nativeZygoteInit()。nativeZygoteInit() //方法經(jīng)過(guò)層層調(diào)用,會(huì)進(jìn)入 app_main.cpp 中的 onZygoteInit() 方法。app_main::onZygoteInit()// 啟動(dòng)新 Binder 線程。applicationInit() //方法經(jīng)過(guò)層層調(diào)用,會(huì)拋出異常 ZygoteInit.MethodAndArgsCaller(m, argv), ZygoteInit.main() 會(huì)捕捉該異常。ZygoteInit.main() //開(kāi)啟 DDMS 功能,preload() 加載資源,預(yù)加載 OpenGL,調(diào)用 SystemServer.main() 方法。SystemServer.main() //先初始化 SystemServer 對(duì)象,再調(diào)用對(duì)象的 run() 方法。SystemServer.run() //準(zhǔn)備主線程 looper,加載 android_servers.so 庫(kù),該庫(kù)包含的源碼在 frameworks/base/services/ 目錄下。

system_server 進(jìn)程啟動(dòng)后將初始化系統(tǒng)上下文(設(shè)置主題),創(chuàng)建系統(tǒng)服務(wù)管理 SystemServiceManager,然后啟動(dòng)各種系統(tǒng)服務(wù)

startBootstrapServices(); // 啟動(dòng)引導(dǎo)服務(wù)//該方法主要啟動(dòng)服務(wù) ActivityManagerService,PowerManagerService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService。//設(shè)置 ActivityManagerService,啟動(dòng)傳感器服務(wù)。startCoreServices(); // 啟動(dòng)核心服務(wù)//該方法主要//啟動(dòng)服務(wù) BatteryService 用于統(tǒng)計(jì)電池電量,需要 LightService。//啟動(dòng)服務(wù) UsageStatsService,用于統(tǒng)計(jì)應(yīng)用使用情況。//啟動(dòng)服務(wù) WebViewUpdateService。startOtherServices(); // 啟動(dòng)其他服務(wù)//該方法主要啟動(dòng)服務(wù) InputManagerService,WindowManagerService。//等待 ServiceManager,SurfaceFlinger啟動(dòng)完成,然后顯示啟動(dòng)界面。//啟動(dòng)服務(wù) StatusBarManagerService,//準(zhǔn)備好 window, power, package, display 服務(wù)://- WindowManagerService.systemReady()//- PowerManagerService.systemReady()//- PackageManagerService.systemReady()//- DisplayManagerService.systemReady()

所有的服務(wù)啟動(dòng)后會(huì)注冊(cè)到ServiceManager。

ActivityManagerService 服務(wù)啟動(dòng)完成后,會(huì)進(jìn)入 ActivityManagerService.systemReady(),然后啟動(dòng) SystemUI,WebViewFactory,Watchdog,最后啟動(dòng)桌面 Launcher App。

最后會(huì)進(jìn)入循環(huán) Looper.loop()。

ActivityManagerService 啟動(dòng)

啟動(dòng)桌面 Launcher App 需要等待 ActivityManagerService 啟動(dòng)完成。我們來(lái)看下 ActivityManagerService 啟動(dòng)過(guò)程。

ActivityManagerService(Context) //創(chuàng)建名為“ActivityManager”的前臺(tái)線程,并獲取mHandler。//通過(guò) UiThread 類,創(chuàng)建名為“android.ui”的線程。//創(chuàng)建前臺(tái)廣播和后臺(tái)廣播接收器。//創(chuàng)建目錄 /data/system。//創(chuàng)建服務(wù) BatteryStatsService。ActivityManagerService.start() //啟動(dòng)電池統(tǒng)計(jì)服務(wù),創(chuàng)建 LocalService,并添加到 LocalServices。ActivityManagerService.startOtherServices() -> installSystemProviders()//安裝所有的系統(tǒng) Provider。ActivityManagerService.systemReady()//恢復(fù)最近任務(wù)欄的 task。//啟動(dòng) WebView,SystemUI,開(kāi)啟 Watchdog,啟動(dòng)桌面 Launcher App。//發(fā)送系統(tǒng)廣播。

啟動(dòng)桌面 Launcher App,首先會(huì)通過(guò) Zygote 進(jìn)程 fork 一個(gè)新進(jìn)程作為 App 進(jìn)程,然后創(chuàng)建 Application,創(chuàng)建啟動(dòng) Activity,最后用戶才會(huì)看到桌面。

完整的啟動(dòng)流程圖

詳解Android系統(tǒng)啟動(dòng)過(guò)程

源碼解析項(xiàng)目地址:github.com/kailaisi/an…

以上就是詳解Android系統(tǒng)啟動(dòng)過(guò)程的詳細(xì)內(nèi)容,更多關(guān)于Android系統(tǒng)啟動(dòng)過(guò)程的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产在线观看91一区二区三区 | 午夜久久黄色| 天堂√8在线中文| 日韩国产在线| 国模 一区 二区 三区| 狠狠久久婷婷| 亚洲欧美日本国产| 国产精品久久久久久模特| 国产精品最新| 福利欧美精品在线| 国产麻豆久久| 久热精品在线| 国产亚洲一卡2卡3卡4卡新区| 日韩精品1区2区3区| 一区二区三区网站| 中文字幕亚洲影视| 国产精品自拍区| 国产精品毛片久久| 91精品一区二区三区综合在线爱| 午夜日本精品| 蜜芽一区二区三区| 久久爱www成人| 日韩精品中文字幕第1页| 亚洲免费精品| 国产精品毛片久久久| 136国产福利精品导航网址| 日韩中文字幕1| 欧洲在线一区| 欧美成人国产| 日韩欧美精品一区| 亚洲日本久久| 国产一区二区三区不卡视频网站| 精品在线99| 精品国产亚洲一区二区在线观看| 久久久久亚洲| 国产精品久久久久毛片大屁完整版| 色天使综合视频| 麻豆国产精品视频| 国产精品欧美在线观看| 亚洲区第一页| 综合激情视频| 日韩中文字幕| 日韩精品免费一区二区夜夜嗨 | 国产精品地址| 久久不见久久见免费视频7 | 三级一区在线视频先锋| 欧美日韩精品免费观看视完整| 精品一级视频| 国产精品久久久久蜜臀| 国产欧美日韩在线一区二区| 奇米色欧美一区二区三区| 久久不射中文字幕| 亚洲欧美激情诱惑| 日韩一区二区免费看| 在线一区二区三区视频| 日韩网站在线| 亚洲精品中文字幕乱码| 亚洲午夜国产成人| 一区二区三区四区日韩| 在线国产一区| 中文亚洲免费| 三级欧美韩日大片在线看| 日韩精品一卡二卡三卡四卡无卡| 日本一区二区三区中文字幕| 日本午夜精品久久久久| 国产精品theporn| 91超碰国产精品| 久久久久久久久久久妇女 | 日本a口亚洲| 日韩 欧美一区二区三区| 97se亚洲| 国产成年精品| 欧美日韩精品免费观看视欧美高清免费大片 | 亚洲成人一区在线观看| 日韩精品dvd| 亚洲性视频h| 日韩精品一级二级| 欧美在线黄色| 国产999精品在线观看| 欧美+日本+国产+在线a∨观看| 欧美粗暴jizz性欧美20| 亚洲色图国产| 免费一级欧美片在线观看网站| 国产精品22p| 久久黄色影院| 日本免费在线视频不卡一不卡二| 国产日韩欧美中文在线| 三级在线看中文字幕完整版| 91高清一区| 日本aⅴ亚洲精品中文乱码| 国产一区二区三区不卡视频网站 | 中日韩男男gay无套| 国产日韩一区| 欧美精品一线| 久久亚州av| 精品一区亚洲| 国产精品亚洲综合在线观看| 亚洲国产日韩欧美在线| 国产欧美亚洲精品a| 不卡在线一区| 精品久久久中文字幕| 免费在线观看日韩欧美| 精品国产网站| 日韩av资源网| 国产视频一区三区| 日韩在线看片| 国产精区一区二区| 中文字幕一区二区av| 韩国精品主播一区二区在线观看 | 亚洲啊v在线免费视频| 欧洲精品一区二区三区| 91九色综合| 亚洲欧美网站| 91精品精品| 色婷婷色综合| 高清av一区| 成人日韩av| 老司机精品在线| 国产精品分类| 日韩精品久久理论片| 亚洲精品综合| 亚洲精品自拍| 国产欧美一区二区三区精品观看| 在线日韩成人| 亚洲视频二区| 亚洲人成精品久久久| 蜜臀va亚洲va欧美va天堂| 老牛影视一区二区三区| 在线综合亚洲| 在线日韩成人| 69堂免费精品视频在线播放| 91国内精品| 国产精品99精品一区二区三区∴ | 国产精品久久久久av电视剧| 成人在线丰满少妇av| av资源中文在线天堂| 国产精品福利在线观看播放| 国产精品成人一区二区不卡| 激情六月综合| 亚洲一区日韩| 国产丝袜一区| 福利一区在线| 欧美日韩四区| 亚洲色诱最新| 91精品国产自产精品男人的天堂| 久久国产尿小便嘘嘘| 国产成人黄色| 日韩午夜电影| 国产精品欧美三级在线观看| av最新在线| 五月天久久777| 综合国产精品| 欧美丰满日韩| 亚洲深夜福利在线观看| 国产激情精品一区二区三区| 久久一区二区三区电影| 日韩欧美美女在线观看| 精品国产乱码久久久久久樱花 | 亚洲欧美日韩国产一区二区| 日韩精品免费视频一区二区三区| 久久亚洲人体| 国产一区白浆| 久久精品国产久精国产| 欧美女激情福利| 麻豆精品久久| 蜜臀av一区二区三区| 久久久久久色| 欧美sss在线视频| 国产精品分类| 一区二区不卡| 黄色免费成人| 日韩黄色大片| 欧美一区91| 免费在线视频一区| 亚洲韩日在线| 日韩欧美三级| 国产一区国产二区国产三区 | 高清av不卡| 国产不卡精品| 日韩av二区在线播放| 红桃视频亚洲| 日韩精品久久久久久久电影99爱| 国产精品毛片视频| 亚洲黄色影院| 免费毛片在线不卡| 日韩免费久久| 欧美xxxx性| 国产伦精品一区二区三区千人斩| 丝袜美腿高跟呻吟高潮一区| 欧美日韩少妇| 亚洲激情中文| 99riav国产精品| 亚洲精品网址| 亚洲欧美久久| 视频一区二区欧美| 国产精品婷婷| 亚洲一区日韩| 伊人久久一区| 蜜臀91精品一区二区三区| japanese国产精品|