做爲Android開發者 你真的知道Android按下開機鍵到啓動發生什麼嗎?

前言

在一個夜黑風高的晚上,個人男同事忽然給我發了一條微信,我點開來看,他居然問我Android從按下開機鍵到啓動到底發生了什麼?此刻個人心裏以下圖:linux


可是做爲一個Android開發者,瞭解整個系統架構是必須的,因此這篇就總結一下Android手機從按下開機鍵到啓動這一過程發生了什麼。面試

要了解Android手機啓動過程,咱們先來了解一下基於linux系統的電腦從按下電源鍵的那一刻起,發生了什麼,這樣類比能夠更好的理解Android手機的啓動過程。編程

基於Linux的pc啓動過程

咱們都知道,全部的程序軟件包括操做系統都是運行在內存中的,然而咱們的操做系統通常是存放在硬盤上的,當咱們按下開機鍵的時候,此時內存中什麼程序也沒有,所以須要藉助某種方式,將操做系統加載到內存中,而完成這項任務的就是 BIOS緩存

裝過系統的人必定知道BIOS這個東西,那麼它到底是什麼呢?微信

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

BIOS程序固化在主板上的一塊芯片上,是鏈接計算機硬件與操做系統的橋樑,它保存着計算機最重要的基本輸入輸出的程序、開機後自檢程序和系統自啓動程序。函數

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

所以這是一個硬件廠商之間的約定,全部的BIOS程序入口地址均爲0xFFFF0,這樣在開機的時候,就找到這個地址,若是該地址並無代碼段,那麼計算機將會死機,若是這個地址處有代碼段,將會執行這個代碼段,並由此執行下去,即BIOS程序開始啓動。操作系統

補充:
CS:代碼段寄存器,存在於CPU中,指向CPU當前執行代碼在內存中所在的區域。
IP:指令寄存器,存在於CPU中,記錄將要執行的指令在代碼段內的偏移地址,與CS組合即爲將要執行的指令的內存地址。設計

當BIOS程序啓動時,就會檢測硬件設備,好比咱們的顯卡、內存等信息。BIOS會在內存中創建中斷向量表和中斷服務程序。中斷向量表中有256箇中斷向量,每一箇中斷向量佔4個字節,每一箇中斷向量指向一箇中斷服務程序,這些中斷服務程序完成了將操做系統由硬盤加載到內存中的任務.
基於linux的操做系統而言,計算機將分三批逐次加載操做系統的代碼,第一批由BIOS中斷int 0x19將 第一扇區bootsect的內容加載到內存;第二批和第三批在bootsect的指揮下,分別加載後面扇區的內容到內存中。

通過執行一系列的BIOS代碼後,計算機完成了自檢等操做,計算機硬件體系會與BIOS聯合操做,讓cpu接收到一個int 0x19中斷,cpu接收到這個中斷後,會當即在中斷向量表中找到int 0x19中斷向量,此時會找到對應的中斷服務程序,並由該中斷服務程序將硬盤中第一個扇區的引導程序加在到內存中的指定位置。

隨後,在引導程序的做用下,陸續將操做系統的其餘程序載入內存,完成實模式到保護模式的轉變,爲執行操做系統的入口函數main作準備,後面就是操做系統的初始化工做了,最後完成計算機的啓動。

Android手機的啓動過程

Android系統雖然也是基於linux系統的,可是因爲Android屬於嵌入式設備,並無像pc那樣的BIOS程序。

取而代之的是Bootloader ——系統啓動加載器。它相似於BIOS,在系統加載前,用以初始化硬件設備,創建內存空間的映像圖,爲最終調用系統內核準備好環境。

在Android裏沒有硬盤,而是ROM ,它相似於硬盤存放操做系統,用戶程序等。ROM跟硬盤同樣也會劃分爲不一樣的區域,用於放置不一樣的程序,在Android中主要劃分爲一下幾個分區:

  • /boot:存放引導程序,包括內核和內存操做程序
  • /system:至關於電腦c盤,存放Android系統及系統應用
  • /recovery:恢復分區,能夠進入該分區進行系統恢復
  • /data:用戶數據區,包含了用戶的數據:聯繫人、短信、設置、用戶安裝的程序
  • /cache:安卓系統緩存區,保存系統最常訪問的數據和應用程序
  • /misc:包含一些雜項內容,如系統設置和系統功能啓用禁用設置
  • /sdcard:用戶本身的存儲區,能夠存放照片,音樂,視頻等文件

那麼Bootloader是如何被加載的呢?咱們能夠想到,應該跟pc同樣,當開機加電的時候,cpu會從cpu製造廠商預設的地址上取指令,這個地址是各廠商約定俗稱的,相似於上面80x86架構裏的0xFFFF0地址,所以Android手機會將固態存儲設備ROM預先映射到該地址上,當開機加電的時候,cpu就會從該地址執行/boot分區下的Bootloader程序,載入linux內核到RAM中。

當linux內核啓動後會初始化各類軟硬件環境,加載驅動程序,掛載根文件系統,並開始執行根文件系統的init程序,init程序是Android啓動過程當中最重要的核心程序。

init進程是Android系統中用戶進程的鼻祖進程。init進程會啓動各類系統本地服務,如:Media Server、Service Manager、bootanim(開機動畫)等。init進程會在解析init.rc文件後fork出Zygote,而Zygote是全部Java進程的父進程,咱們的App都是由Zygote fork出來的。
Zygote進程主要包含:

  • 加載ZygoteInit類,註冊Zygote Socket服務端套接字;
  • 加載虛擬機;
  • 預加載Android核心類
  • 預加載系統資源

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

當System Server將系統服務啓動就緒後,就會通知ActivityManager啓動首個Android程序Home即咱們看到的桌面程序。

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


最後附一張總體流程圖,幫助更好理解:


喜歡的小夥伴歡迎關注,我會按期分享Android知識點及解析,還會不斷更新的BATJ面試專題,歡迎你們前來探討交流,若有好的文章也歡迎投稿。

相關文章
相關標籤/搜索