linux内核把物理页作为内存管理的基本单位。每一页的大小根据系统架构不同有所区别,32位系统下为4KB,64位系统下为8KB。内存管理单元(MMU)以页为单位来管理系统中的页表,负责虚拟地址到物理地址的转换,用户所使用的内存地址一般都是虚拟地址。
内核中页的结构体中比较重要的成员为:
struct page {
unsigned long flags; /* 页的状态,包括脏标志、是否锁定
*/
atomic_t _count; /* 引用计数 */
void *virtual; /* 页的虚拟地址 */
};
内存中区的划分:
名称
|
物理内存
|
描述
|
ZONE_DMA
|
0~16MB
|
DMA使用的内存
|
ZONE_NORMAL
|
16~896MB
|
正常可寻址的内存
|
ZONE_HIGHEM
|
896MB之后的内存
|
动态映射的内存
|
区的划分实际是和体系结构相关,如x86体系结构下,ISA设备只能在物理内存的前16MB执行DMA。所以在某些体系结构下,ZONE_DMA和ZONE_NORMAL可能合并为ZONE_NORMAL。高端内存ZONE_HIGHEM也是类似。不同的区组成了不同的内存池,内存池的主要作用是减少内存碎片。
内核中区也有对应的结构体(省略部分):
struct zone {
unsigned long watermark[NR_WMARK];