日期:2014-05-16  浏览次数:20554 次

linux内核导读--内存管理(一)

    在理解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内核》