linux内存管理器子系统

今天学习了一下linux的内存管理子系统。这里总结一下。

linux系统的结构图如下所示:

linux内存管理器子系统_第1张图片

它有好几个部分组成:硬件架构部分(ARCH)、设备驱动、内存管理、网络栈、进程管理、VFS、系统调用接口。今天简单介绍一下内存管理子系统——memory managementa。

内存管理子系统主要有这几个工作:

(1)虚拟地址空间分布

(1)负责虚拟地址与物理地址的映射

(2)物理地址的分配管理

先简单介绍虚拟地址空间分布,如下图所示:

linux内存管理器子系统_第2张图片

右边红框是linux的虚拟地址空间分布。一些芯片的数据手册中介绍的某些寄存器的地址是物理地址,用汇编语言直接操作寄存器的时候会用到物理地址。在linux系统中,或者在软件编程中,使用的往往是虚拟地址。虚拟地址空间范围有CPU决定,地址总线为32位的CPU,它的虚拟地址空间容量有2^32=4GB的空间。

如上图,linux虚拟地址空间分为用户空间和内核空间两大部分。0~3G是用户空间,3G~4G是内核空间。(以S5PV210为例)

内核空间又分为四个区域:直接映射区、vmalloc区、永久内核映射区、固定映射线性去。这四个区域在虚拟地址到物理地址的映射上有一定区别。

1、用户空间到物理地址的映射。原来如下图

linux内存管理器子系统_第3张图片

cr3寄存器中存放有页目录基地址,与虚拟地址的高10位页目录偏移量相加,可以找到页目录里面的一个页目录项。页目录项存放着一个页表的基地址,该基地址与虚拟地址的中间第1221位的页表偏移量相加,即可找到一个物理页的基地址。物理页的基地址,加上虚拟地址的低12位的物理页偏移量,即可得到实际屋物理页中的物理存储单元。一个物理页大小4kb


2、内核空间虚拟地址到物理地址的映射

(1)直接映射区:

该区域范围是:3G——>3G+896MB。该区域的虚拟地址=3G+物理地址。因此,虚拟地址减去3G即可得到物理地址。物理地址中,896MB以后的区域成为高端区,896MB以内区域(0~896)称为低端区域。直接映射区对应的物理地址是低端区。所以叫它直接映射区。

2vmalloc区:该区域虚拟地址即可访问高端区域,也可访问低端区域。与物理地址之间没有简单映射关系。


3)永久映射区:固定用来访问物理地址为896MB~1G的高端内存的。

 

4)固定映射线性区:此区域的虚拟地址用来访问一些固定的寄存器。

除了直接映射区外,其他区域都要通过相应页目录跟页表来映射到物理地址。


最后介绍一下物理内存的分配管理。如下图

linux内存管理器子系统_第4张图片

mallocforkexcutemmap申请内存空间时,返回的虚拟地址并没有与物理地址相对应,即实际上没有分配物理地址,仅当访问虚拟地址时,才会分配物理内存。

但是用Kmalloc申请内存空间时,返回的虚拟地址已经跟物理地址相对应,即已经分配了物理地址。


以上讲的所有操作都是有内存管理子系统完成的。欢迎拍砖。






你可能感兴趣的:(linux,S5PV210)