linux内存管理+线性地址+非连续区域
相关的数据结构
node数据结构(numa)
- pglist_data(pg_data_t)的表头是pgdat_list
1 | typedef struct pglist_data { |
ZONE数据结构(内存管理区)
对于x86机器,管理区的示例如下
- ZONE_DMA 16MB
- ZONE_NORMAL 16MB~896MB
- ZONE_HIGHMEM 896MB~未尾
1 | typedef struct zone_struct { |
- unsigned long pages_min, pages_low, pages_high;管理区极值
pages_min最有可能的值是大于等于20(80KB)个页面小于等于255(1MB)个页面
当空闲页面数达到pages_low时,伙伴分配器就会唤醒kswapd(守护程序)释放页面,pages_low默认值是pages_min的两倍。当空闲页面数达到pages_min时,分配器会以同步方式启动kswapd。kswapd被唤醒并开始释放页面后,在 pages_high个页面被释放以前,是不会认为该管理区已经“平衡”的,当到pages_high值后,kswapd再次睡眠。pages_high默认是pages_min的三倍。
PAGE
所有的page都存储在一个全局的mem_map数组中,该数组通常放在ZONE_NORMAL的首部,或者就在小内存系统中为装入内核映像而预留的区域之后。
1 | /* |
mm_struct
1 | struct mm_struct { |
vm_area_struct
1 | struct vm_area_struct { |