[国嵌攻略][106][Linux内存管理子系统]

内存管理子系统

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函数分配虚拟地址时会同时分配物理内存。

原文地址:https://www.cnblogs.com/d442130165/p/5245514.html