ARM64架构启动流程

[复制链接]
发表于 2025-6-7 14:00:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
ARM64 架构的启动流程是一个多阶段、分层次的过程,涉及硬件初始化、权限切换、代码加载和操纵系统启动。以下是其焦点流程的详细阐明:

1. 硬件上电与 BootROM 实行



  • 复位向量(Reset Vector)
    CPU 上电后,从固定地址(通常为 0x00000000 或厂商定义的地址)开始实行 BootROM 代码

    • BootROM 是芯片内部只读固件,负责最底层硬件初始化(如时钟、内存控制器、安全引擎)。
    • 验证下一阶段代码(如 Bootloader)的数字签名(Secure Boot)。

  • 异常级别(Exception Level, EL)
    ARM64 启动时运行在最高特权模式:

    • EL3(Secure Monitor):负责安全天下(Secure World)与非安全天下(Normal World)的切换。
    • EL2(Hypervisor):可选,支持虚拟化
    • EL1(OS Kernel):操纵系统内核运行级别。
    • EL0(User Space):用户应用步伐。


2. 加载并实行 Bootloader

阶段 1:Primary Bootloader(如 ARM Trusted Firmware, ATF)



  • 使命

    • 初始化关键外设(如 UART 调试串口、DRAM 控制器)。
    • 设置异常向量表(Exception Vector Table)。
    • 加载下一阶段 Bootloader(如 U-Boot)到内存。
    • 切换异常级别(从 EL3 → EL2 或 EL1)。

  • 示例代码(ATF 跳转)
    1. bl31_main() {
    2.     // 初始化平台硬件
    3.     plat_initialize();
    4.     // 跳转到非安全世界(EL2/EL1)
    5.     enter_normal_world();
    6. }
    复制代码
阶段 2:Secondary Bootloader(如 U-Boot)



  • 使命

    • 完整内存映射初始化(如 DDR 配置)。
    • 加载设备树(Device Tree Blob, DTB)或 ACPI 表。
    • 存储介质(eMMC、NVMe、网络)加载操纵系统内核(如 Linux)。
    • 传递启动参数(内核地址、设备树地址、命令行参数)。

  • U-Boot 命令示例
    1. # 从 eMMC 加载内核和设备树到内存
    2. load mmc 0:1 ${kernel_addr_r} Image
    3. load mmc 0:1 ${fdt_addr_r} dtb.dtb
    4. # 启动内核
    5. booti ${kernel_addr_r} - ${fdt_addr_r}
    复制代码

3. 操纵系统内核启动

内核解压与重定位(如 Linux)



  • 使命

    • 自解压(如果内核为压缩格式,如 Image.gz)。
    • 初始化页表、MMU 和缓存。
    • 解析设备树或 ACPI,初始化硬件(如中断控制器、PCIe、USB)。
    • 挂载根文件系统,启动用户空间初始化历程(如 systemd 或 init)。

  • 内核启动流程
    1. start_kernel() {
    2.     setup_arch();          // 架构相关初始化(ARM64)
    3.     init_irq();            // 中断控制器初始化(GIC)
    4.     time_init();           // 时钟源初始化
    5.     rest_init();           // 创建 init 进程
    6. }
    复制代码

4. 多核启动(SMP 初始化)



  • 主核(Primary Core):实行完整启动流程。
  • 从核(Secondary Cores)

    • 上电后处于等待状态(通过 spin-table 或 PSCI 协议)。
    • 主核通过发送中断(SGI)或设置叫醒地址叫醒从核。
    • 从核跳转到内核指定的入口地址(如 secondary_startup)。

  • 示例(设备树配置 spin-table)
    1. cpu@1 {
    2.     device_type = "cpu";
    3.     reg = <0x0 0x1>;
    4.     enable-method = "spin-table";
    5.     cpu-release-addr = <0x0 0x8000fff8>;
    6. };
    复制代码

5. 安全启动与 TrustZone



  • TrustZone 划分

    • 安全天下(Secure World):运行安全监控监控步伐(如 ATF BL31)和可信应用(TA)。
    • 非安全天下(Normal World):运行普通操纵系统(如 Linux、Android)。

  • 启动流程中的安全切换

    • BootROM 在 EL3 验证 Bootloader 签名。
    • ATF(BL31)作为安全监控监控器,处理安全天下与非安全天下的切换。
    • 内核运行在非安全天下的 EL1,无法直接访问安全资源。


6. 关键地址与数据传递



  • 内核加载地址

    • 由 Bootloader 指定(如 U-Boot 的 kernel_addr_r=0x80080000)。
    • 必须与内核链接地址划一(通过 CONFIG_PHYS_OFFSET 配置)。

  • 设备树/ACPI 地址

    • 设备树地址通过寄存器 x0 传递给内核。
    • ACPI 表由 UEFI 固件直接放置在内存中。


7. 调试与常见题目



  • 调试手段

    • 串口输出:通过 UART 打印 Bootloader 和内核日志日志
    • JTAG 调试:追踪 CPU 实行流程,查抄寄存器/内存状态。

  • 常见题目

    • 内存初始化失败:DRAM 参数配置错误(如时序、容量)。
    • 设备树错误:硬件形貌不匹配导致内核瓦解。
    • 安全启动阻止:未签名或版本不符的固件被拒绝加载。


流程图示例

  1. [ 硬件上电 ]  
  2.     → BootROM(EL3)  
  3.         → 加载并验证 ATF BL2  
  4.             → ATF BL31(EL3)  
  5.                 → 切换至非安全世界,跳转至 U-Boot(EL2/EL1)  
  6.                     → U-Boot 加载 Linux 内核和设备树  
  7.                         → 内核启动(EL1)  
  8.                             → 用户空间(EL0)
复制代码

总结

ARM64 的启动流程是一个分层次、多阶段协作的过程,涉及从硬件初始化到操纵系统加载的多个环节。理解其焦点阶段(BootROM → Bootloader → Kernel)和权限切换(EL3 → EL1)是进行底层开辟或系统移植的关键。实际应用中需结合具体芯片手册和调试工具,确保各阶段代码的地址、权限和安全战略正确配置。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2025-7-4 04:51 , Processed in 0.080836 second(s), 29 queries 手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199 )|网站地图

快速回复 返回顶部 返回列表