在Linux中,CPU访问的地址是虚拟地址空间的虚地址。因此,对于内存的管理,通常是先在虚存空间中分配一个虚存区间,然后才根据需要为此区间分配相应的物理页面并和建立映射,也就是说虚存区间先分配,物理页面后分配。
1.页描述符
从虚拟内存的角度来看,页就是最小单位。体系结构不同,支持的页大小也不尽相同。大多数32位体系结构支持4KB,而64位体系结构一般会支持8KB。
内核用struct page结构来表示系统中的每个页,也叫页描述符。
struct page {
page_flag_t flags; //用来存放页的状态,而flags的每一位都可以表示一个状态,所以它至少可以同时表示32种不同的状态(这些标志定义在linux/page_flags.h中)
atomic_t _count; //存放页的计数引用,当计数为0时就说明当前内核没有引用这一页,于是在新的分配中就可以使用他。而内核代码不直接检查该域,而是通过 page_count()函数进行检查,该函数唯一参数就是page结构。对该函数而言,返回0表示页空闲,返回正数表示页在使用。
atomic_t _mapcount;
unsigned long private; //一个页所装有的私有数据
struct address_space *mapping; //一个页可以由页缓存(针对以页为操作的所有操作,并考虑了特定体系结构上的页长度,一个主要的例子是映射技术)使用,这就是由mapping域所指向的address_space对象
pgoff_t index;
struct list_head lru; //lru指向最近久未使用(LRU)链表中的相