一、Linux 内存管理的基本框架
线性地址的映射分为4步:
1.线性地址最高的位段作为下标 在PGD(页面目录)中找到表项,该表项指向PMD(中间目录)。
2.线性地址第二位段作为下标在PMD中找到表项,该表项指向页面表。
3.线性地址第三位段作为下标在页面表中找到PTE,该表项存放指向物理页面的指针。
4.线性地址最后位段为 物理页面 内的相对位移 该位移 跟物理页面的起始地址相加得到相应的物理地址。
如图所示:
二、重要的数据结构和函数
物理空间
1.内核中有个指针全局变量mem_map,指向page数据结构的数组,每个page代表一个物理页面,那么整个数组代表系统中全部物理页面,相当一个仓库。该仓库分为ZONE_DMA与ZONE_NORMAL两个管理区(可能有第三个ZONE_HIGHMEM用于物理地址超过1GB的存储空间)。
2.ZONE_DMA专给DMA用的,DMA不经过MMU提高的地址映射的。所以:1、外设要直接提供物理地址。2、DMA地址必须连续。
3.每个管理区有个 zone_struct数据结构,里面有 一组 空闲区间队列 free_area_struct ,该结构维持双向链队列的结构 list_head,page结构体里也有一个list_head,page就是通过它进入free_area_struct。
4.由于非均质存储结构(就是包含各种rom/ram等cpu访问的所需时间不一样的器件),在zone_struct page等结构体之上又 引出 代表 存储节点的pglist_data结构体,若干个节点组成单链队列 ,该结构体的 node_mem_map指向page数组,node_zones 管理区。
物理空间是从“供”的角度来管理的 虚拟空间从 “需”的角度
虚拟空间
1.vm_area_struct结构体,在内核中变量名常为vm
vm_start vm_end 决定一个区间,同区间的访问权限都一样。
还有个vm_mm指针,指向mm_struct。
2.mm_struct是进程整个用户空间的抽象,每个进程只有一个,放在进程控制块中 即 task_struct结构体中。
3.虚拟存储管理各个数据结构体关系:
三、物理页面的使用与周转
1.内核有个 swap_info_struct 来描述与管理 用于页面交换的文件和设备:
其中swap_map 指向一个数组,数组下标决定磁盘或者文件中的位置; lowest_bit 和highest_bit 说明文件供页面交换使用的区间;内核定义了 swap_list ,当一个文件用于交换时,
将该文件的swap_info_struct加入到 swap_list中。