ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【risc-v专栏01】地图与心智模型

【risc-v专栏01】地图与心智模型 本篇定位:RISC-V 专题的第 1 章,一张总图——RISC-V 到底是什么、分几层、spec 怎么读、你站在哪一层、后面 9 格怎么挂上去。这张图立起来,后面读 spec 读到的任何东西都有地方挂,看了就忘的根就从这开始断。目录一、RISC-V 的设计哲学1. 模块化(Modular)——不是一坨,是拼装2. 分层(Layered)——三本 spec,各管一层3. 精简(RISC)——base 故意很小二、三级特权金字塔:M / S / U每一级干什么模式之间怎么切换三、M-mode 辐射:你的学习总图9 格怎么挂四、spec 怎么读:顺序与跳读法不推荐:从头到尾通读推荐:问题驱动跳读 本专题导航各本 spec 的重点章节速查五、ARM vs RISC-V六、本篇小结速查表一、RISC-V 的设计哲学你好 这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章了解一下Markdown的基本语法知识。理解 RISC-V,先理解它为什么被设计成这样。三个核心思想贯穿全套 spec:1. 模块化(Modular)——不是一坨,是拼装ARM 的指令集是一坨大的:ARMv7、ARMv8,选了一个就一整套给你。RISC-V 反过来,它只有一个很小的 base(基础集),其余全是可选扩展,按需拼装。RISC-V base ISA(必选,很小) 一堆扩展(可选,按需加) │ ├─ M 扩展(乘除法) ├─ A 扩展(原子操作) ├─ F/D 扩展(单/双精度浮点) ├─ C 扩展(压缩指令) ├─ V 扩展(向量) ├─ B 扩展(位操作) ├─ K 扩展(加密) └─ X 扩展(自定义,你公司 AI 加速器指令就在这)想要省代码 → 加 C想要硬件浮点 → 加 F 或 D想要 AI 加速 → 加 V 或自定义 X一个极简核只要 base,连 M 都不要2. 分层(Layered)——三本 spec,各管一层RISC-V 规范分成三本独立的 spec,各管一层,互不耦合:spec 卷管什么你的关系Unprivileged ISA(非特权 ISA)用户态能用的指令:base 整数指令、扩展指令、寄存器、ABI天天用,汇编/编码/调用约定在这Privileged Architecture(特权架构)M/S/U 三级特权、CSR、trap、中断、内存保护、页表你的主场,bootrom/RTOS 全在这层External Debug(外部调试)JTAG 调试、调试 CSR(DCSR/DPC)、调试模块触达,gdb 调试时间接用关键认知:三本 spec 解耦。可以只读 Privileged(BSP主场),不碰 Unprivileged 的浮点细节;反过来应用层程序员只读 Unprivileged,不碰特权。这和 ARM 把所有东西揉在一本 ARM ARM 里不同——RISC-V 让你按角色读。3. 精简(RISC)——base 故意很小RISC-V 的 “RISC” 是 Reduced Instruction Set Computer。base ISA(rv32i)只有40 条左右指令,故意做得极小:整数运算:add/sub/and/or/xor/slt/shift…访存:lw/lh/lb/sw/sb/sh(只有 load/store 访存,运算不直接碰内存)控制流:jal/jalr/branch 系列系统:ecall/ebreak/fence/csr 指令没有的话怎么办?靠扩展或软件。除法不在 base 里(M 扩展才有硬件除法),浮点不在 base 里(F/D 扩展),乘法也不在 base 里(M 扩展)。一个极简的 rv32i 核连乘法都得软件实现。为什么故意这么小小 base 低实现成本 适合从最小的 MCU 到最大的服务器都能用。ARM Cortex-M0 也精简,但 ARM 整体生态被历史包袱拖重;RISC-V 没包袱,从白纸开始设计,base 只留最通用的。代价是你想要什么功能得显式加扩展(-march 拼),不像 ARM 默认给你一大坨。对你做资源受限的 MCU,这种按需付费反而是优势——你不用的扩展一点不占代码空间。二、三级特权金字塔:M / S / URISC-V 定义了三个特权级别(privilege levels),权限从高到低:┌─────────────┐ │ M(Machine) │ ← 最高,全权,你的 bootrom/RTOS 在这 │ 机器模式 │ 能读写所有 CSR、执行所有指令、访问所有内存 └──────┬──────┘ │ 委派 ┌──────┴──────┐ │ S(Supervisor)│ ← 操作系统内核(Linux)在这 │ 监管模式 │ 管页表、受限于 M 划的权限 └──────┬──────┘ │ 委派 ┌──────┴──────┐ │ U(User) │ ← 用户应用 │ 用户模式 │ 最弱,受 S 管的页表限制 └─────────────┘每一级干什么级别谁住这能干什么CSR 访问Mbootrom、裸机固件、RTOS 内核、 bootloader一切:读写所有 CSR、所有指令、所有内存、配中断、配 PMP全部 CSRSLinux 内核、RTOS(若开 S 模式)受限:管 S-mode CSR、页表、S 级中断仅 S 级 CSRU用户进程最弱:不能直接碰硬件、不能随便访内存几乎不能访问 CSR模式之间怎么切换M ←── mret ──┐ ┌── sret ──→ U │ │ └── trap ──────┘ (从 U/S 进 M) (从 U 进 S)trap(陷入):U/S 执行 ecall、或发生异常/中断,CPU 自动跳到高一级(或同级)的 trap 入口mret/sret(返回):trap 处理完,用 mret(M级)/sret(S级)返回原模式这套机制是 ④trap 专题的核心,这里只要知道:M/S/U 之间靠 trap 和 ret 指令切换,切换时硬件自动改 mstatus 里的模式位。三、M-mode 辐射:你的学习总图把上面三件套(模块化/分层/精简)和三级特权(M/S/U)合起来,就是整个专题的总图。你是 M-mode 程序员,M 是锚点,从这里辐射:L3 扩展 — 选学,触达式⑧ 扩展生态 M/A/F/D/C/V/B/K⑨ 工具链深挖 relaxation/ELF⑩ 调试与性能 PMU/DebugL2 进阶 — 必学,可延后⑤ 中断系统 PLIC/CLINT/AIA⑥ 内存 PMP/MMU/RVWMO⑦ 启动与 bare-metal 流程L1 地基 — 必学,立即服务工作① 地图与心智模型本篇② base ISA ABI 寄存器约定③ CSR 与特权架构 M/S/U④ trap 机制★最核心 M-mode 主场(你的锚点)9 格怎么挂后面 9 篇,每篇对应一格。读 spec 或工作中碰到任何 RISC-V 知识,先问:“它挂 9 格哪格?”碰到的东西挂哪格一个 CSR 名字(mstatus/mepc…)③CSR(机制层面)/ ④trap(若和 trap 相关)一条汇编指令(jal/lw/csrw…)②base ISA死机了/异常了/中断进了④trap(入口)/ ⑤中断(若经 PLIC)启动汇编/链接脚本/ROM 固化⑦启动 / ⑨工具链评估新芯片支持什么扩展⑧扩展生态性能剖析/cycle 计数⑩调试与性能-march/-mabi 选不对⑧扩展 / ⑨工具链DMA/cache 一致性⑥内存挂不上 那格还空 先建空格再填。这就是治看了就忘的挂载法四、spec 怎么读:顺序与跳读法RISC-V 官方 spec 推荐读法:不推荐:从头到尾通读Unprivileged ISA 有几百页,Privileged 也有几百页,通读会睡着,而且 80% 的细节你暂时用不上。推荐:问题驱动跳读 本专题导航先读本专题每篇的核心重点——我把 spec 里对你有用的部分提炼了,先建框架碰到具体问题再翻 spec 对应章节——带着问题读,记得住spec 当字典查,不当小说读各本 spec 的重点章节速查Privileged Architecture(你的主 spec):Ch.3(机器级 CSR):mstatus/mepc/mcause/mtvec/mscratch…—— ③的核心Ch.4(控制转移 trap):trap 入口/mret/异常优先级—— ④的核心Ch.5-7(中断):CLINT/PLIC/AIA—— ⑤的核心Ch.3.6(PMP):物理内存保护—— ⑥Ch.4.4(Sv39/Sv48 页表):MMU—— ⑥(选读)Unprivileged ISA(选读):Ch.2(RV32I base):寄存器/指令格式/调用约定—— ②的核心Ch.16(RVC 压缩指令):16 位变长—— ②Ch.7(RV32M 乘除)/ Ch.8(RV32A 原子)/ Ch.9-10(FD 浮点)—— ⑧[!tip] spec 版本RISC-V spec 在持续演进( ratified 版本逐步冻结)。你读的时候以最新 ratified 版为准,但核心 trap/CSR/base ISA 多年稳定,不用担心读完过时。扩展(V/B/K)还在演进,这部分碰到了查最新。五、ARM vs RISC-V很多概念能直接迁移,但有几处设计哲学差异概念ARM Cortex-MRISC-V差异本质异常入口硬件自动压 8 寄存器硬件只改 CSR,软件压栈RISC-V 把活留给软件,灵活但你要负责异常原因SCB-CFSR 等寄存器mcause(一个编号) mtval(地址)RISC-V 用编号统一,你要查表返回指令BX LR(LREXC_RETURN)mretRISC-V 专用指令,不靠 LR 魔法值中断向量表向量表头 自动跳转mtvec(direct 或 vectored)RISC-V 两种模式可选特权级别Handler/Thread 两态M/S/U 三态RISC-V 更细,能跑完整 OS指令长度Thumb 16/32 混合RVC 16/32 混合(可选)类似,RISC-V 的 C 是可选的通用寄存器R0-R15(16个)x0-x31(32个)RISC-V 更多,调用约定不同压栈约定callee-saved R4-R11callee-saved s0-s11概念一样,寄存器名变最大的思维转换ARM Cortex-M 把大量异常处理逻辑做进硬件(自动压栈、自动选 MSP/PSP、LR 变 EXC_RETURN),你写 handler 像写普通 C 函数。RISC-V 把这些全交给软件:trap 入口是你写的汇编,压哪些寄存器你定,栈切换靠你操作 mscratch。灵活度极高,但责任也全在你。六、本篇小结RISC-V 一套开源指令集规范(不是具体芯片),三本 spec 分层:Unprivileged(用户指令)/ Privileged(特权,M/S/U)/ Debug设计哲学三件套:模块化(base 扩展拼装)/分层(三 spec 解耦)/精简(base 仅 ~40 条)三级特权 M/S/U,你做 BSP/bootrom/RTOS 在M 级,全权但也全责学习总图:M-mode 辐射 9 格,读到的任何知识先问挂哪格spec 当字典查不当小说读,问题驱动跳读ARM → RISC-V 最大转换:trap 处理从硬件自动变软件手动速查表你想知道看哪RISC-V 是什么一套开源 ISA 规范,base 扩展拼装spec 分几本3 本:Unprivileged / Privileged / DebugM/S/U 谁管页表S 级(Sv39/Sv48)M 级能用所有 CSR 吗能,M 全权base 有多少指令~40 条(rv32i)怎么选扩展-march 拼装,如 rv32imacspec 怎么读当字典查,问题驱动,别通读和 ARM 最大差异trap 处理:ARM 硬件自动,RISC-V 软件手动技术之路漫漫分享是为了更好地交流。如果本文的内容对你有启发希望能得到你的点赞 和收藏 ⭐。如果你在调试过程中遇到了其他问题欢迎在评论区 留言我们一起探讨。也欢迎关注 我一起交流底层开发的那些事儿。
返回列表