一 Bootloader 階段
在嵌入式系統中,Bootloader的引導過程與傳統的PC環境有所不同,主要是因為嵌入式系統的硬件配置和應用場景更加多樣化。以下是嵌入式系統中Bootloader被引導的一般流程:
1. 硬件復位
當嵌入式設備上電或復位時,處理器會執行一個預定義的啟動序列。通常,這包括設置CPU寄存器到默認狀態,并開始從一個固定的內存地址(通常是ROM或者Flash)讀取指令。
2. 初始Bootloader階段
- 直接固件加載:某些嵌入式處理器設計為直接從特定位置(如內部ROM)運行代碼。這段代碼非常小且簡單,其主要任務是初始化一些關鍵的硬件組件(如內存控制器),以便后續可以從外部存儲器(如NOR Flash、NAND Flash、SD卡等)加載更復雜的Bootloader程序。
- Boot ROM:許多現代嵌入式處理器包含一個小型的Boot ROM,它知道如何處理不同類型的啟動介質(比如SPI Flash、eMMC、USB等)。這個Boot ROM負責定位并加載第一個真正的Bootloader映像到內存中。
3. 主Bootloader階段
- 硬件初始化始化
- 環境變量設置
- 加載操作系統內核和文件系統
- 傳遞控制給操作系統
第一階段:
1、硬件設備初始化:
關閉看門狗、關中斷、啟動ICACHE、關閉DCACHE和TLB,關閉MMU、設置時鐘頻率、RAM初始化等。
2、為加載BootLoader的第二階段準備RAM空間
3、復制BootLoader的第二階段代碼到RAM空間中
4、設置好棧
5、跳轉到第二階段代碼的C入口處
第二階段:
1、初始化本階段要使用的硬件設備
2、檢查系統內存映射(memory map):就是確定板子使用了多少內存,他們的地址空間是什么。
3、將內核映象和根文件映象從flash上讀到RAM空間中
4、為內核映象設置啟動參數
5、調用內核
二 kernel 階段
1. 內核啟動
當內核映像被加載到內存后,內核開始執行:
初始化硬件:例如內存管理、中斷、定時器等。
加載 init 進程:這是 Linux 系統中的第一個用戶空間進程,通常在 Android 中是 init 進程。
2. init 進程啟動
init 進程是 Android 系統中非常重要的一個組件,它負責:
掛載文件系統:例如 /system 和 /data。
啟動關鍵服務:如 zygote、SurfaceFlinger、InputManager 等。
執行 rc 文件:這些文件定義了系統啟動時需要運行的腳本和服務。
3. Zygote 進程
在 init 進程中,會啟動 Zygote 進程,這是 Java 虛擬機(JVM)的一個實例,用于孵化其他 Java 應用進程。Zygote 負責:
預加載類:減少后續應用啟動時間。
孵化應用進程:如 Android 應用和系統服務。