国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術文章
文章詳情頁

Android從按下開機鍵到啟動發(fā)生了什么

瀏覽:13日期:2022-09-27 13:50:33

作為一個Android開發(fā)者,了解整個系統(tǒng)架構是必須的,所以這篇就總結一下Android手機從按下開機鍵到啟動這一過程發(fā)生了什么。

要了解Android手機啟動過程,我們先來了解一下基于linux系統(tǒng)的電腦從按下電源鍵的那一刻起,發(fā)生了什么,這樣類比可以更好的理解Android手機的啟動過程。

基于Linux的pc啟動過程

我們都知道,所有的程序軟件包括操作系統(tǒng)都是運行在內(nèi)存中的,然而我們的操作系統(tǒng)一般是存放在硬盤上的,當我們按下開機鍵的時候,此時內(nèi)存中什么程序也沒有,因此需要借助某種方式,將操作系統(tǒng)加載到內(nèi)存中,而完成這項任務的就是BIOS

裝過系統(tǒng)的人一定知道BIOS這個東西,那么它究竟是什么呢?

BIOS:Basic Input/Output System(基本輸入輸出系統(tǒng)),在IBM PC兼容系統(tǒng)上,是一種業(yè)界標準的固件接口(來自維基百科)。有點難以理解,其實BIOS是我們電腦啟動時加載的第一個程序,這個程序不是由Java語言編寫也不是由C語言編寫,一般是匯編程序。

BIOS程序固化在主板上的一塊芯片上,是連接計算機硬件與操作系統(tǒng)的橋梁,它保存著計算機最重要的基本輸入輸出的程序、開機后自檢程序和系統(tǒng)自啟動程序。

那么問題來了,BIOS程序又是怎么啟動的?BIOS的啟動,是由硬件完成的,Intel 80x86系列的cpu的硬件都設計為加電(即開機瞬間)就進入16位實模式狀態(tài)運行,此時將cpu的硬件邏輯設計為強行將CS的值設置為0xFFFF,IP的值設置為0x0000,這樣CS:IP就指向了0xFFFF0這個位置,而這個位置就是BIOS程序的入口地址。

因此這是一個硬件廠商之間的約定,所有的BIOS程序入口地址均為0xFFFF0,這樣在開機的時候,就找到這個地址,如果該地址并沒有代碼段,那么計算機將會死機,如果這個地址處有代碼段,將會執(zhí)行這個代碼段,并由此執(zhí)行下去,即BIOS程序開始啟動。

補充:CS:代碼段寄存器,存在于CPU中,指向CPU當前執(zhí)行代碼在內(nèi)存中所在的區(qū)域。

IP:指令寄存器,存在于CPU中,記錄將要執(zhí)行的指令在代碼段內(nèi)的偏移地址,與CS組合即為將要執(zhí)行的指令的內(nèi)存地址。

當BIOS程序啟動時,就會檢測硬件設備,比如我們的顯卡、內(nèi)存等信息。BIOS會在內(nèi)存中建立中斷向量表和中斷服務程序。中斷向量表中有256個中斷向量,每個中斷向量占4個字節(jié),每個中斷向量指向一個中斷服務程序,這些中斷服務程序完成了將操作系統(tǒng)由硬盤加載到內(nèi)存中的任務。

基于linux的操作系統(tǒng)而言,計算機將分三批逐次加載操作系統(tǒng)的代碼,第一批由BIOS中斷int 0x19將第一扇區(qū)bootsect的內(nèi)容加載到內(nèi)存;第二批和第三批在bootsect的指揮下,分別加載后面扇區(qū)的內(nèi)容到內(nèi)存中。

經(jīng)過執(zhí)行一系列的BIOS代碼后,計算機完成了自檢等操作,計算機硬件體系會與BIOS聯(lián)合操作,讓cpu接收到一個int 0x19中斷,cpu接收到這個中斷后,會立即在中斷向量表中找到int 0x19中斷向量,此時會找到對應的中斷服務程序,并由該中斷服務程序將硬盤中第一個扇區(qū)的引導程序加在到內(nèi)存中的指定位置。

隨后,在引導程序的作用下,陸續(xù)將操作系統(tǒng)的其他程序載入內(nèi)存,完成實模式到保護模式的轉變,為執(zhí)行操作系統(tǒng)的入口函數(shù)main做準備,后面就是操作系統(tǒng)的初始化工作了,最后完成計算機的啟動。

Android手機的啟動過程

Android系統(tǒng)雖然也是基于linux系統(tǒng)的,但是由于Android屬于嵌入式設備,并沒有像pc那樣的BIOS程序。

取而代之的是Bootloader——系統(tǒng)啟動加載器。它類似于BIOS,在系統(tǒng)加載前,用以初始化硬件設備,建立內(nèi)存空間的映像圖,為最終調(diào)用系統(tǒng)內(nèi)核準備好環(huán)境。

在Android里沒有硬盤,而是ROM,它類似于硬盤存放操作系統(tǒng),用戶程序等。ROM跟硬盤一樣也會劃分為不同的區(qū)域,用于放置不同的程序,在Android中主要劃分為一下幾個分區(qū):

/boot:存放引導程序,包括內(nèi)核和內(nèi)存操作程序

/system:相當于電腦c盤,存放Android系統(tǒng)及系統(tǒng)應用

/recovery:恢復分區(qū),可以進入該分區(qū)進行系統(tǒng)恢復

/data:用戶數(shù)據(jù)區(qū),包含了用戶的數(shù)據(jù):聯(lián)系人、短信、設置、用戶安裝的程序

/cache:安卓系統(tǒng)緩存區(qū),保存系統(tǒng)最常訪問的數(shù)據(jù)和應用程序

/misc:包含一些雜項內(nèi)容,如系統(tǒng)設置和系統(tǒng)功能啟用禁用設置

/sdcard:用戶自己的存儲區(qū),可以存放照片,音樂,視頻等文件

那么Bootloader是如何被加載的呢?我們可以想到,應該跟pc一樣,當開機加電的時候,cpu會從cpu制造廠商預設的地址上取指令,這個地址是各廠商約定俗稱的,類似于上面80x86架構里的0xFFFF0地址,因此Android手機會將固態(tài)存儲設備ROM預先映射到該地址上,當開機加電的時候,cpu就會從該地址執(zhí)行/boot分區(qū)下的Bootloader程序,載入linux內(nèi)核到RAM中。

當linux內(nèi)核啟動后會初始化各種軟硬件環(huán)境,加載驅動程序,掛載根文件系統(tǒng),并開始執(zhí)行根文件系統(tǒng)的init程序,init程序是Android啟動過程中最重要的核心程序。

init進程是Android系統(tǒng)中用戶進程的鼻祖進程。init進程會啟動各種系統(tǒng)本地服務,如:Media Server、Service Manager、bootanim(開機動畫)等。init進程會在解析init.rc文件后fork出Zygote,而Zygote是所有Java進程的父進程,我們的App都是由Zygote fork出來的。

Zygote進程主要包含:

加載ZygoteInit類,注冊Zygote Socket服務端套接字;

加載虛擬機;

預加載Android核心類

預加載系統(tǒng)資源

隨后Zygote進程會fork出System Server進程,System Server進程負責啟動和管理整個framework,包括Activity Manager,PowerManager等服務。

當System Server將系統(tǒng)服務啟動就緒后,就會通知ActivityManager啟動首個Android程序Home即我們看到的桌面程序。

至此,從Android手機開機到看到桌面程序所有過程分析完了。

最后附一張整體流程圖,幫助更好理解(出處在下面參考鏈接中)

Android從按下開機鍵到啟動發(fā)生了什么

參考:http://blog.chinaunix.net/uid-26569496-id-3891554.html http://ticktick.blog.51cto.com/823160/1659473http://gityuan.com/2016/01/30/android-boot/

標簽: Android
相關文章:
主站蜘蛛池模板: 沅江市| 乌苏市| 清新县| 监利县| 苍梧县| 平昌县| 宜都市| 沁水县| 景宁| 张掖市| 神农架林区| 宁强县| 松溪县| 梧州市| 万安县| 阿拉善盟| 榆社县| 定州市| 宁德市| 四平市| 金堂县| 额济纳旗| 孟津县| 安宁市| 栾城县| 普兰店市| 水城县| 夹江县| 志丹县| 常德市| 三江| 苏州市| 革吉县| 明星| 溧水县| 瑞安市| 怀宁县| 庆云县| 天台县| 加查县| 赣州市|