【存储管理】重要数据结构的关系

从硬件角度,Linux内核要为硬件准备好页面目录PGD,页面表PT,以及GDT和LDT,设置正确的寄存器,就完成了准备工作,但实际很复杂,今天介绍常用的重要数据结构。


(1)页面目录PGD,中间目录PMD,页面表PT分别有pgd_t,pmd_t,pte_t构成数组,其中pgd,pte低12位用来保存状态信息和访问权限,高20位保存基址,4KB为边界;页保护结构为pgprot_t(12位),值小于0x1000,pte的指针部分大于0x1000;可用__mk_pte和set_pte生成pte结构和设置到页面表项中;可根据virt_to_page让虚地址找到page结构;page描述每一个物理页面;zone_struct描述一个管理区,offset描述page数组中的其实序号。page的第一个分量 通过free_area_t结构进入双向链表;为了适应NUMA,pglist_data来管理zone_struct。


(2)一个进程所使用的虚拟空间的各个部位不是连续的,vm_area_struct可由vm_start和vm_end表示地址范围;每一个vm_area_struct都具有相同的访问权限以及其他属性,由vm_page_prot和vm_flags来决定。有两种连接各个vm_area_struct,为提高查找效率使用了红黑树的结构;使用mapping,vm_next_share等来描述与磁盘文件交换的关系;vm_op中的nopage可建立映射;


(3)每一个进程都有一个指向mm_struct的指针,mm_struct中有指向上述mmap链表,红黑树链表,以及最近一次用到的链表;map_count是含有虚拟区间的个数;pgd指针指向页面目录;mm_users和mm_count用于共享虚拟空间;start_code,end_data等用于表示代码段,堆栈段等得起始和末位位置。


(4)一个虚拟地址的存在并不表示该地址页面已映射到一个物理页面,更不能说明该页面在内存中;未经映射的页面访问时,会产生缺页异常;mm_struct和vm_area_struct说明了对页面的需求;page,zone_struct等说明了对页面的供应;而页面目录PGD,中间目录PMD,页面表PT是两者之间的桥梁。


(5)find_vma()可通过红黑树找到一个进程所给的虚拟地址所在的区间以及vm_area_struct,查找失败,则需要通过insert_vm_struct()将其插入到新的链表和红黑树中,从而建立新的虚存区间结构。


【存储管理】重要数据结构的关系_第1张图片

你可能感兴趣的:(Linux内核情景分析)