当前位置: 首页 > java >正文

字节跳动社招面经 —— BSP驱动工程师(5)

接前一篇文章:字节跳动社招面经 —— BSP驱动工程师(4)

本文内容参考:

ARM64架构启动流程_arm64 linux kernel 启动流程-CSDN博客

特此致谢!

上一回讲解了“嵌入式充电站”发的一篇文章字节跳动社招面经——BSP驱动工程师中的面试题一面的第2题,本回解析第3题。再次贴出面试题:

3. arm64启动流程

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

(1)硬件上电与BootROM执行

1)复位向量(Reset Vector)

CPU上电后,从固定地址(通常为0x00000000或厂商定义的地址)开始执行BootROM代码。

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

2)异常级别(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)
  • 任务

a. 初始化关键外设(如UART调试串口、DRAM控制器);

b. 设置异常向量表(Exception Vector Table);

c. 加载下一阶段Bootloader(如U-Boot)到内存;

d. 切换异常级别(从EL3 → EL2或EL1)。

  • 示例代码(ATF跳转)
bl31_main() {// 初始化平台硬件plat_initialize();// 跳转到非安全世界(EL2/EL1)enter_normal_world();
}

2)阶段 2:Secondary Bootloader(如U-Boot)

  • 任务

a. 完整内存映射初始化(如DDR配置);

b. 加载设备树(Device Tree Blob,DTB)或ACPI表;

c. 从存储介质(eMMC、NVMe、网络)加载操作系统内核(如Linux);

d. 传递启动参数(内核地址、设备树地址、命令行参数)。

  • U-Boot命令示例

# 从 eMMC 加载内核和设备树到内存
load mmc 0:1 ${kernel_addr_r} Image
load mmc 0:1 ${fdt_addr_r} dtb.dtb
# 启动内核
booti ${kernel_addr_r} - ${fdt_addr_r}

(3)操作系统内核启动

1)内核解压与重定位(如Linux)
  • 任务

a. 自解压(如果内核为压缩格式,如Image.gz);

b. 初始化页表、MMU和缓存;

c. 解析设备树或ACPI,初始化硬件(如中断控制器、PCIe、USB);

d. 挂载根文件系统,启动用户空间初始化进程(如systemdinit)。

  • 内核启动流程
start_kernel() {setup_arch();          // 架构相关初始化(ARM64)init_irq();            // 中断控制器初始化(GIC)time_init();           // 时钟源初始化rest_init();           // 创建 init 进程
}

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

  • 主核(Primary Core)

执行完整启动流程。

  • 从核(Secondary Cores)

a. 上电后处于等待状态(通过spin-table或PSCI协议);

b. 主核通过发送中断(SGI)或设置唤醒地址唤醒从核;

c. 从核跳转到内核指定的入口地址(如secondary_startup)。

  • 示例(设备树配置spin-table)
cpu@1 {device_type = "cpu";reg = <0x0 0x1>;enable-method = "spin-table";cpu-release-addr = <0x0 0x8000fff8>;
};

更多内容请看下回。

http://www.xdnf.cn/news/10546.html

相关文章:

  • webfuture:如何屏蔽后台发文界面的保存为新文章按钮?
  • 使用 fastai 进行文本分类的简明指南 - Fastai Part 5
  • 【仿muduo库实现并发服务器】使用正则表达式提取HTTP元素
  • java基础学习(二十一)
  • oscp练习 PG Wombo
  • 「完整」AI文档库 | 5月20最新发布,221页,《北京大学AI+Agent与Agentic+AI的原理和应用洞察与未来展望》
  • ChatOn:智能AI聊天助手,开启高效互动新时代
  • pikachu靶场通关笔记09 XSS关卡05-DOM型XSS-X
  • 第18讲、Odoo接口开发详解:原理、类型与实践
  • 【软件测试】火狐驱动下载镜像
  • Golang学习之旅
  • linux驱动 - 5: simple usb device驱动
  • 小白的进阶之路系列之十----人工智能从初步到精通pytorch综合运用的讲解第三部分
  • CppCon 2014 学习:Exception-Safe Coding
  • [免费]微信小程序网上花店系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
  • Cesium快速入门到精通系列教程四:加载渲染GEOJSON数据
  • BA-SAM: 用于 Segment Anything 模型的可扩展偏置模式注意力掩码
  • vue-13(延迟加载路由)
  • Oracle的Hint
  • 2025/6月最新Cursor(0.50.5版本)一键自动更换邮箱无限续杯教程
  • Spring 5 响应式编程:构建高性能全栈应用的关键
  • 数据库系统概论(十二)SQL 基于派生表的查询 超详细讲解(附带例题表格对比带你一步步掌握)
  • MySQL-多表关系、多表查询
  • Qt OpenGL 相机实现
  • 机器学习算法:逻辑回归
  • 操作系统复习
  • 方法重写与方法重载详解
  • CSS之动画(奔跑的熊、两面反转盒子、3D导航栏、旋转木马)
  • 谷歌CEO皮查伊眼中的“下一代平台“与未来图景
  • 基于FPGA的VGA显示文字和动态数字基础例程,进而动态显示数据,类似温湿度等