Linux 内存管理 I

CPU的内存空间指由CPU地址总线张成的地址空间,即物理地址空间。这个空间中,借助地址总线,CPU可以进行”字节级”的寻址。

上图是一个主板硬件拓扑的例子(实际开发中用的可能完全不是这个样子,比如全闪主板通常直接从CPU中出SSD控制器),我们以该图为例说明内存管理的基本概念。

视不同架构的CPU,接入物理地址空间的硬件有所不同。对于ARM等RISC处理器,通常将内存条(物理内存),和设备、外设控制器一并接入物理地址空间。这样可以令CPU使用统一的方式访问物理内存和设备IO,这种设备IO方式称之为映射IO,此时,物理地址空间可以被看作分成两部分: 物理内存区间设备IO区间。而在x86体系中,设备IO不占用物理地址空间,intel的CPU为设备单独开辟了16bit的IO空间,在硬件上通过拉低/拉高作为flag的某个引脚或寄存器来区分一个地址是位于内存空间还是IO空间,表现在软件上就是在内核态中使用不同接口函数来操作不同的空间。

对映射IO来说,本质上是CPU将需要访问的地址发给北桥,由北桥决定这个地址是发给DRAM控制器来访问内存,还是将相应的指令发给某个设备。总之,CPU的物理地址空间布局和与之相应的操作方法是BSP级的。

在内核通过启动参数解析了BSP信息之后,CPU看到的就只是一个unified的地址空间,在开启了MMU的情况下,这个地址空间就是虚拟地址空间,否则就是物理地址空间。此外,需要注意的是,低端的DMA引擎通常不能实现对整个DRAM的寻址,这也就是内核将低端内存设置为ZONE_DMA的原因,此外,没有IOMMU的DMA引擎接收一次指令只能将一块连续的内存传递到二级存储介质,而配备了IOMMU的DMA引擎可以实现Scatter/Gatter,即IOMMU负责将DRAM中离散的地址区间映射为DMA引擎中的连续的地址。

其中,CPU与DRAM之间通过MMU连接进而实现虚拟地址到物理地址的转换,而设备通过IOMMU和DRAM连接进而实现IO总线地址到物理地址的转换。

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Discover more from sketch2sky

Subscribe now to keep reading and get access to the full archive.

Continue reading