地址转译的相关问题(二)

来源:互联网 发布:抗美援朝有必要吗 知乎 编辑:程序博客网 时间:2024/04/30 13:45

地址转译的相关问题(二)

通过上一篇博客我们可以看到,地址的转译需要访问PTE(intel x86中PDE 也是按照下面的方式来解释的)

而PTE 又分好几种情况,比如有效的PTE,无效的PTE ,指向原型PTE 的无效PTE,有效的原型PTE,无效的原型PTE 等,下面我们来介绍相关概念

PTE结构:


位名称

含义

Accessed

页面已经访问过

Dirty

被写过

Cache disabled

禁止缓存

Global

此页面的转译适用于所有的进程(转译缓冲区刷新操作不影响此PTE)

Large page

该PDE 映射一个4MB 页面,或者在PAE 系统上,2MB

Owner

用户模式是否可访问

Valid

此地址转译是否映射到物理内存中的一个页面

Write through

写这个页面时禁止缓存,所以数据的变化被直接刷新到磁盘上

Write

单处理器上,指明了该页面是可读写的还是只读的,多处理器系统上,说明该页面是否是可写的

V位为1代表PTE 有效,则按照如图所示解释PTE。PFN(页面帧编号)指向对应的物理页面地址,因为物理页面地址是页面对齐的。

V 位为0则处理器引发页面错误,由系统修正。

在Windows 中,无效PTE 有四种情形,这些说明了该PTE 所对应的页面的去向或状态,可以指示页面错误处理例程如何正确地处理和解决该错误。

无效的PTE【有效位为0

 

页面文件         期望的页面驻留在一个页面文件中,激发一个页面换入(in-page)操作:第10 和 11 位为0,第 1 ~ 4 位指示了在哪个页面文件中,第12~31位表示了该页面在页面文件中的偏移量,以页面大小(4096字节)为单位。

 

 

要求零              这个页面是一个待分配的页面,它需要一个填满零的页面。

 

转移                   第10位为1,说明这个页面尚在内存中,但正在换出过程中,位于系统的某个物理页面链表中。12~31 指示了物理页帧编号,根据PFN数据库可以定位到该页面的实际状态

 

 

未知                   PTE为0,此时该页面的状态无法确定,应该检查VAD以确定该虚拟地址是否已经被提交了。是,建立页表来表达新提交的地址空间。未知的PTE 与要求零页面的PTE 的却别是保护位是否为0

 

原型PTE           如果一个页面可以在两个进程之间共享,则内存管理器依靠原型页表项(PTE)来映射这些潜在要共享的页面。对于由页面文件支撑的内存区,当内存区对象被第一次创建的时候,同时也会创建一批原型PTE;对于映射文件,则会根据需要,在每个视图被映射的时候才创建这些原型PTE。当进程第一次引用一个被映射到内存区对象视图中的页面时,内存管理器利用原型PTE中的信息来填充该进程页表中实际的PTE,在地址转译时使用的是这些实际的PTE当一个共享页面被变成有效时,进程PTE和原型PTE都指向包含此数据的物理页面(通过原型PTE为了跟踪有多少个进程PTE指向一个有效的共亨页面,在PFN数据库项屮有一个计数器也会随之而递增。因此,内存管理器可以确定何时一个共享页面已经不再被任何一个页表引用了,因而可以变成无效的,并且放到转移列表(transition list)中,或者写到磁盘上

当一个共享页面被变成无效时,进程页表中的PTE被填充成一个特殊的PTE,此特殊PTE指向了描述该页面的原型PTE--à页面以后被访问-à使用该PTE找到原型PTE-àPTE描述了所被引用的页面--à然后就可以解决页面错误问题

对应的无效PTE:

原型PTE 也并不总是有效的,可以有六种状态:

 

活动/有效

该页面位于物理内存中,对于内存区对象中的页面,若有一个进程访问了该页面的数据,该页面被转移到内存中,于是原型PTE 变成一个有效的PTE。这是其它进程已经访问过它的结果。

其格式像(页面文件PTE)

转移

期望的页面位于内存中,但在某个物理页面链表中,可通过查询PFN 数据库获取情况。(在备用列表或者修改列表上)

已修改但不写出

期望的页面位于内存中,已修改过了,但修改页面写出器不会把它写回到磁盘上,在已修改但不写出列表上(格式如转移PTE)

要求零

页面尚未分配,待下次访问时请求一个零页面,格式如要求零PTE

页面文件

期望的页面驻留在一个页面文件中(格式如页面文件PTE)

映射文件

期望的页面驻留在一个映射文件中(格式如页面文件PTE,但是偏移量指的是映射文件中的偏移量)

 

所有共享此内存区对象的进程都指向同样的原型PTE--à这样就可以在无需更新每个进程的页表的情况下,有效管理共享页面。

原型PTE 的地址用28 位来描述,因为原型PTE 是4字节对齐的,另外,原型PTE 在系统换页内存池分配,无效PTE中指定的原型PTE 指它相对于系统换页内存池的偏移

#define MiPteToProto(lpte)     (PMMPTE)((PMMPTE)(((((lpte)->u.Long)>>11)<<9(+\

(((((lpte)->u.Long)) <<24))>>23)+\

MmProtopte_Base))

假设两个进程A和B共享一个内存区对象,它们分别拥有该内存区的一个视 图,其虚拟地址可能相同,也可能不相同。内存区中的页面P1已经被两个进程访问过了, 所以,该页面对应的原型PTE是一个有效的PTE,指向物理内存中的页面P1在两个进程中的PTE也是有效的,指向物理页面。页面P2位于页面文件中,所以,它对应的原型 PTE是无效的但指向页面文件中的页面。两个进程中对应于页面P2PTE也是无效的,但它们指向该页面的原型PTE。图4.26显示了这些PTE之间的关系。这时候,如果有一 个进程,不妨假设进程A,访问了页面P2,那么,此时内存管理器会P2分配一个物理页面,并且让页面P2在进程A中的PTE指向该物理页面,而且P2在段对象中的原型PTE也指向该物理页面。以后,当进程B要访问页面P2时,页面错误仍然发生,但是页面错误处理例程会发现这是一个指向原塑PTE的无效PTE,它检查原型PTE,知道页面P2已经在物理内存中了,于是让P2在进程B中的PTE也指向此物理页面,从而两个进程访问的是同一个页面P2。由此可以看出,原型PTE在内存页面的跨进程共享中起了重要的作。另外,共享的物理页面在PFN数据库中有一个共享计数,只有当共享计数为0时,它才有可能被换出到外存中

 

上面介绍了PTE 和原型PTE 后,下一篇将介绍内存区对象,最后讨论地址转译出错的核心处理过程。

0 0
原创粉丝点击