资讯动态

Linux 为什么必须要 MMU

发布时间:2026/9/30 6:55:35 来源:尧图企业网站定制
结论Linux 的进程模型依赖虚拟内存而 MMU 是硬件负责虚拟地址 ↔ 物理地址翻译同时提供内存权限检查没有 MMU 只能跑 uClinux无 MMU 版 Linux标准主线 Linux 必须 MMU。 RISC-V 上就是S 模式 Sv39/Sv48 MMU定义在 Privileged 特权架构规范里。1. 核心需求进程之间的地址空间隔离每个应用进程独立虚拟地址空间都以为自己独占全部内存都可以从地址 0 开始布局。进程 A 访问的0x1000和进程 B 访问的0x1000经过 MMU 翻译指向完全不同的物理内存。如果一个进程非法访问、崩溃不会篡改其他进程或者内核的内存。没有 MMUuClinux所有进程直接用物理地址没有硬件隔离。进程一旦越界写内存直接干掉内核 / 其他程序稳定性很差。2. 内存权限保护读 / 写 / 执行 R/W/XMMU 页表项自带权限位内核内存只允许内核态访问用户态进程不能读、更不能写代码段可读 可执行不可写防止缓冲区溢出注入恶意代码数据段可读可写不可执行 硬件在访存时MMU 自动检查权限违反直接触发 Page Fault 异常内核杀掉非法进程。RISC-V Sv 页表的R/W/X/U位就是这个功能。 PMP 是 M 模式的简单保护粒度粗不支持每个进程独立地址空间不能替代 MMU。3. 按需内存分配 Swap 交换虚拟内存Demand Paging缺页加载程序很大但不是全部代码立刻载入内存。进程访问还没加载的页面 → MMU 报 Page FaultLinux 内核把磁盘文件读入内存再重新执行指令。Swap物理内存不够时把不常用页面写到磁盘 swap 分区腾物理内存给活跃程序。这两个功能完全依赖 MMU 的 page fault 异常机制无 MMU 系统做不到标准 swap。4. 地址重定位简化程序编译应用程序编译成位置无关代码 (PIC)或者虚拟地址链接不用关心物理内存放在哪里。内核只需要修改页表就能把同一个程序加载到物理内存任意位置不用重写程序本身。 无 MMU 系统编译时必须预先固定物理地址或者做软件重定位非常麻烦。5. 内存透明映射mmapmmap把文件直接映射到进程虚拟地址访问文件就像访问内存。依赖 MMU 的页表映射机制。补充uClinux不带 MMU 的 Linux可以跑在没有 MMU 的 RISC-V MCU只 MU无 Sv MMU代价没有硬件进程隔离没有 swapfork 系统调用不支持只能 vfork内存保护能力弱内存越界容易系统崩溃嵌入式极简场景使用不是主线标准 Linux。RISC-V 视角结合特权规范标准 Linux 跑在 RISC-VS 模式S 模式satp寄存器开启 Sv 虚拟内存MMUsatp 存放根页表物理基址CPU 取指 /load/store硬件 MMU 自动做 VA→PA 翻译检查页面权限访问非法页面触发 S 模式 Page Fault 异常Linux 内核处理

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑