linux啓動過程

Linux啓動過程對於初學者而言有點撲朔迷離,這是因爲啓動過程關乎處理器配置、內存配置、外 圍硬件配置,而不同的處理器和硬件系統會釆用不同的策略,從而具體的啓動過程會有所差異。但無論差異如何,從計算機系統的角度來看,啓動過程一般分爲三個步驟,如 圖 1-1所示。

在這裏插入圖片描述
圖 1 - 1 通用系統的啓動過程
首先是開機,開機就是給系統開始供電,此時硬件電路會產生一個確定的復位時序,保 證 CPU是
最後一個被複位的器件。爲什麼CPU要最後被複位呢?因爲,如 果 CPU第一個被複位,則 當 CPU復
位後開始運行時,其他硬件內部的寄存器狀態可能還沒有準備好,比如磁盤或者內存,那麼就可能出現
外圍硬件初始化錯誤。
當正確完成復位後,CPU開始執行第一條指令,該指令所在的內存地址是固定的,這 由 CPU的制
造者指定。不同的CPU可能會從不同的地址獲取指令,但這個地址必須是固定的,這個固定地址所保
存的程序往往被稱爲“引導程序” Bootloader),因爲其作用是裝載真正的用戶程序。
至於如何裝載,則是一個策略問題,不同的CPU會提供不同的裝載方式,比如有的是通過普通的
並口存儲器,有的則是通過SD卡,還有的是通過RS232接口。無論硬件上使用何種接口裝載,裝載過
程必須提供以下信息,具體包括:
• 從哪裏讀取用戶程序?
• 用戶程序的長度是多少?
• 裝載完用戶程序後,應該跳轉到哪裏,即用戶程序的執行入口在哪裏?
不同硬件系統會釆用不同的策略,但只要以上三個信息是確定的,用戶程序就會被裝載到確定的地
址,並執行相同的操作。

	第二步是執行內核程序,這裏所說的內核程序在上一步中指的就是“用戶程序”。因爲從CPU的角 

度來看,除 Bootloader之外的所有的程序都是用戶程序,只是從軟件的角度來看,用戶程序被分爲“內
核程序” 和 “應用程序”,而本步執行的是“ 內核程序”。
內核程序初始化時執行的操作包括,初始化各種硬件,包括內存、網絡接口、顯示器、輸入設備,
然後建立各種內部數據結構,這些數據結構將用於多線程調度及內存的管理等。當內核初始化完畢後,
就開始運行具體的應用程序了。在一般情況下,習慣於將第一個應用程序稱爲“Home程序”。
第二步就是運彳丁 Home程序,比如Windows系統的桌面,就是一1個典型的Home程序。之所以稱
其 爲 Home程序,是因爲通過該程序可以方便地啓動其他應用程序。而傳統的Linux系統啓動後,第一
個運行程序一般是一個Terminal,儘管它表面上就像一個Dos界面,但它也可以被稱爲Home程序,因
爲 Home程序設計的目標就是提供一個入口,用戶可以通過該入口啓動其他應用程序。
以上從通用操作系統的角度介紹了啓動過程,接下來,具體來看Android所使用的Linux內核的啓
動過程。因爲目前的Android系統多運行在ARM 處理器之上,因此,下面主要分析運行於ARM 處理
器上的Linux的啓動過程。在介紹之前,先來簡單區分三個概念:ARM、處理器、CPU。
ARM本身是一個公司的名稱,從技術的角度來看,它又是一種微處理器內核的架構。
處理器是一種統稱,可以指具體的CPU芯片,比如Intel 8086處理器,蘋果的A8處理器等。處理
器內部一般包含CPU、片上內存、片上外設接口等不同的硬件邏輯。
CPU是處理器內部的中央處理單元的縮寫,CPU可以按照類型分爲短指令集架構和長指令集架構
兩大類,ARM屬於短指令集架構的一種。
對 於 ARM 處理器,當復位完畢後,處理器首先執行其片上RO M 中的一小塊程序。這 塊 ROM 的
大小一般只有幾KB,該段程序就是Bootloader程序,這段程序執行時會根據處理器上一些特定引腳的
高低電平狀態,選擇從何種物理接口上裝載用戶程序,比如USB 口、串口、SD卡、並口 Flash等。
多數基於ARM 的實際硬件系統,會從並口 NAND Flash芯片中的0x00000000地址處裝載程序。
對於一些小型嵌入式系統而言,該地址中的程序就是最終要執行的用戶程序;而對於Android而言,該
地址中的程序還不是Android程序,而是一個叫做uboot或 者 fastboot的程序,其作用是初始化硬件設
備,比如網口、SDRAM、RS232等,並提供一些調試功能,比如向NAND Flash中寫入新的數據,這
可用於開發過程中的內核燒寫、升級等。
當 uboot (fastboot)被裝載後便開始運行,它一般會先檢測用戶是否按下了某些特別按鍵,這些特
別按鍵是uboot在編譯時預先約定好的,用於進入調試模式。如果用戶沒有按這些特別的按鍵,則 uboot
會從NAND Flash中裝載Linux內核,裝載的地址是在編譯uboot時預先約定好的。
Linux內核被裝載後,就開始進行內核初始化的過程,該過程如表1-2所示。
表 1-2 Linux內核的啓動步驟
在這裏插入圖片描述
在這裏插入圖片描述
以上過程中,initrc文件在Android手機中的系統根目錄下,可以使用adb pull命令提取出該文件: ./adb pull /init.rc 〜/De sktop
initrc的內容格式類似於一種腳本,但是它卻不是標準的Linux腳本,而是僅用於啓動的腳本。關
於 init.rc的完整格式請參考Linux相關文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章