一般的内存分配分为内核空间和用户空间,二者之间有很大的不同,内核中不支持简单便捷的内存分配(内核一般不能睡眠),内核中处理内存分配错误相对困难。
页
内核把物理页作为内存管理的基本单元。即MMU(内存管理单元)通常以页为单位进行处理,管理系统中的页表。从虚拟内存的角度页就是最小单位。
处理器的最小可寻址单位通常为字节。
不同的体系结构中支持的页大小是不同的,其中主要的是32位体系和64位体系,前者支持4kb的页,后者支持8kb的页。
内核中使用page表示系统中的每个物理页
struct page{
unsigned long flags;
atomic_t _count;
atomic_t _mapcount;
unsigned long provate;
struct address_space *mapping;
pgoff_t index;
struct list_head lru;
void *virtual;
}
结构体中字段的含义:
- flag用来存放页的状态,状态有(是否是脏的,是否被锁定再内存中),flag的每一位单独表示一种状态,至少可以同时表示出32种不同的状态;
- _count存放页的引用计数----即这一页被引用了多少次,-1表示当前内核没有引用这一页即再新的分配中可用,其中内核是调用page_count()进行检查唯一的参数是page结构体,该函数返回值为0就表示页空闲,正整数表示再使用;
- mapping:表示当前页作为页缓存使用(mapping域指向和这个页关联的address——space对象);
- private:表示当前页作为私有数据使用(由private指向);
- 作为进程页表中的映射;
- virtual域是页的虚拟地址(即页在虚拟内存中的地址),有些内存(高端内存)并不永久的映射到内核地址空间,这是这个值为null,使用时必须动态映射;
- 由于page描述的是物理页相关,因此page中的数据由于交换等原因,数据可能并不再和同一个jpage结构相关联。主要是因为page是为了描述物理内存本身而不是其中的数据。
内核通过这个结构管理所有的页,内核需要知道这个页的状态和拥有者。
拥有者:用户空间进程、动态分配的内核数据、静态内核代码、页高速缓存
系统中所有的page结构体所占的大小:每一个占40字节,如果是系统的物理页大小是8kb,物理内存是4gb,所有的占的空间为