Linux内存管理
(1)物理内存管理
struct page结构体,每个结构体代表一个页
mem_map是一个全局变量,他是一个指针,指向page结构体数组。系统初始化,根据实际物理内存的大小建立起数组,也就是mem_map是物理内存的仓库。
仓库里面的物理页面划分为zone管理区。zone管理区维护一个数组,数组的每个元素是一个空闲队列,维护连续的页面1,2,4.。。。。。2^10,2^11。zone结构体有offect成员记录其实页面号。
页表项高20位用做下标就可以找到物理页对应的page结构体,硬件方面来看,就是物理页的起始地址
伙伴系统
zone区域中的链表,如果一个内存区被分配了一般,另一半会加入合适的链表,释放的话,两个连续空闲的,如果是伙伴,就会合并
(2)虚拟内存管理
没有统一仓库
物理内存说明:有什么,从供应方来说的
每个进程有一个mm_struct结构体,记录代码段数据段堆栈。。。。。的起始地址和结束地址
mm_struct管理vma,有缓存,记录最近一次访问的区间,如果给个虚拟地址,没在这个区间,就要去搜索
这个结构体里面的数据段已经初始化的《深入Linux内核架构》
vm_area_struct结构体,是一个虚拟内存区间。vm_start vm_end左闭右开。同一区间权限相同,属于同一个区间的访问权限相同。
属于同一个进程的区间会以链表进行管理。给一个虚拟地址,找出所在的区间是频繁的操作,所以还会用红黑树来管理,找vma的函数是find_vma。(情形分析写的是AVL树,这个再确定一下)
两种情况区间会和磁盘***,页面换出,或者mmap映射把磁盘文件映射到进程地址空间
缺页异常的情况:
1.映射没建立
2.相应的物理页面不在内存
3.访问方式与规定的访问方式不符
产生异常,i386会把导致异常的线性地址放在cr2寄存器。
堆的管理
brk系统调用,堆的结束地址必须按页对齐