一、Linux内存管理模型
1、虚拟地址与物理地址的映射
2、物理地址的分配
二、虚拟地址与物理地址的映射
1、虚拟地址空间分布
32位处理器有32根地址总线,可访问4G的物理空间。其中有0-3G为用户程序空间,剩下3-4G为内核空间。内核空间又分为如下四个部分。
A、直接映射区:3G-3G+896M
该部分物理地址和虚拟地址之间的关系是很简单的线性关系。896这个数字很特殊,小于896M的空间称为低端内存空间,大于896M的空间为高端内存空间。
B、vmalloc区:
既可访问低端内存空间,又可访问高端内存空间。
C、永久映射区:
专门用来访问高端内存空间。
D、固定映射区:
和特殊的寄存器建立关系,其虚拟地址和物理地址的关系往往是固定的。
2、虚拟地址与物理地址之间的映射
这部分内容详见裸机部分MMU的总结。
三、物理内存分配(转自国嵌论坛)
1、一般来说,在调用malloc函数、new函数等时会分配,但是linux略有不同。Linux采用的是虚拟地址管理,当分配到一段虚拟内存时,并不会分配物理内存与之对应。只有当访问这块内存时才会分配物理空间,避免浪费。
2、当我们去访问这个虚拟地址,他会将其转换为物理地址,此时Linux内核发现没有与之对应的物理内存。于是引发缺页异常,再去看页框(页帧)有无空闲的物理内存,有的话就分配空闲的物理内存与虚拟地址建立对应关系。
3、凡是缺页异常的都是先得到虚拟地址,并没有得到实际的物理内存。
4、当在内核中调用kmalloc函数时,系统在分配虚拟内存时已经为它分配好了物理内存。