这是我的嵌入式笔记第三篇,原文写于 2015 年。
在真实世界中,一个操作系统是如何被加载的?对于单片机、SoC 以及我们常见的计算机,由于硬件设备和软件系统的不同,启动流程肯定会有差异。不过对于大型操作系统,启动流程有不少共通之处,本文将简单解析一个消费类电子产品常用的系统(基于 TI 的 AM335x 处理器)是如何被加载启动的。
这篇笔记其实是在组队项目时,由一位队友 Adrian Huang 所写。相比我们这些 “愣头青”,Adrian 已经有八九年的 Linux 底层工作经验,先后在 HP、联想、MTK 工作过,是十足的大佬。
正文开始
圖一為 AM335x 開機流程,其包含 ROM Code、MLO、U-Boot 與 OS Image,底下將說明 ROM Code、MLO 與 U-Boot。
Figure 1: High-level Overview to AM335x Boot SequenceROM Code
ROM Code 主要有幾項任務:
- Stack Setup
- Watchdog timer 1 configuration (set to three minutes)
- System clock configuration
- Search bootable devices (must be the FAT 12/16/32 partition) for a valid booting image (the image name must be MLO)
- Load the content of the file “MLO” from a bootable device to internal RAM (the 128KB on-chip memory)
- Execute the file “MLO” stored in internal RAM
圖二為 ROM Code 架構,由”Public ROM Code drivers” 可知 ROM code 支援如下裝置:
- MMCSD (MultiMediaCard SD)
- NAND
- XIP (eXecute In Place)
- SPI
- USB UART
- EMAC (Ethernet Media Access Control)
也就是說,系統一上電,ROM Code 會掃描上述裝置,以便找到 Bootable device。由於 ROM Code 只支援 FAT 檔案系統格式,所以 Bootable device 一定要是 FAT 檔案系統 (FAT12/16/32 檔案系統都可以)。
注意:該架構的 On-chip boot ROM 大小為 176 KB。
Figure 2: ROM Code Architecture
圖三為 ROM Memory Map:
- ROM Exception Vectors (0x20000-0x2001F): 該區段定義 Exception Handler 的位址。譬如: 0x20000 存放 Reset Handler 的位址,也就是板子一上電,第一個執行的地方,課程第七周有詳盡的說明,可參考此文件。詳盡的 ROM Exception Vectors 如表一所示。
Chart 1: ROM Exception Vectors
- Public ROM Code CRC (0x20020): 由 0x20000-0x2BFFF 計算得出的四個位元組 CRC 值。
- Dead loops (0x20080-0x200FF): 該區段定義預設的 exception handlers,其預設 handlers 都是執行 while (1) 迴圈,程式設計者可以定義相同名字的 exception handler,如此便能覆蓋 (override) 對應之預設 exception handlers。可參考 mini-arm-os 與 freertos 程式碼,以便了解其設計概念。
- Code (started from 0x20100): ROM 程式碼
- ROM Version (0x2BFFC-0x2BFFF): ROM Code Version
Figure 3: ROM Memory MapTwo Stage U-Boot Design - MLO (MMC Loader) & U-bootMLO (File Name: MLO
)
AM335x ARM Cortex-A8 處理器的 On-chip memory (internal SRAM) 大小為 128KB (詳見 AM3358 Data Sheet),其 Memory Map 如圖四所示:
- 1KB Secure Area: 此區域無法存取
- 109KB downloaded image (0x402F0400-0x4030B7FF): 此區域最多可以容納 109KB 二進制檔案,此檔案可以存放在儲存裝置,或透過 UART/USB 傳輸,進而 ROM Code 載入至位址 0x402F0400。MLO 其實就是小型的 U-Boot Boot loader (其大小必須小於 109KB)。所以,其簡化版 U-Boot (MLO) 主要任務如下:
- 初始化 DDR (512MB)
- 一旦初始化 DDR 成功後,MLO 將
u-boot.img
載入至 DDR,並交由 U-Boot 接管。
- 18KB area (0x4030B800-0x4030FFFF): ROM Code 使用該區域。
Figure 4: Memory Map for 128KB on-chip memoryU-boot (File name: u-boot.img
)
此完整版 U-Boot 主要做額外 platform 初始化 (如:初始化網卡等),並載入 OS Kernel。為何需要 two-stage U-boot?
由於 On-chip memory 只能提供 109KB 給 Boot loader。然而,對於一個完整版的 U-Boot,其大小約 350KB (參考 ARMhf 編好的 u-boot)。為因應此限制,便需要一個小型的 U-boot (MLO),用以初始化 DDR 並將完整版 U-boot 載入至 DDR,再將控制權交給完整版 U-boot。下圖在 BeagleBoard Black 成功載入 MLO 與 U-Boot 終端機輸出。
相关文章
- 观影简记:《Revolution OS(操作系统革命)》
- 小练习:通过反汇编一段 C 代码观察栈行为
- 那些年我拿到阿里巴巴 Offer 所参加的面试
- 本文作者: John Chou
- 本文链接: https://blog.joouis.com/2019/12/15/am335x-arm-cortex-a8-boot-sequence/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-ND 许可协议。转载请注明出处!
# embedded system course # embedded system # arm # cortex-a8 # rom # ram # u-boot # boot # os