内存管理五大技术概念:MMU、IOMMU、MMIO、mmap、ioremap

在现代计算机体系结构中,内存管理、设备交互与虚拟化技术是支撑系统高效、安全运行的核心支柱。从CPU 对内存的访问管控,到外设与内存的直接数据传输一系列硬件单元与软件机制的协同,构成了计算机 I/O 与内存交互的完整链路。

本文将围绕MMU、IOMMU、MMIO三大核心硬件技术,结合 mmap 与 ioremap 两大软件映射机制,拆解它们的功能、演进历程,以及在实际场景中的协同工作原理。

一、MMU 和 IOMMU

MMU(Memory Management Unit)和IOMMU(Input-Output Memory Management Unit)都是基于页表的、用于实现地址空间隔离和转换的硬件单元。

1.MMU

MMU出现于1960年代。那个时期是计算机从实验室走向商用、从单一系统转向通用系统的黄金时期,业界面临着“如何让昂贵的计算机同时为更多用户服务?如何让复杂的软件易于开发?”等问题,而MMU则作为解决这些问题的核心硬件应运而生。

MMU集成于CPU核心内部,主要就是为CPU提供从虚拟地址到物理地址的转换功能。

MMU为什么需要集成在CPU核心内部呢?

这是因为MMU会处理CPU核心发出的每一条内存访问指令,地址转换需要在纳秒级别完成,否则会严重拖慢整个系统的速度。

ARM芯片MMU位置和功能示意图

为什么需要MMU呢?下面总结了三点原因

第一,MMU能提供内存保护的作用。

在多道程序操作系统中,多个程序需要同时在内存中运行。如果没有隔离,一个进程的错误(如野指针)会轻易地覆盖另一个进程甚至操作系统的数据,导致系统崩溃。

而MMU能提供内存保护作用,限制某个进程对其他进程资源的访问权限。

在MMU用于地址转换的页表项中,除了保存物理页号,还包含关键的权限标志位。

当CPU发出一个内存访问请求时,MMU在查找页表完成地址转换的同一时刻,会并行检查这些权限位。任何违规都会立即中止访问,并触发异常,将控制权交还给操作系统处理。

第二,MMU能和操作系统协同,给各进程提供独立的地址空间。

每个进程都有自己独立的、由操作系统维护的页表,而CPU在切换进程时,会指示MMU切换到对应的页表。比如我们将一个程序同时运行多次的时候,不会造成同一个地址既储存了一个进程的指令或数据又储存另一个进程的指令或数据的情况。

第三,MMU能简化程序开发。

在只有物理内存的时代,程序员需要关心程序具体加载到内存的哪个位置,内存碎片化问题严重,程序大小也受物理内存限制。

而有了MMU之后,MMU 把“物理内存有多小、有多碎、被谁占着”全部抽象掉,留给程序员一个“巨大、私有、连续、永远可用”的幻觉;同时把“按需分配、共享、换入换出、写时复制”做成了幕后支撑技术,这大大简化了程序员的程序开发。

现在,还有没有不带MMU的处理器呢?

有的,MCU、实时控制、超低功耗 IoT 领域的处理器,很多都没有MMU。比如Cortex-M 全系列都没有 MMU,只有可选的 MPU(内存保护单元,不能做页式虚存);RISC-V阵营不少芯片也都把MMU作为可选项。

没有MMU,可以省掉面积和功耗,降低成本;另外对实时控制来说,没有MMU意味着没有“缺页异常”这种不可预测的延迟,程序执行时间可严格计算,这点至关重要。

2.IOMMU

IOMMU出现在1990年代,1992年SUN的《sun4m Architecture Porting Guide》文档中描述了他们的I/O MMU和 I/O Cache技术,2000年代中期,AMD和Intel分别发布AMD-Vi和VT-d规范。

IOMMU在不同平台上有不同的叫法。在X86平台上:AMD称其为 I/O Virtualization(IOMMU),而Intel称其为VT-d;在ARM平台上称其为SMMU;在RISC-V直接称其为IOMMU。

IOMMU的出现主要是解决下面两个问题:

(1)CPU从32位过渡到64位,而设备却只能访问低端4GB内存,为了系统正常运作需要在低4GB内存区域预留缓冲区,并需要占用CPU周期将缓冲区内容拷贝到高位地址。

(2)单机性能强大,虚拟化和云计算成为主流,需要有在一台物理服务器上安全、高效地运行多个虚拟机的方案。

IOMMU曾经是被放置在独立的芯片比如北桥中,后面,随着CPU集成度的提高,IOMMU的位置也顺势封装到了CPU芯片内部,但位于计算核心之外,紧挨着集成进来的PCIe等I/O控制器。

IOMMU 的核心价值是管控 I/O 设备的内存访问权限与地址转换,具体实现三大核心功能:

(1)地址转换(Address Translation)

将 I/O 设备发出的物理地址(或设备虚拟地址)转换为系统可识别的物理内存地址,支持设备使用虚拟地址直接访问内存(类似 CPU 的虚拟内存机制)。

(2)内存隔离与权限控制(Isolation & Permission Control)

为每个 I/O 设备分配独立的地址空间和访问权限,限制设备只能访问其授权的内存区域,防止非法访问。

(3) 中断重映射(Interrupt Remapping)

对 I/O 设备发出的中断请求进行重映射和隔离,确保中断被正确路由到目标 CPU 核心或虚拟机,同时防止中断注入攻击。

通过IOMMU技术,可以优化 I/O 性能与资源利用率, 简化虚拟化与容器化部署,提升系统的安全性和稳定性。

二、MMIO

MMIO(Memory-Mapped I/O)是一种把外设寄存器映射到 CPU 统一地址空间的编址方式。

这种方式起源比较早,1970年代就出现了,并于1992年被纳入PCI规范,并沿用至今,成为和外设交互的主流IO技术。

和PIO(Port-Mapped I/O)相比,MMIO无需专用的IO指令,因此不需要额外搭建区分内存访问和I/O访问的地址解码电路,可简化指令集设计和内部电路布局。MMIO还可复用MMU、地址总线等硬件资源,可以让整体硬件逻辑更加简洁。

在驱动开发方面,开发人员不需要掌握专用指令,使用和内存操作一样的统一的编程方式就可以控制外设,这也降低了驱动开发的学习成本和实现成本。

三、MMU、IOMMU、MMIO的配合

下面我们以用户把在虚拟机上把数据发往网卡为例,看它们三者的配合情况:

Step1,CPU 准备数据包

进程先在虚拟地址空间分配一块内存存放要发送的数据包

Step2,MMU 将 CPU 虚拟地址转为物理地址

MMU将Step1中的虚拟地址映射成物理地址

Step3,CPU 通过 MMIO 配置网卡

网卡的寄存器映射在MMIO 物理地址空间(由 BAR 分配)。CPU 先通过ioremap把 MMIO 物理地址转为内核虚拟地址,再通过 MMIO 配置网卡的 DMA 参数,将DMA的目标地址填成Step2的物理地址。

Step4,CPU 通过 MMIO 触发网卡 DMA(MMIO 操作)

CPU 写 MMIO 的 DMA 启动寄存器,触发网卡发起 DMA 请求。

网卡收到 MMIO 的 “启动指令” 后,立即发起 DMA 请求

Step 5,IOMMU 管控网卡 DMA 请求(地址转换 + 权限校验)

IOMMU将物理地址转成宿主机真实物理地址,并校验权限看是否越权,没有则放行

Step6,网卡 DMA 读取内存数据,完成发送

Step7,CPU 通过 MMIO 查询发送状态(MMIO 收尾)

四、mmap和ioremap

mmap和ioremap是操作系统中用于将物理资源映射到虚拟地址空间的两个核心机制,但它们的目标、使用场景和调用者是不同的。下面简介一下它们的功能。

1.mmap()

mmap是一个系统调用,主要供用户空间程序使用,用于将文件或匿名内存映射到进程的虚拟地址空间。

原理如下:

(1)进程调用 mmap(),请求将某个文件的某部分映射到自己地址空间的一块虚拟地址区域

(2)操作系统在内核中建立该虚拟地址到文件页的映射关系,并更新进程的页表。此时并不真正加载文件数据。

(3)当进程首次访问该虚拟地址时,CPU通过MMU查页表,发现该页未加载,触发缺页异常。

(4)操作系统捕获异常,从磁盘将对应的文件页按需加载到物理内存,并更新页表项指向该物理页。

(5)CPU重新执行访问指令,此时MMU转换成功,进程可像读写内存一样操作文件数据。

mmap可用于进程间共享内存、处理大文件。它也是malloc、动态库加载的幕后功臣。

2.ioremap()

ioremap是一个内核函数,仅由内核驱动程序调用,用于将设备的物理内存(MMIO区域) 映射到内核的虚拟地址空间。

原理如下:

(1)设备(如PCIe网卡)的寄存器或板载内存通过BAR被配置到一段物理地址。CPU无法直接用这个物理地址编程。

(2)驱动在初始化时调用ioremap(phys_addr, size)。

(3)内核在其虚拟地址空间找一段空闲的虚拟地址,并建立该虚拟地址到设备物理地址的页表映射。

(4)函数返回一个内核虚拟地址。驱动后续通过这个虚拟地址,可使用专用函数访问设备。

五、总结

本文从硬件底层到软件接口,梳理了计算机体系中内存管理与设备交互的核心技术链路。MMU 作为 CPU 的 “地址翻译官”,通过虚拟地址与物理地址的转换,实现了进程隔离、简化了程序开发;IOMMU 则聚焦外设访问管控,通过地址转换与权限校验,解决了虚拟化场景下的设备安全与性能问题;MMIO 作为主流的设备交互方式,通过地址空间统一编址,简化了硬件设计与驱动开发,成为连接 CPU 与外设的关键桥梁。而 mmap 与 ioremap 作为软件层的核心映射机制,分别适配用户态与内核态的需求,借助 MMU 的硬件能力,实现了文件、物理内存与 MMIO 区域的虚拟地址映射,让上层程序能够以统一的内存操作逻辑访问各类资源。

Copyright © 2022 ZGC网游最新活动_热门游戏资讯_玩家互动社区 All Rights Reserved.