Android從按下開機鍵到啟動發生了什麼

來源:互聯網
上載者:User

標籤:

作為一個Android開發人員,瞭解整個系統架構是必須的,所以這篇就總結一下Android手機從按下開機鍵到啟動這一過程發生了什麼。

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

基於Linux的pc啟動過程

我們都知道,所有的程式軟體包括作業系統都是運行在記憶體中的,然而我們的作業系統一般是存放在硬碟上的,當我們按下開機鍵的時候,此時記憶體中什麼程式也沒有,因此需要藉助某種方式,將作業系統載入到記憶體中,而完成這項任務的就是BIOS

裝過系統的人一定知道BIOS這個東西,那麼它究竟是什麼呢?
BIOS:Basic Input/Output System(基本輸出入系統 (BIOS)),在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手機開機到看到傳統型程式所有過程分析完了。

最後附一張整體流程圖,協助更好理解(出處在下面參考連結中)

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

Android從按下開機鍵到啟動發生了什麼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.