Uncategorized

RISC-V 批评考:dmitry.gr 的“他们本该更懂”

dmitry.gr 是 Dmitry Grinberg 的个人站,作者以 rePalm(把 Palm OS 移植到 ARM)、自制 USB 设备等低层嵌入式黑魔法闻名。2026 年 8 月中旬他发了一篇长文《RISC-V: They Should Have Known Better》,声明把所有对 RISC-V 的批评集中到一处,方便反对者逐条反驳。文章很长、很愤怒,但具体到可以逐一核验。

最扎实的部分是中断路径的账。RISC-V 的 RV32I 没有硬件压栈,中断入口要用 CSRRW 借寄存器、再手工保存 ra/sp/gp/tp 等 ABI 寄存器,作者估算入口约 21 周期、出口约 20 周期、加上跳转共 44 周期;而 Cortex-M0 在硬件里压栈,入口 15 周期、出口 12 周期、处理器直接进入 C 写的中断处理器。即便用寄存器减半的 RV32E,也仍比 M0 慢三分之一。这解释了为什么各家得自造 CLIC / “fast IRQ” 扩展才能追平一颗十年前的老核——而每造一个扩展,标准就更碎一分。

压缩指令的批评同样具体。16 位 C 扩展里,存半字的偏移范围只有 0/2 两个值,存字节 0–3;而 Cortex-M0 的 16 位指令允许字节 0–31、半字 0–62、字 0–124。更糟的是字节/半字存取根本不在 C 扩展里,而在另一个叫 Zcb 的可选扩展中。作者还统计了一个真实 aarch64 内核镜像(树莓派 vmlinuz-6.1.0-49,给了 sha256):35,393 个位测试分支指令 TBZ/TBNZ,对应 70,109 个 RET——平均每两个函数就有一个能用“测试并跳转”;位域插入/提取指令合计约 1.5 万条。而 RISC-V 直到 2021 年才批准 Zba(移位+加法),被戏称为“两年才意识到数组存在”;Zbs 只提供单比特提取,被形容为“干净、简单、优雅、完全没用”。

编码部分最惊人的是冲突问题:由于扩展组合,同一个字节序列在不同核心上可能是完全不同的指令。0xA002 在支持 Zcmp 的核心上是 CM.JT 跳转,在不支持的核上是 C.FSDSP 浮点压栈;0xAC66 则可能是浮点存栈或两条寄存器移动。他讲了一条完全合理的故障链:供应商二进制 blob 链接进新 MCU 后随机崩溃、寄存器被静默改写、没有未定义指令陷阱、FAE 上门排查电源噪声——因为升级处理器把合法二进制变成了语义不同的合法二进制。“x86 用五十年保持了语义稳定,而这张白纸设计的架构没撑过五年。”

对“一切皆可选”的批评也很尖刻:乘法、除法、用户态、监管态、CSR、压缩指令全是可选项,“如果能得逞他们大概会把加法也做成可选”。RISC-V 基金会的回应是 profiles(RVA23)——一个第二层标准,专门规定第一层标准的哪些部分必须实现。作者列举的现有 SBC(VisionFive 2、BPI-F3、Lichee Pi 4A、Orange Pi RV2、HiFive Premier P550)几乎没有一台达标,永远跑不了 Ubuntu LTS 或未来 AOSP;并调侃说唯一的理想发行版是 Gentoo——那个坚持为每台机器从源码编译的发行版。结尾他引用 RISC-V 官方 rationale 文档里的一句话来解释这一切:设计者“想从白纸开始,而不是修改 OpenRISC”。

我的核验笔记:文章里的硬数据(Cortex-M0 的 15/12 周期、Zcb 偏移范围、Zba 2021 年批准、0xA002/0xAC66 编码冲突、RVA23 列表)都来自公开规范或可复算的统计,作者给了具体方法与校验和,属于“可以复核的强论点”;但也要看到,批评集中在 ISA 纸面设计,而 RISC-V 的赢面恰恰在生态经济学——免费核心加免费规范,在“性能不是关键、价格是关键”的市场(8051 替换、ML 加速器里的 babysitter 核)它必然赢。作者自己也承认这一点,只是坚持“它是被选中当便宜的,不是当好的”;桌面与服务器端,他的结论是 RISC-V 不会成为严肃玩家。这篇文的争议不会小,值得后续找 RISC-V 阵营的系统性反驳对照着读——这也是把论点写清楚的最大价值。