内存管理(一)页框管理概论
摘要:对内存管理涉及两个大的方面,一个是物理内存的管理,另一个是虚拟内存的管理,前者是“RAM管理”,后者是进程地址空间的管理,它们二者使用page fault联系起来。在RAM管理这一节,我们主要讲解页框管理和内存区管理,分别介绍对连续物理内存处理的两种不同技术。而“非连续内存区管理”分别介绍处理非连续内存区的第三种技术。内存管理这个系列,我们将讲到“内存管理区、内核映射、伙伴系统、slab和内存池”。本系列文章基于linux kernel 2.6.34,本小节主要为你讲解页框管理的相关数据结构和算法。
动态物理内存(除去保留给硬件和内核原始数据的部分)被划分成页框进行管理,页框可以是4K,2M和4M,我们在这里采用4K来讲解。注意,内存管理一小节,我们讲内存如何给自己分配页,这里涉及到线性地址空间的最高1GB,不涉及0~3G的线性地址空间部分。下面所有的数据结构和相关定义也大多数与这个有关系。
本文来源: 内存管理(一)页框管理概论
数据结构定义:
page:结构体类型定义,是页框描述符
mem_map:数组,用于存放所有的页框描述符
函数定义:
virt_to_page(addr):宏定义,产生线性地址addr对应的页描述符地址
pfn_to_page( pfn): 宏定义,与页框号对应的页描述符地址(这两个函数的实现尚有疑问)
内核必须记录每个页框当前的状态,保存在类型为page的页描述符之中,长度是32B(不是32b),所有页描述符存放在mem_map数组中。页描述符的相关字段如下:
1)请求和释放页框
通过6个稍有差别的函数和宏来请求和分配页框。一般情况下,它们都返回第一个所分配页的线性地址(因为是在内核空间,所以线性地址和页框具有简单的对应关系),如果分配失败,返回NULL
332 #define __free_page(page) __free_pages((page), 0)333 #define free_page(addr) free_pages((addr),0)