RISC-V 和 ARM 彻底抛弃了 x86 那种“分段式内存管理(Segmentation)”,全面转向了“分页式(Paging)”。
这是现代 CPU 架构对 x86 历史包袱的一次“大清洗”。
🧱 核心区别:三种内存管理模式
| 架构 | 内存管理方式 | 核心逻辑 | 现状 |
|---|---|---|---|
| x86 | 分段 + 分页(混合) | 先通过“段寄存器”切蛋糕(CS, DS),再用“页表”切小块。 | 历史包袱。64位模式(Long Mode)下强制禁用分段(段基址=0),仅保留权限检查。 |
| ARM (AArch64) | 纯分页 (MMU) | 只有“页表”。虚拟地址直接通过多级页表映射到物理地址。 | 现代标准。简洁高效,无冗余转换。 |
| RISC-V (RV64) | 纯分页 (Sv39/48/57) | 同 ARM。甚至比 ARM 更干净,连 x86 那种“假装分段”的机制都没有。 | 极简设计。指令集里压根没提“段”这个概念。 |
🔍 为什么 RISC-V/ARM 要“砍掉”分段?
x86 的分段是 1978 年 Intel 8086 为了在 16 位下访问 1MB 内存而设计的权宜之计。到了 64 位时代,它变成了纯累赘:
- 性能开销:每次内存访问都要做
段基址 + 偏移量的加法,多一步计算就多一份延迟。 - 复杂性:引入了“全局描述符表(GDT)”、“局部描述符表(LDT)”等复杂概念,OS 开发者恨之入骨。
- 无用武之地:现代操作系统(Linux, Windows, macOS)只用分页来隔离进程(每个进程有自己的页表)。分段提供的“保护”功能,分页做得更好。
💡 RISC-V 的“分页”长什么样?
RISC-V 用一套非常数学化的方案(Sv39/48/57)解决了 64 位寻址问题:
- Sv39:39 位虚拟地址。这是当前主流(如 Linux 默认)。虽然指针是 64 位,但高 25 位必须是全 0 或全 1(符号扩展),实际只用 39 位,相当于 512 GB 的虚拟空间。(为什么这么小?因为做 64 级页表太费晶体管,39 位够 99.9% 的应用用到天荒地老)
- Sv48:48 位虚拟地址(256 TB)。给大型数据库或超级算力用。
- Sv57:57 位虚拟地址(128 PB)。面向未来的“大内存”机器。
结论:如果你在写 RISC-V 或 ARM 的裸机程序,你永远不需要像在 x86 实模式下那样去设置 DS 或 CS 寄存器。内存就是一张平坦的大地图,靠页表来划分疆域。
RISC-V和ARM采用定长指令,而x86采用变长指令,这源于它们不同的设计哲学和历史路径。
核心答案:这是RISC(精简指令集)与CISC(复杂指令集)两种设计理念的根本区别。
-
RISC-V / ARM(定长指令)的设计目标:简单与高效
- 简化硬件设计:固定长度的指令(如32位)使得处理器取指、译码的电路非常简单、快速。指令对齐规整,易于实现高效的流水线和并行处理。
- 追求性能:通过精简指令,将复杂操作交由编译器用多条简单指令组合完成,让硬件专注于加速这些简单、常用的指令。这种设计在功耗和性能上往往更有优势。
- RISC-V作为后来者:可以完全摒弃历史包袱,采用最简洁、模块化的定长指令集设计。
-
x86(变长指令)的历史原因与设计目标:兼容性与代码密度
- 历史包袱与向后兼容:x86架构始于1978年的8086处理器,当时内存极其昂贵和稀缺。为了用更少的字节表示更多操作(提高代码密度),节省内存,设计采用了变长指令(1到15字节不等)。近50年来,为了保持每一代新产品都能运行旧软件,这种变长格式必须被一直继承和扩展。
- 复杂指令集(CISC)思想:早期设计倾向于让单条指令完成更复杂的工作(如内存操作数直接参与运算),这自然导致了指令长度不一。虽然现代x86 CPU内部会将复杂指令拆解成类似RISC的微操作来执行,但对外依然保持变长指令集以维持兼容。
简单对比:
- 定长指令(RISC-V/ARM):译码简单、硬件高效,适合追求能效、可预测性的场景(如移动设备、嵌入式系统)。
- 变长指令(x86):代码紧凑、历史兼容性强,但译码电路极其复杂,需要强大的前端设计来化解变长指令带来的挑战。
总结来说,定长与变长的选择,是“设计简洁性/效率”与“历史兼容性/代码密度”在不同历史时期和不同目标下的权衡结果。
本文发表于 0001-01-01,最后修改于 0001-01-01。
本站永久域名「 jiavvc.top 」,也可搜索「 极客油画 」找到我。

