arm 系统的启动过程

ARM系统的启动过程是一个多阶段、软硬件协同的复杂流程,与x86架构存在显著差异。以下为详细解析:

一、硬件初始化阶段(BootROM执行)

  1. 上电复位与BootROM启动
    • ARM处理器上电后,从固定地址(通常为0x00000000或厂商定义的地址)开始执行BootROM代码。BootROM是芯片内部只读固件,负责最底层硬件初始化,包括时钟、内存控制器、安全引擎等。
    • 安全启动验证:BootROM会验证下一阶段代码(如Bootloader)的数字签名,确保安全启动(Secure Boot)。
  2. 异常级别切换
    • ARM架构采用异常级别(Exception Level, EL)机制,启动时运行在最高特权模式:
      • EL3(Secure Monitor):负责安全世界(Secure World)与非安全世界(Normal World)的切换,处理安全服务。
      • EL2(Hypervisor):可选,支持虚拟化。
      • EL1(OS Kernel):操作系统内核运行级别。
      • EL0(User Space):用户应用程序运行级别。

二、引导加载程序(Bootloader)阶段

ARM架构通常使用U-Boot作为引导加载程序,分为两个阶段:

  1. 第一阶段(汇编语言实现)
    • 硬件初始化:关闭MMU和Cache,配置堆栈指针(SP),初始化内存控制器、串口等基本外设。
    • 加载第二阶段:将U-Boot的第二阶段代码加载到内存中,并跳转执行。
  2. 第二阶段(C语言实现)
    • 完整硬件初始化:初始化更多外设(如网络、存储设备),配置设备树(Device Tree)或ACPI表。
    • 加载内核:从存储介质(如eMMC、SD卡、网络)加载Linux内核映像到内存,并传递启动参数(如内核地址、设备树地址)。
    • 启动内核:通过booti命令将控制权交给内核。

三、内核加载与初始化

  1. 内核自解压与初始化
    • 解压内核:若内核为压缩格式(如zImage),需先自解压到内存。
    • 初始化页表与MMU:设置虚拟地址映射,启用内存管理单元(MMU)和缓存。
    • 解析设备树:读取设备树(Device Tree Blob, DTB)或ACPI表,初始化硬件(如中断控制器、PCIe、USB)。
  2. 启动用户空间
    • 创建init进程:内核初始化完成后,启动init进程(PID 1),负责初始化系统环境。
    • 加载服务与应用init进程启动必要的服务(如网络、日志)和用户应用程序,完成系统就绪。

四、ARM与x86启动流程差异

阶段 ARM x86
硬件初始化 BootROM执行,无BIOS BIOS初始化硬件,设置启动顺序
引导加载程序 U-Boot(多阶段,支持安全启动) GRUB、LILO等(依赖BIOS加载)
内核加载 需显式传递设备树地址 自动检测硬件,无需设备树
安全启动 集成Secure Boot,验证固件签名 可选UEFI Secure Boot
异常处理 基于EL级别切换 基于环(Ring)保护机制

五、关键技术细节

  1. 多核启动(SMP初始化)
    • 主核(Primary Core):执行完整启动流程,初始化后通过中断(SGI)或PSCI协议唤醒从核。
    • 从核(Secondary Core):跳转到内核指定的入口地址(如secondary_startup),完成并行初始化。
  2. 设备树(Device Tree)
    • ARM系统通过设备树描述硬件配置,内核根据设备树初始化对应驱动,替代x86的PCI枚举方式。
  3. 内存布局
    • ARM内核通常链接到固定地址(如0x80008000),需与Bootloader加载地址一致,避免地址冲突。

通过以上流程,ARM系统完成从硬件加电到用户可操作的完整启动,其设计更注重灵活性、低功耗和安全性,适用于嵌入式、移动设备和物联网场景。

你可能感兴趣的:(arm 系统的启动过程)