地址转换机制

原文地址:http://sist.sysu.edu.cn/os-course/course/04-2-2.htm

 

通过上一节,已经了解Windows 2000/XP是如何组织32位虚拟地址空间的。下面将介绍它是如何将这些地址空间映射到真实的物理页面上。我们还将描述,当地址变换找不到物理存储器的地址时,系统会如何处理,并解释Windows 2000/XP是如何通过工作集和页框数据库来管理物理内存的。 

用户应用程序以32位虚拟地址方式编址。CPU利用内存管理器创建和维护的数据结构将虚拟地址变换为物理地址。图4-11是三个连续的虚拟页面映射到三个不连续的物理页面的示意图4-11中,连接虚拟页面和页表项的虚线表明虚拟页面和物理内存之间的间接关系。虚拟地址不直接映射到物理地址,而是每个虚拟地址都与一个称作“页表项”(PTE)的结构有关,而虚拟地址映射的物理地址就包含在这个结构中。下面,我们将详细解释Windows 2000/XP是如何实现上述地址映射的问题。

1.虚拟地址变换

Windows 2000/XP在x86体系结构上利用二级页表结构来实现虚拟地址向物理地址的变换。(运行物理地址扩展(PAE)内核的系统是利用三级页表——下面的讨论假定系统为非PAE系统。)一个32位虚拟地址被解释为三个独立的分量——页目录索引、页表索引和字节索引——它们用于找出描述页面映射结构的索引。如图4-12所示,页面大小及页表项的宽度决定了页目录和页表索引的宽度。比如,在x86系统中,因为一页包含4096字节,于是字节索引被确定为12位宽(212=4096)。

 

下面是一个虚拟地址变换的基本步骤: 

1)内存管理的硬件设备定位当前进程的页目录。每次进程的切换时,一般是通过操作系统设置一个专用的CPU寄存器来通知硬件设备新进程页目录所在的地址。

2)页目录索引用于在页目录中指出页目录项(page directory entry,PDE)的位置。页目录项包含的页框号(pageframenumber,PFN)描述了映射虚拟地址所需页表的位置。

3)页表索引用于在页表中指明页表项的位置。页表项描述了虚拟页面在物理内存的位置。

4)页表项用于确定页框的位置。如果所需的页是有效的,页表项会包含物理内存中一个页的页框号。相应的虚拟页面就包含这个物理页框中。如果页表项表明所需的页是无效的,内存管理器的故障处理程序会定位该页,并努力试图使之有效。(详情参阅 “缺页处理”部分)如果不能使失效的页面有效(比如是因为一个保护错误),故障处理程序将产生一个访问违规或错误检查。

5)当页表项指向了有效的页时,字节索引用于找到物理页内所需数据的地址。

现在我们对页目录、页表和页表项已经有了一个总体印象。下面将了解它们的详细结构。

2.页目录

每个进程都拥有一个单独的页目录,这是由内存管理器创建的特殊页,用于映射进程所有页表的位置。进程页目录的物理地址被保存在核心进程(KPROCESS)块中。实际上在x86系统中它还同时被映射到地址0xC0300000处(在运行PAE内核的系统中,则映射到OxC06000000处)。

CPU之所以知道页目录页面的所在位置,是因为CPU内部有一个专用寄存器(x86系统中的CR3),而操作系统将页目录的物理地址放在这个寄存器中。任何时刻一次进程切换均会产生一个不同于当前线程的其他线程。这个专用寄存器的内容会被新进程的核心进程块的相应信息刷新。因为同一进程的不同线程共享同一个进程地址空间,所以同一进程的不同线程之间切换不会导致页目录物理地址的更新。 

页目录是由页目录项(PDE)组成的,每个页目录项4字节长(在运行PAE内核的系统中则为8字节长),描述了进程所有页表的状态和位置。(页表是根据需求创建的,所以大多数进程的页目录仅指向页表的一小部分。)页目录项的格式这里就不重复了,因为它与硬件页表项大致相同。

在x86系统中,需要1024张页表(PAE系统是2048张)来描述总共4GB的虚拟地址空间。进程的页目录将这些页表映射到1024个页目录项上。因此,页目录索引需要有10位宽(212=1024)。 

3.进程页表与系统页表 

 

在利用页内字节偏移引用一个字节之前,CPU首先需要能找到包含所需字节的页面。因此,操作系统在内存中构造了另一个包含映射信息的页面。这个包含映射信息的页面就叫做“页表”。因为Windows 2000/XP为每个进程均提供一个私有的地址空间,而且每个进程问的地址映射情况各异,所以每个进程都有自己独有的页表集来映射私有地址空间。

描述系统空间的页表被所有的进程共享。当进程刚创建时,系统空间的页目录项被初始化为指向现存的系统页表。但是如图4-14所示,各个进程的系统空间不完全相同。例如,如果分页缓冲池扩展请求分配一个新的系统页表,内存管理器不会去更新所有的进程页目录,使它们均指向新的系统页表,而是只有当进程访问新的虚拟地址时才对进程页目录进行更新。

4.页表项

如前所述,页表是由页表项(PTE)数组构成的。可以利用kernel debugger中的“!pte”命令来分析页表项。有效的页表项(这是将要在这里讨论的,无效的页表项将在稍后的章节里介绍)有两个主要的域:包含数据的物理页面的页框号,或是内存中某页面的物理地址的页框号;另外是一些描述页的状态和保护限制的标志位,如图4-15所示。图4—15中标注“保留”的位仅用于页表项为无效的时候(这些位由软件解释)。表4—8简要说明了一个有效页表项中由硬件规定的各位的具体含义。

在x86系统中,硬件页表项包括一个修改位和一个访问位。如果物理页在页表项中表现为既没被读过也没被写过,那么访问位为零;当某页首次被读写时,处理器会将此位置“1”。而仅当某页首次被写时,修改位才会被处理器置“1”。除了这两个标志位,x86体系结构还有一个写位用来提供页的写保护——当此位为零时,对应的页为只读的;当此位为“1”时,对应的页是可读写的。如果一个页的写位为零时,一个线程试图对其进行写操作,将会引发内存管理的异常,内存管理器的访问故障处理程序(将在下节详述)必须确定这个线程能否对此页执行写操作(比如,如果此页确实标记为“写时复制”),或者是否应当产生一次访问违规。

在多处理器的x86系统中,硬件页表项还有一个附加的由软件实现的写位,主要是为了在不同的处理器对页表项的快表(TLB)刷新时消除延迟。这位表示某页已经被一个运行在多个处理器上的线程写入。

在x86硬件平台上,页表项总是4个字节(可以运行PAE的系统为8字节),这样每张页表都包含1024个(PAE系统512个)页表项(每页4096字节,每个页表项4字节),而且因此可以映射1024个(PAE系统512个)4MB大小(PAE系统2MB)的页。

在x86系统中,页表索引为10位宽(PAE为9位),最多允许索引1024个页表项(PAE为512个)。Windows 2000/XP提供4GB的虚拟地址空间,所以需要多张页表来映射全部地址空间。x86系统中的每张页表可以映射4MB大小(PAE为2MB)的数据页,因此需要1024张页表(4GB/4MB)来映射4GB的地址空间。如果是PAE系统,则需要2048张页表(4GB/2MB)。

5.字节索引

一旦内存管理器找到需要的物理页,它还必须在页内找到所需的数据。这就是引入字节索引域的用途。字节索引域告诉CPU数据在页内的偏移。在x86系统中,字节索引为12位宽,最多可以索引4096个数据字节(正是一页的大小)。

6.快表TLB

 

每次地址变换都需要经过两次查询:一次是在页目录中找到正确的页表,另一次是在页表中找到正确的项。如果每次对虚拟地址的访问都做两次额外的内存查询,这将使系统性能严重下降。因此大多数CPU在地址变换时运用了高速缓存技术。x86处理器提供了关联存储器数组形式的高速缓存,称为快表(Translation Lookaside Buffer,TLB)。所谓关联存储器,例如TLB,是一个向量,它的存储单元能被同时读取,并与目标值比较。在TLB中,向量中包含了大多数最近用过的虚拟页到物理页的映射(如图4-16所示)以及每页的页保护类型。TLB中每个项都类似一个高速缓存项,它的标识符保存了虚拟地址的一部分,它的数据部分则保存了一个物理页号、保护域、有效包通常还有一个修改位,这些用来表明被高速缓存的页表项所对应页的状态。如果一个页表项的全局位被置为“广(用于对所有进程都可见的系统空间页),当进程切换时TLB项仍然有效。
由于常用的虚拟地址很可能记录在TLB项中,这就使虚拟地址到物理地址的变换非常快,而且减少了对内存的访问。如果一个虚拟地址不在TLB中,它可能仍在内存中,但是需要对内存多次访问来找到它。如果一个虚页已经被调出了内存,或者内存管理器更改了页表项,内存管理器必须明确地将相应的TLB项置为无效。当进程再次访问这个虚页,就会产生缺页中断,内存管理器将该页再次调回内存,同时在TLB中为它重新创建项。
为了最大限度提高代码的通用性,只要可能,内存管理器对所有页表项均同等对待,无论它们是由硬件还是由软件维护。例如,当一个页表项由无效变为有效时,内存管理器会调用一个内核例程。此例程的任务是以体系结构所需要的方式将新的页表项装.NTLB。在x86系统中处理器装入TLB不需要软件干预,所以这部分代码是NOP。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值