接前一篇文章:字节跳动社招面经 —— BSP驱动工程师(5)
本文内容参考:
嵌入式硬件平台修改启动地址-CSDN博客
特此致谢!
上一回开始针对于“嵌入式充电站”发的一篇文章字节跳动社招面经——BSP驱动工程师中的面试题第3题 —— arm64启动流程进行解析,本回继续解析。
3. arm64启动流程
arm64架构的启动流程是一个多阶段、分层次的过程,涉及硬件初始化、权限切换、代码加载和操作系统启动。以下是其核心流程的详细说明:
(1)硬件上电与BootROM执行
(2)加载并执行Bootloader
(3)操作系统内核启动
(4)多核启动(SMP初始化)
(5)安全启动与TrustZone
- TrustZone划分
- 安全世界(Secure World):运行安全监控程序(如 ATF BL31)和可信应用(TA)。
- 非安全世界(Normal World):运行普通操作系统(如 Linux、Android)。
- 启动流程中的安全切换
a. BootROM在EL3验证Bootloader签名;
b. ATF(BL31)作为安全监控器,处理安全世界与非安全世界的切换;
c. 内核运行在非安全世界的EL1,无法直接访问安全资源。
(6)关键地址与数据传递
- 内核加载地址
- 由Bootloader指定(如 U-Boot的
kernel_addr_r=0x80080000
)。 - 必须与内核链接地址一致(通过
CONFIG_PHYS_OFFSET
配置)。
- 由Bootloader指定(如 U-Boot的
- 设备树/ACPI地址
- 设备树地址通过寄存器
x0
传递给内核。 - ACPI表由UEFI固件直接放置在内存中。
- 设备树地址通过寄存器
(7)调试与常见问题
- 调试手段
- 串口输出:通过UART打印Bootloader和内核日志。
- JTAG 调试:追踪CPU执行流程,检查寄存器/内存状态。
- 常见问题
- 内存初始化失败:DRAM参数配置错误(如时序、容量)。
- 设备树错误:硬件描述不匹配导致内核崩溃。
- 安全启动阻止:未签名或版本不符的固件被拒绝加载。
流程图示例
[ 硬件上电 ]
→ BootROM(EL3)
→ 加载并验证ATF BL2
→ ATF BL31(EL3)
→ 切换至非安全世界,跳转至 U-Boot(EL2/EL1)
→ U-Boot 加载 Linux 内核和设备树
→ 内核启动(EL1)
→ 用户空间(EL0
总结
arm64的启动流程是一个分层次、多阶段协作的过程,涉及从硬件初始化到操作系统加载的多个环节。理解其核心阶段(BootROM → Bootloader → Kernel)和权限切换(EL3 → EL1)是进行底层开发或系统移植的关键。实际应用中需结合具体芯片手册和调试工具,确保各阶段代码的地址、权限和安全策略正确配置。