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

Linux内核探讨-- 第七章

文是个人分析《Linux内核设计与实现》而写的总结,欢迎转载,请注明出处:

                                                                              http://blog.csdn.net/dlutbrucezhang/article/details/12887315


      第七章--内存管理

      Linux内核中的内存管理是比较难实现的地方,因为,它不像在用户空间中有内核给它提供内存的保护机制。它自己就是内核,它需要内存了,只有它自己去控制,没有什么系统可以为它提供保护。稍微不注意,可能就会出现问题,好一点的情况就是系统崩溃,差的情况可能就是导致数据丢失了。而且,在前面几章的叙述中,我们知道内核在做一些事的时候是不能睡眠的,这样会导致效率的急剧降低。所以,理解内核中的内存分配管理是很有必要的。

      1.页

      页是Linux内核中对内存管理中抽象的一种概念,它是虚拟地址的基础。虽然处理器对内存的处理最小单元是字或者是字节,但是,理解页的概念仍是学好内存管理的基础。首先,贴出页的结构:
struct page {
struct list_head list;
struct address_space *mapping;
unsigned long index;
struct page *next_hash;
atomic_t count;
unsigned long flags;
struct list_head lru;
unsigned long age;
wait_queue_head_t wait;
struct page **pprev_hash;
struct buffer_head * buffers;
void *virtual; 
struct zone_struct *zone;
}

      下面我对这个结构中比较重要的字段进行简单的介绍(红色字标记)。
1.1 list:指向页的链表的头
1.2 mapping:虚拟地址映射到物理地址的指针
1.3 count:页的引用计数,往往一个页不止是一个进程在使用
1.4 flags:标记页的状态,比如页是否为脏
1.5 lru:对应于lru算法,最近最少使用的页链表的头,用于内存不足时回收时使用
1.6 virtual:页的虚拟地址
1.7 zone:页属于哪个区(下文中会有介绍)
      系统中属于内