日期:2014-05-16 浏览次数:20690 次
在理解linux内存管理之前需要知道80x86的分段和分页单元把逻辑地址转换为物理地址的有关内容。整个系统的性能取决于如何优先地管理动态内存。从两个角度介绍:连续物理内存处理、非连续内存区的处理。
Linux采用4KB页框大小作为标准的内存分配单元。内核把物理页作为内存管理的基本单位。内存管理单元(MMU,管理内存并把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理。MMU以页大小为单位来管理系统中的页表(这也是页表的由来)。从虚拟内存的角度来看,页就是最小单位。
1)页描述符
内核必须记录每个页框的当前状态。页框的状态信息保存在一个类型为page的页描述符中,所有的页描述符存放在meme_map数组中。下面为struct page的结构体,其中省去了两个联合结构体。
struct page{
unsigned long flags;
atomic_t _count;
atomic_t _mapcount;
unsigned long private;
struct address_page *mamming;
pgoff_t index;
struct list_head lru;
void *virtual;
}
flags 一组标志,也对页框所在的管理区进行编号;
_count 页的引用计数器。为-1,则相应页框空闲,并可被分配给任一进程或 内核本身,如果大于0,说明页框被分配给了一个或多个进程,或用于存放一些内核数据结构。
flags 包含多达32个用来描述页框状态的标志。
2)内存管理区
一个页框就是一个内存存储单元,可用于任何事情。任何种类的数据页都可以存放在任何页框中,没有限制。
每个页描述符都有到内存节点和到节点内管理区(包含相应页框)的链接。
参考资料:《linux内核设计与实现》 《深入理解linux内核》