内存管理子系统
1.虚拟地址与物理地址的映射
2.物理内存的分配
Linux虚拟地址空间分布
设备最后访问的一定是物理地址,但Linux系统中使用的都是虚拟地址。虚拟地址简单的来说就是程序中使用的地址。所以存在虚拟地址到物理地址之间的映射关系。
Linux系统支持的虚拟地址空间由硬件来决定。例如处理器是32位,那么访问到的虚拟地址空间就是4G。0-3G是用户空间,也就是应用程序空间。3-4G是内核空间,内核空间又被划分为4个部分,第一个部分是直接映射区(3-3.896G),第二个部分是vmalloc区,第三个部分是永久映射区,第四个部分是固定映射区线性区。
虚拟地址转换为物理地址
基地址加地址起始部分得到页目录地址,页目录地址加上地址中间部分得到物理页基地址,物理页基地址加上地址最后部分得到物理页中的存储单元。
直接映射区的虚拟地址就是3G加上物理地址(<896M)。
vmalloc区的虚拟地址与物理地址没有简单的映射关系,既可以访问低端内存(<896M),也可以访问高端内存(>896M)。
永久映射区是用来固定访问高端内存(>896M)的。
固定映射区线性区与特殊的寄存器建立起关系,用来访问固定的寄存器。
物理内存的分配
得到虚拟地址时,不一定分配到了物理内存,只有到访问虚拟地址时,才会分配物理内存。
当程序使用虚拟地址时会产生缺页异常,然后从空闲页框中得到物理内存,例如使用malloc,fork,excute,mmap,vmallc函数。使用kmalloc函数分配虚拟地址时会同时分配物理内存。