页表目录和页表结构 图解


上图反映了如下信息:
1、 进程的 4G 线性空间 被划分成 三个部分 : 进程空间 (0-3G)、 内核直接映射空间 (3G– high_memory)、 内核动态映射空间 (VMALLOC_START - VMALLOC_END)
2、  三个空间使用同一张页目录表 ,通过  CR3  可找到此页目录表 。但不同的空间在页目录表中页对应不同的项,因此互相不冲突
3、 内核初始化以后,根据实际物理内存的大小,计算出 high_memory、VMALLOC_START、VMALLOC_END 的值。并为“内核直接映射”空间建立好映射关系,所有的物理内存都可以通过此空间进行访问。
4、 “进程空间”和“内核动态映射空间”的映射关系是动态建立的(通过缺页异常)
假设在有三个线性地址 addr1, addr2, addr3 ,分别属于三个线性空间不同部分(0-3G、3G-high_memory、vmalloc_start-vmalloc_end),但是最终都映射到物理页面1:
1、 三个地址对应不同的页表和页表项
2、 但是页表项的高20bit肯定是1,表示物理页面的索引号是1
3、 同时,根据高20bit,可以从 mem_map[]中找到对应的struct page结构, struct page 用于管理实际的物理页面(就是实际物理页面的物理地址了,到这里就不绕弯子了,顺便想到高速缓冲的匹配命中操作是用哈希表,换算出的要访问的实际物理地址拿到哈希表的输入计算一下哈希值,看看有没命中) (红线)
4、 从线性地址最终的,根据页目录表,页表,可以找到物理地址
5、 struct page和物理地址之间很容易互相转换
6、 从物理地址,可以很容易的反推出在内核直接映射空间的线性地址(蓝线)。要想得到在进程空间或者内核动态映射空间的对应的线性地址,则需要遍历相应的“虚存区间”链表。

关于页目录表:
1、 每个进程有一个属于自己的页目录表,可通过 CR3 寄存器找到
2、 而内核也有一个独立于其它进程的页目录表,保存在 swapper_pg_dir[] 数组中
3、  当进程切换的时候,只需要将新进程的页目录把地址加载到 CR3 寄存器中即可
4、 创建一个新进程的时候,需要为它分配一个 page,作为页目录表,并将swapper_pg_dir[] 的高256项拷贝过来,低768项则清0
linux0.11版本,所有进程共享同一个页目录而各自使用不同的页表,该共享的页目录就放在物理地址最前面的4k
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
页表是操作系统中用于管理虚拟内存的重要数据结构。它将虚拟地址空间划分为固定大小的面,并与物理内存中的框相映射。页表项是页表中的每个条目,用于记录虚拟面与物理面之间的映射关系。 页表通常采用多级结构来组织,以便有效地管理大型的虚拟地址空间。常见的多级页表结构包括两级页表和三级页表。 在两级页表结构中,虚拟地址被划分为两部分:一个目录索引和一个页表索引。目录是一个数组,每个条目指向一个页表页表是另一个数组,每个条目指向一个物理框。通过两级索引,可以在较小的页表中快速找到对应的物理框。 在三级页表结构中,虚拟地址被划分为三部分:一个目录索引、一个页表索引和一个内偏移。目录页表结构与两级页表相似,只是多了一级索引。通过三级索引,可以更加灵活地管理大型的虚拟地址空间。 每个页表项通常包含一些重要的字段,如有效位、访问位、修改位、保护位和物理框地址等。这些字段用于控制页表的访问权限、记录面的使用情况以及建立虚拟地址与物理地址之间的映射关系。 总结来说,页表是操作系统中用于管理虚拟内存的数据结构页表项是页表中的每个条目,记录了虚拟面与物理面之间的映射关系。页表通常采用多级结构来组织,并包含一些重要的字段用于控制访问权限和记录面状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值