章节摘要:本章跟着一条线走——一块刚上电的裸芯片如何一步步走到 C 程序的 main 函数。沿这条启动主线,特权级模型、CSR 寄存器体系、陷入与委托机制逐一登场,最后以一次真实的启动失败排错收束:把规范条文变成能在调试器里验证的判断。
非特权规范回答"程序能做什么",特权规范回答"谁允许它做"。本章的主线是一次完整的上电旅程:复位向量处只有一条指令的功夫,机器处在最高特权级,中断未开、内存管理未启、时钟未配;随后引导代码一级级交接权限,直到应用程序在最低特权级上跑起来。这条主线上每个环节都对应一批 CSR 寄存器与规范条款——机器特权级的 mtvec 决定异常往哪儿跳,mstatus 掌管全局开关,委托寄存器决定哪些事务下放给操作系统。理解了这条交接链,第三章的内容就从"又一堆寄存器名"变成一张有因果的权力移交图。
上图既是启动流程也是每分钟都在发生的日常循环:应用跑着跑着撞上系统调用或时钟中断,控制权按委托规则上浮,处理完毕再降回去。特权级不是一次性布景,而是每秒都在上演的权力往返。
第一站 3.1 节讲特权级模型。RISC-V 定义三个特权级:机器级是宪法规定必须实现的地基,监督级是操作系统的地盘,用户级是应用程序的世界。 hart 这个概念也在此正式引入——规范不写"处理器"而写"硬件线程",因为多核与多线程实现里每个 hart 都有独立的特权状态。本节还会拆 xret 指令与 mstatus 里那两位"前级"字段:特权级的切换从来不是直接跳,而是"记录来路、改写目标、一指令降级"的三步舞。
第二站 3.2 节讲 CSR 体系与陷入处理。CSR 是特权架构的神经末梢:四千零九十六个地址空间里住着控制流(mtvec、mepc、mcause)、状态(mstatus、mie、mip)与配置(medeleg、mideleg、pmp 相关)。本节按"控制流三件套、委托二寄存器"的脉络把高频 CSR 过一遍,并完整走一遍异常进入与退出路径——包括向量模式与非向量模式的差别、嵌套陷入时 mstatus 里的自动关中断。
第三站 3.3 节是实战收束:从上电到 main 的启动链路,配一次完整的排错记录。引导阶段的每一棒——复位向量、引导加载、运行时初始化——都可能以特征明显的方式失败,排错的价值在于把 CSR 读数与规范条款对上号。

本章的认知转折点在"委托"这个概念。初学者容易把特权架构想成单向漏斗——所有异常都涌向机器级;规范的真实设计却是权力可下放:medeleg 把异常处理权让给监督级,mideleg 把中断处理权让渡出去,让操作系统的异常处理快路径不必绕道固件。这一设计把"固件与操作系统的权责边界"写进了架构本身,而不是留给私下的启动协议。想通这一点,你就明白为什么 RISC-V 的启动标准(从固件到内核的交接契约)能成为生态协同的关键枢纽——第三章末节的启动排错会把这个体会落到实处。
本章的落点:特权架构是三份清单加一套路由规则。清单一是机器级的 CSR 集,清单二是监督级的对应镜像,规则是谁该处理什么事务由委托寄存器当场裁决。掌握清单与路由,剩下的是查阅与练习。
启动主线走完后,系统获得了稳定的执行环境,但还有一个地基没铺:内存。程序访问的地址是真是假、谁有权碰哪块物理内存、多个 hart 同时写一块数据听谁的——第四章的页表、PMP 与一致性模型,就是给这条主线补上最后一块地基。