文章总结: 该文档从芯片基础入手,阐述了功耗、CPU性能及存储器原理,核心详解ARMv8架构下SOC从BootROM、ATF各阶段到U-Boot、Linux内核的完整启动链路。内容涵盖安全启动信任根、特权级切换、多核启动及MMU开启等关键技术实现,对理解嵌入式系统底层启动机制极具参考价值。
综合评分: 75
文章分类: 安全建设,二进制安全,安全开发
SOC启动流程
谈思实验室
2026年2月15日 18:01
上海
点击上方蓝字谈思实验室
获取更多汽车网络安全资讯
01
芯片漫谈
1.1 疑问:
1)芯片的功耗怎么来的?(动态功耗-晶体管翻转,静态功耗-漏电功耗)
2)CPU的设计宗旨是能又好又快的干活,怎么设计才能达到这个目的?(算法,编译器,指令集,微结构设计-(流水线、多发射等),主频-(受微结构、电路设计和工艺影响))
3)做上层开发为啥也要对CPU组织架构有了解?
1.2 芯片分解:
SOC->ALU等功能模块->逻辑门(与非门,或门等)->晶体管(PMOS/NMOS)
芯片、模块、逻辑门、晶体管和器件
CMOS,互补型金属氧化物半导体电路(Complementary Metal-Oxide-Semiconductor),
1.3 CMOS晶体管组成:
PMOS/NMOS
CMOS反相器
线宽
晶体管开关->输出0和1->对电容充放电->有功耗
线宽越小->工作电压越低,开关速度越快->运行频率越高->CPU性能越高
1.4 CPU性能:
- 提高频率(与线宽有关,线宽越细,频率上限越高),频率越高,时钟周期越短,每秒执行的指令数越多。
- 流水线(指令宽度,cache, MMU, TLB, 分支预测,乱序执行, 通过这些方法让流水线满负荷工作),将一条指令分成多个阶段执行,从而达到一个时钟完成一条指令。这也有利于提高CPU的主频。
- 超标量,本质上是多个执行单元同时工作,有多条指令流水线同时工作,是将一个任务中的指令并行执行。指令间的相关性会制约其性能发挥。
- 超线程,一个CPU核中,某些部件有多份,其他的部件共用。在操作系统看来会是像两个核在工作。能同时执行多个任务。
- 多核, 特定域架构(如SOC中集成NPU/GPU等)的推动因素:1)单个核的频率越来越高,导致功耗越来越高;2)线宽更细,线排列更密,增大了电阻和电容从而导致连线延迟增大,这时晶体管的开关速度已不是频率提高的制约;3)存储器的速度增加,远远落后于CPU的运算速度,带来数据访问的瓶颈。
超标量与超线程的对比:
1.5 SRAM与DRAM
- SRAM: 结构复杂,成本高,访问速度快,不需要动态刷新。 因此寄存器,cache, 都用SRAM
- DRAM: 结构简单,成本低, 访问速度慢,需要动态刷新。
02
SOC上电后
2.1 环境:
Qemu virt,ARMv8, ATF-2.9.0, u-boot.2021.1, linux
2.2 ARMv8特权级:
2.3 总体启动流程:
BL1(bootrom)->BL2->BL31->BL32(optee)->BL33(u-boot)->linux->启动init进程->加载根文件系统->切换到用户态->执行根文件系统中的init程序(busybox/systemv/systemd/androird下的init)->执行初始化脚本(busybox下的inittab, android下的init.rc)
2.4 BL1:
- 存储在ROM中,芯片出厂时固化在芯片中,无法更改。类似PC上的BIOS。它也是安全启动的信任根。
- 芯片上电后运行在EL3级别,所以BL1也是运行在EL3级别。
- BL1主要初始化EL3环境,执行平台相关初始化(如初始化串口,然后可以通过串口打输出log),加载BL2,准备跳转到BL2的相关参数并最终通过ERET跳转到BL2的入口。调用ERET前会设置。
2.5 BL2:
- 运行在EL1级别,DDR暂未初始化,因此BL2运行在SRAM中
- 加载BL31, BL32, BL33到DDR
- 通过SMC调用,进入BL1。 BL2运行在 EL1, 而BL31运行在EL3, 从低级别进入高级别只能通过SMC调用,无法通过ERET实现。BL2的SMC调用在bl2/bl2_main.c文件的bl2_main函数中:
- BL1异常处理中,会在函数smc_handler64中根据BL2传入的参数,进入到BL31执行。
在ARMv8触发SMC异常后,硬件会将PSTATE寄存器保存到SPSR_EL3,将异常处理完成后要返回的地址保存到ELR_EL3, 然后调用 ERET返回时,会将SPSR_EL3恢复到PSTATE, 将ELR_EL3恢复到PC。但我们这里在异常返回时是希望进入BL31执行,所以在smc_handler64的处理中,会把BL31的入口地址放到ELR_EL3中,这样执行ERET时就能进入到BL31里执行了。
2.6 BL31:
BL31会初始化GICv3及runtime service(SMC调用的服务),并进入BL33(u-boot)执行。
runtime_svc.c->runtime_svc_init函数:
主要是初始化SMC调用时的处理函数,rt_svc_descs通过 DECLARE_RT_SVC声明,并链接到RT_SVC_DESCS_START和RT_SVC_DESCS_END范围内. 当前qemu平台上会有两个rt_svc_descs, 分别是arm_arch_svc和std_svc。 分别在services/arm_arch_svc/arm_arch_svc_setup.c 和services/std_svc/std_svc_setup.c中声明
2.7 BL32(optee):
我们在qemu平台上没有支持trust os,所以没有进入BL32,这里略过。如果支持BL32, 则BL31通过ERET进入BL32, BL32完成初始化后通过SMC调用回到BL31然后BL31再进入BL33.
如果支持optee,我们会在BL31中执行一个opteed的runtime service, 如下:
其中opteed_setup函数会在上述runtime_svc.c->runtime_svc_init函数中被调用,在opteed_setup中会注册opteed_init函数,如下
该函数会在bl31_main函数中调用:
最终通过如下流程进入optee OS:
opteed_init->opteed_init_with_entry_point->opteed_synchronous_sp_entry->opteed_enter_sp->el3_exit
el3_exit会退出EL3到EL1并根据el3_elr进入optee os的入口执行。optee os的入口定义如下:
整个初始化函数代码如下optee_os/core/arch/arm/kernel/entry_a64.S
在_start函数结束时,会通过smc调用,返回到BL31,同时会将TEESMC_OPTEED_RETURN_ENTRY_DONE放在x0寄存器中传递下去。前面提到的注册opteed的runtime service中会注册一个smc的handler,如下:
该函数中会处理TEESMC_OPTEED_RETURN_ENTRY_DONE参数:
在这个参数处理中会通过如下流程返回到bl31_main函数中:
opteed_synchronous_sp_exit->opteed_exit_sp
opteed_exit_sp函数如下:
该函数恢复opteed_enter_sp函数中保存的一些寄存器,其中x30即lr寄存器中保存的是调用opteed_enter_sp时的返回地址,这样通过ret指令就能按如下顺序返回到bl31_main函数中:
opteed_exit_sp->opteed_synchronous_sp_entry->opteed_init_with_entry_point->opteed_init->bl31_main.
接下来在bl31_main中继续执行bl31_prepare_next_image_entry进入bl33(uboot)
2.8 BL33(u-boot):
u-boot比较复杂,支持的功能也很丰富。但主要任务还是为内核运行准备环境参数等。然后加载内核并跳转到内核入口执行。更多学习内容可阅读其自带的README文件:
AARCH64 u-boot的入口函数是 _start,代码位于arch/arm/cpu/armv8/start.S中,在该函数中会做如下处理:
- 保存启动参数
- 进行位置无关代码处理
- sctrl寄存器处理
- 不同异常等级的vbar寄存器设置
- slave cpu 进入低功耗
- 主CPU进入_main函数
_main函数代码位于arch/arm/lib/crt0_64.S, 该函数会做如下处理:
- 设置初始的C运行时环境(主要是设置sp)
- 调用board_init_f_alloc_reserve为gd和early malloc分配内存
- 调用board_init_f_init_reserve初始化gd和设置early malloc的堆管理器基地址
- 调用board_init_f进行板级的一系列初始化
- 设置重定位代码后的返回地址(lr寄存器的值)
- 调用relocate_code进行代码重定位。
其中board_init_f函数位于 common/board_f.c,函数如下:
这里会通过init_sequence_f这个列表调用大量的初始化函数。
在setup_dest_addr函数中会设置重定位的目标地址,并在setup_reloc中做调整
relocate_code的代码位于 arch/arm/lib/relocate_64.S, 主要会做如下处理:
- 创建一个栈帧
- 根据运行地址,重定位目标地址确定是否要进行代码重定位
- 根据重定位目标地址地址及链接地址计算偏移
- 进行代码重定位 -> 进行 .rela.dyn段处理
- 根据当前异常等级设置sctlr寄存器
- 清理cache
- 通过ret指令跳转的新的地址(relocation_return)执行
relocation_return位于arch/arm/lib/crt0_64.S, 主要做如下处理:
- 设置完整C运行环境
- 清BSS段
- 调用 board_init_r函数
board_init_r函数位于common/board_r.c, 如下:
同样会通过init_sequence_r这个函数列表调用一系列初始化操作。 初始化的最后会进入main_loop:
main_loop函数位于common/main.c:
2.9 Linux:
Linux内核的启动流程很大,主要有前半段的汇编和后半段进入start_kernel后的C语言部分
汇编初始化的部分包括:启动参数保存,创建页表,初始化CPU状态,C运行时环境初始化(使能MMU,设置异常向量表、栈、BSS段等。 C环境未初始化前不能访问变量及栈,不能调用C函数),然后跳转到start_kernel执行。
start_kernel又会进行大量的linux环境初始化,在初始化的最后会创建0号init进程。该进程开始时运行于内核态,会加载根文件系统,根文件系统加载成功后,切换到用户态继续运行。
然后从根文件系统中加载init程序(init进程加载init程序代码并执行,是两个概念),并执行该程序中的代码。这个init程序也是运行在init进程中。常见的init程序有busybox/systemV/systemD, android用的是自己开发的init程序。
这个init程序启动后根据init脚本的配置,执行大量的任务。在android中会执行init.rc脚本以启动大量的服务。
2.10 xx6上的差异:
xx6无BL2, BL1是自研,BL31用的是ATF提供的。因其支持的功能较多,如安全启动,待机,空片升级等,其复杂度远大于本文件介绍的基于qemu的流程,这里不详细说明。不过它们主要的流程原理基本一样。
2.11 系统启动时的多核处理:
典型的多核Linux启动过程
2.12 开MMU时的流水线怎么保证:
arm64会采用流水线结构,在MMU开启时,开启MMU指令之后几条指令已经进入流水线,且也已经完成了取指或译码等操作。而在它们取指的时候还是MMU off的状态,因此其地址还是物理地址。
为解决这个问题,内核中的做法是将这段开启MMU相关的代码的物理地址映射为相同的虚拟地址。
来源:知乎@nomoexc
https://zhuanlan.zhihu.com/p/656665645
谈思-汽车出海安全合规(欧洲)
交流群
谈思 AutoSec Europe 峰会旨在搭建一个能融汇全球视野与中国实践、连接技术前沿与落地应用的国际性专业平台,以助力中国汽车应对在出海过程中面临的网络与数据安全合规痛点。从前沿技术研讨、合规要点解析到经验交流,都将通过本平台为您提供持续支持。社群已超过200人,需邀请加入,如需入群,欢迎添加社群小助手微信taaslabs01。
谈思-SDV&AIDV技术出海
交流群
诚邀行业同仁加入谈思SDV&AIDV出海技术交流群,聚焦软件定义汽车、AI定义汽车、下一代EEA、智能座舱、智能驾驶、软件架构、域控制器开发、芯片技术、软件工具等核心议题,欢迎大家加群交流探讨~~社群已超过200人,需邀请加入,如需入群,欢迎添加社群小助手微信taaslabs01。
end
谈思汽车媒体门户
精品活动推荐
AutoSec系列沙龙
专业社群
部分入群专家来自:
新势力车企:
特斯拉、理想、极氪、小米、零跑汽车、阿维塔汽车、智己汽车、小鹏、岚图汽车、蔚来汽车、吉祥汽车、赛力斯……
外资传统主流车企代表:
大众中国、大众酷翼、奥迪汽车、宝马、福特、戴姆勒-奔驰、通用、保时捷、沃尔沃、现代汽车、日产汽车、捷豹路虎、斯堪尼亚……
内资传统主流车企:
吉利汽车、上汽乘用车、长城汽车、上汽大众、长安汽车、北京汽车、东风汽车、广汽、比亚迪、一汽集团、一汽解放、东风商用、上汽商用……
全球领先一级供应商:
博世、大陆集团、联合汽车电子、安波福、采埃孚、科世达、舍弗勒、霍尼韦尔、大疆、日立、哈曼、华为、百度、联想、联发科、普瑞均胜、德赛西威、蜂巢转向、均联智行、武汉光庭、星纪魅族、中车集团、潍柴集团、地平线、紫光同芯、字节跳动、……
二级供应商(500+以上):
中科数测、ETAS、BlackDuck、NXP、上海软件中心、Deloitte、奇安信、为辰信安、云驰未来、信长城、泽鹿安全、纽创信安、复旦微电子、天融信、奇虎360、中汽中心、中国汽研、上海汽检、加特兰微电子、浙江大学……
人员占比
公司类型占比
文章
不要错过哦,这可能是汽车网络安全产业最大的专属社区!
首发!小米雷军两会上就汽车数据安全问题建言:关于构建完善汽车数据安全管理体系的建议
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:谈思实验室 《SOC启动流程》