《Linux操作系统.ppt》由会员分享,可在线阅读,更多相关《Linux操作系统.ppt(67页珍藏版)》请在三一办公上搜索。
1、,Linux操作系统,2007年秋,内存寻址,Linux 内核完全剖作者:赵炯 编著出版社:机械工业出版社ISBN:7111180321出版日期:2006-1-1,内存寻址,内存是指一组有序字节组成的数组,每个字节有唯一的内存地址。内存寻址则是指对储存在内存中的某个指定数据对象的地址进行定位。这里数据对象是指储存在内存中的一个指定数据类型的数值或字串。80X86支持多种数据类型:1字节、2字节(1个字)或4字节(双字或长字)的无符号整型数或带符号整型数,以及多字节字符串等。通常字节中某一比特位的定位或寻址可以基于字节来寻址,因此最小数据类型的寻址是对l字节数据(数值或字符)的定位通常内存地址从
2、0开始编址,对于80X86 CPU来說,其地址总线宽度为32字节,因此一共有232个不同物理地址。即内存物理地址空间有4G,总共可以寻址4G字节的物理内存,内存寻址,对于80X86 CPU,一条指令主要由操作码(Opcode)和操作对象即操作数(Operand)构成。操作数可以位于一个寄存器中,也可以在内存中。若要定位内存中的操作数,就要进行内存寻址。80X86有许多指令的操作数涉及内存寻址,並且针对所寻址物件数据类型的不同,也有很多不同的寻址方案,内存寻址,为了进行内存寻址,80X86使用了一种称为段(Segment)的寻址技术。这种寻址技术把内存空间分成一个或多个称为段的线性区域,从而对内
3、存中一个数据对象的寻址就需要使用一个段的起始地址(即段地址)和一个段內偏移地址两部分构成。段地址部分使用16字节的段选择符号指定,其中14位可以选择214次方即16384个段。段內偏移地址部分使用32字节的值来指定,因此段內地址可以是0到4G。即一个段的最大长度可达4G。程序中由16字节的段和32位的偏移构成的48位地址或长指针称为一个逻辑地址(虛拟地址)。它唯一确定了一个数据对象的段地址和段內偏移地址。而仅由32位偏移地址或指针指定的地址是基于当前段的对象地址。,内存寻址,80X86为段部分提供了6个存放段选择符号的段寄存器:CS、DS、ES、SS、FS和GS。其中CS总是用于寻址代码段,而
4、堆栈段则专门使用SS段寄存器。在任何指定时刻由CS寻址的段称为当前代码段。此时EIP寄存器中包含了当前代码段內下一条要执行指令的段內偏移地址。因此要执行指令的地址可表示成CS:EIP。后面将说明的段间控制转移指令可以被用来为CS和EIP代入新值,从而可以把执行位置政变到其他的代码段中,这样就实现了在不同段中程序的控制传递。由段寄存器SS寻址的段称为当前堆栈段。堆栈顶端由ESP寄存器內容指定。因此堆栈顶端地址是SS:ESP。另外4个段寄存器是通用段寄存器。当指令中沒有指定所操作数据的段时,那么DS将足预设的数据段寄存器。,内存寻址地址变换,任何完整的内存管理系统都包含两个关键部分:保护和地址变换
5、。提供保护措施是可以防止一个任务存取另一个任务或操作系统的内存区域。地址变换能够让作业系统在给任务分配内存时具有灵活性,并且因为我们可以让某些物理地址不被任何逻辑地址所映射,所以在地址变换过程中同时也提供了内存保护功能,内存寻址地址变换,正如上面提到的,电脑中的物理内存是字节的线性组合,每个字节具有一个唯一的物理地址;程序中的地址是由两部分构成的逻辑地址。这种逻辑地址并不能直接用于存取物理内存,而需要使用地址变换机制将它变换或映射到物理内存地址上。内存管理机制即用于将这种逻辑地址转换成物理内存地址。,内存寻址地址变换,为了減少确定地址变换所需要的信息,变换或映射通常以内存块作为操作单位。分段机
6、制和分页机制是两种广泛使用的地址变换技术。分段和分页操作都使用驻留在内存中的表来指定它们各自的变换信息。这些表只能由操作系统存取,以防止应用程序擅自修改。,内存寻址地址变换,80X86在从逻辑地址到物理地址变换行程中使用了分段和分页两种机制。第一阶段使用分段机制把程序的逻辑地址变换成处理器可寻址内存空问(称为线性地址空间)中的地址。第二阶段使用分页机制把线性地址转换为物理地址在地址变换行程中,第一阶段的分段变换机制总是使用的,而第二阶段的分页机制则是供选用的。如果沒有启用分页机制,那么分段机制产生的线性地址空间就直接映射到处理器的物理地址空间上。物理地址空间定义为处理器在其地址总线上能够产生的
7、地址范围。,内存寻址地址变换,逻辑地址(虚拟地址)到物理地址的变换过程,内存寻址分段机制,分段提供了隔绝各个代码、数据和堆栈区域的机制,因此多个程序(或任务)可以执行在同一个处理器上而不会互相干扰。分页机制为传统需求页、虛拟内存系统提供了实现机制。其中虛拟内存系统用于实现程序代码按要求被映射到物理内存中。分页机制也能用于提供多任务间的隔离措施。,内存寻址分段机制,分段提供了一种机制,用于把处理器可寻址的线性地址空间划分成一些较小的称为段的受保护地址空间区域。段可以用来存放程序的代码数据和堆栈,或者用来存放系统数据结构(例如LDT)。如果处理器中有多个程序或任务在执行,那么每个程序可分配各自的一
8、套段。此时处理器就可以加強这些段之间的界限,并且确保一个程序不会透过存取另一个程序的段而干扰程序的执行。分段机制还允许对段进行分类。这样,对特定类型段的操作能够受到限制。,内存寻址分段机制,一个系统中所有使用的段都包含在处理器线性地址空间中。为了定位指定段中的一个字节,程序必须提供一个逻辑地址。逻辑地址包括一个段选择符和一个偏移量。段选择符是一个段的唯一标识。另外,段选择符提供了段描述符表(例如全域描述符表GDT)中一个数据结构(称为段描述符)的偏移量。每个段都有一个段描述符。段描述符指明段的大小、存取许可权和段的特权级、段类型以及段的第l个字节在线性地址空间中的位置(称为段的基地址)。逻辑地
9、址的偏移量部分加段的基地址上就可以定位段中某个字节位置。因此基地址加上偏移量就形成了处理器线性地址空间中的地址。,内存寻址分段机制,线性地址空间与物理地址空间具有相同的结构。相对于二维的逻辑地址空间来说,它们两者都是一维地址空间。虛拟地址(逻辑地址)空间可包含最多16K的段,而每个段最长可达4GB,使得虛拟地址空问容量达到64T。线性地址空间和物理地址空间都是4GB(2)。实际上,如果禁用分页机制,那么线性地址空间就是物理地址空间。,逻辑地址、线性地址和物理地址之间的转换,内存寻址分页机制,因为多任务系统通常定义的线性地址空间都要比其含有的物理内存容量大得多,所以需要使用某种“虚拟化”线性地址
10、空间的方法,即使用虚拟储存技术虚拟储存是一种内存管理技术,使用这种管理技术可让程序人员产生内存空间要比电脑中实际内存容量大很多的错觉。利用这种错觉,我们可以随意编制大型程序而无考虑实际物理内存究竟有多少,内存寻址分页机制,分页机制支援虛拟储存技术。在使用虛拟储存的环境中,大容量的线性地址空间需要使用小块的物理内存(RAM或ROM)以及某些外部储存空间(例如大容量硬盘)来模拟。当使用分页时,每个段被划分成页面(通常每页为4KB大小),页面会被储存于物理内存中或硬盘上。操作系统通过维护一个页目录和一些页表来留意这些页面。当程序(或任务)试图存取线性地址空间中的一个地址位置时,处理器就会使用页目录和
11、页表把线性地址转换成一个物理地址,然后在该内存位置上执行所要求的操作(读或写)。,内存寻址分页机制,如果当前被存取的页面不在物理内存中,处理器就会中断程序的执行(通过产生一个页错误异常)。然后操作系统就可以从硬盘上把该页面读入物理内存中,并继续执行刚才被中断的程序。,内存寻址保护,80X86支持两类保护。其一是透过给每个任务不同的虛拟地址(逻辑地址)空间来完全隔离各个任务。这是通过给每个任务逻辑地址到物理地址不同的变换映射来做到另一个保护机制对任务进行操作,以保护操作系统内存段和处理器特殊系统寄存器不被应用程序存取,内存寻址保护,任务之间的保护保护的一个重要方面是提供应用程序各任务之间的保护能
12、力。80X86使用的方法是通过把每个任务放置在不同的虛拟地址空间中,并给予每个任务不同的逻辑地址到物理地址的变换映射。每个任务中的地址变换功能被定义成一个任务中的逻辑地址映射到物理内存的一部分区域,而另一个任务中的逻辑地址映射到物理内存中的不同区域中。这样,因为一个任务不可能生成能够映射到其他任务逻辑地址对应使用的物理内存部分,所以所有任务都被隔绝开了。只需给每个任务各自独立的映射表,每个任务就会有不同的地址变换函数。在80X86中,每个任务都有自己的段表和页表。当处理器切換并执行一个新任务时,任务切換的关键部分就是切換到新任务的变换表。,内存寻址保护,任务之间的保护通过在所有任务中安排具有相
13、同的虛拟到物理地址映射部分,并且把操作系统储存在这个公共的虛拟地址空间部分,操作系统可以被所有任务共用。这个所有任务都具有的相同虛拟地址空间部分被称为全局地址空间(Global address space)。这也正是现代Linux操作系统使用虛拟地址空间的方式。每个任务唯一的虛拟地址空间部分被称为局部地址空间(Local address space)。局部地址空间含有需要与系统中其他任务区別开的私有的代码和数据,由于每个任务中具有不同的局域地址空间,因此两个不同任务中对相同虛拟地址处的引用将转换到不同的物理地址处。这使得操作系统可以给与每个任务的内存相同的虛拟地址,但仍然能隔绝每个任务。另一方
14、面,所有任务在全局地址空间中对相同虛拟地址的引用将被转换到同一个物理地址处。这让公共代码和数据(例如操作系统)的共用有了支援。,内存寻址保护,特权级保护在一个任务中,定义了4个执行特权级(Privilege Levels),用于依据段中含有数据的敏感度以及任务中不同程序部分的受信程度,来限制对任务中各段的存取。最敏感的数据被赋予了最高特权级,它们只能被任务中最受信任的部分存取。不太敏感的数据被赋予较低的特权级,它们可以被任务中较低特权级的代码存取。特权级用数字0到3表示,0具有最高特权级,而3则是最低特权级。每个内存段都与一个特权级相关联。这个特权级限制具有足够特权级的程序来存取一个段。我们知
15、道,处理器从CS暂存器指定的段中取得和执行指令,当前特权级(Current Privilege Level),即CPL就是当前活动代码段的特权级,并且它定义了当前所执行程序的特权级別。CPL确定了哪些段能够被程序存取。,内存寻址保护,特权级保护每当程序企图存取一个段时,当前特权级就会与段的特权级进行比较,以确定是否有存取许可。在给定CPL执行的一个程序被允许存取同级別的数据段,或者低级別段。任何对高级別段的参照引用都是非法的,并且会引发一个异常来通知操作系统。每个特权级都有自己的程序堆栈,以避免使用共用堆栈带来的保护问题。当程序从一个特权级切換到另一个特权级上执行时,堆栈段也随之改換到新级別的
16、堆栈中。,内存寻址分段机制,分段机制可用于实现多种系统设计。使用分段机制能够建立一个可同时可靠地执行多个程序(或任务)的具有稳固操作环境的多段模型。多段模型能够利用分段机制全部功能提供由硬体增強的代码、数据结构、程序和任务的保护措施。通常,每个程序(或任务)都使用自己的段描述符号表以及自己的段。对程序来说段能够完全是私有的,或者是程序之间共用的,对所有段以及系统上执行程序各自执行环境的存取都由硬体控制。,内存寻址分段机制,访问检查不仅能够用来保护对段界限以外地址的引用,而且也能用来在某些段中防止执行不允许的操作。例如,因为代码段被设计成是只读形式的段,因此可以用硬体来防止对代码段执行写操作。段
17、中的访问权限信息也可以用来设置保护环或级別。保护级別可用于保护操作系统程序不受应用程序非法存取。,内存寻址段的定义,保护模式中80X86提供了4GB的物理地址空间。这是处理器在其地址总线上可以寻址的地址空间。这个地址空间是平坦的,地址范围从0到0 xFFFFFFFF。这个物理地址空间可以映射到读写内存、只读内存以及内存映射I/O中。,内存寻址段的定义,80386虛拟地址空问中的虛拟地址(逻辑地址)由一个段部分和一个偏移部分构成。段是虛拟地址到线性地址转换机制的基础。每个段由三个参数定义:1段基地址(Base address),指定段在线性地址空间中的开始地址。基地址是线性地址,对应于段中偏移0
18、处。2段限长(1imit),是虛拟地址空间中段內最大可用偏移位置。它定义了段的长度。3 段属性(Attributes)指定段的特性。例如该段是否可读、可写或可作为一个程序执行;段的特权级等,内存寻址段的定义,段限长定义了在虛拟地址空间中段的大小。段基址和段限长定义了段所映响的线性地址范围或区域。段內0到limit的地址范围对应线性地址中范围base到 base+limit。偏移量大于段限长的虛拟地址是无意义的,如果使用则会导致异常。另外,若存取一个段并沒有得到段属性许可则也会导致异常。例如,如果你试图写一个只读的段,那么80386就会产生一个异常。另外,多个段映射到线性地址中的范围可以部分重叠
19、或覆盖,甚至完全重叠,见后图所示。在本文章中介绍的 Linux 0.1x系统中,一个任务的代码段和数据段的段限长相同,并被映射到线性地址完全相同而重叠的区域上。,内存寻址段的定义,内存寻址段的定义,段的基地址、段限长以及段的保护属性储存在一个称为段描述符(Segment Descriptor)的结构项中。在逻辑地址到线性地址的转换映射行程中会使用这个段描述符。段描述符保存在内存中的段描述符表(Descriptor table)中。段描述符表是包含段描述符号项的一个简单数组。前面介绍的段选择符即用于通过指定表中一个段描述符的位置来指定相应的段。,内存寻址段的定义,即使利用段的最小功能,使用逻辑地
20、址也能存取处理器地址空间中的每个字节。逻辑地址由16字节的段选择符号和32位的偏移量组成,见后图所示。段选择符号指定字节所在的段,而偏移量指定该字节在段中相对于段基底地址的位置。处理器会把每个逻辑地址转换成线性地址。线性地址是处理器线性地址空间中的32字节地址。与物理地址空间类似,线性地址空问也是平坦的4GB地址空间,地址范围从0到0 xFFFFFFFF。线性地址空间中含有为系统定义的所有段和系统表。,内存寻址段的定义,逻辑地址到线性地址的变化过程,内存寻址段的定义,为了把逻辑地址转换成一个线性地址,处理器执行以下操作:使用段选择符号中的偏移值(段索引)在GDT或LDT表中定位相应的段描述符号
21、。(仅当一个新的段选择符号载入到段寄存器中时才需要这一步。)利用段描述符号检验段的访问权限和范围,以确保该段是可存取的并且偏移量位于段界限內。把段描述符号中取得的段基底地址加到偏移量上,最后形成一个线性地址。如果沒有开启分页,那么处理器直接把线性地址映射到物理地址(即线性地址被送到处理器地址总线上)。如果对线性地址空间进行了分页处理,那么就会使用二级地址转换把线性地址转换成物理地址。,内存寻址段描述符表,段描述符表是段描述符的一个数组,见后图所示。描述符表的长度可变,最多可以包含8192个8字节描述符。有两种描述符表:全局描述符表GDT(Global descriptor table):局部描
22、述符表LDT(Local descriptor table)。,段描述符表结构,内存寻址段描述符表,描述符表储存在由操作系统维护着的特殊数据结构中,并且由处理器的内存管理硬体来引用。这些特殊结构应该保存在仅由操作系统软体存取的受保护的内存局部中,以防止应用程序修改其中的地址转换信息。虛拟地址空间被分割成大小相等的两半。一半由GDT来映射变换到线性地址,另一半则由LDT来映射。整个虛拟地址空问共含有214个段:一半空间(即2个段)是由GDT映射的全局虛拟地址空间,另一半是由LDT映射的局部虛拟地址空间。通过指定一个描述符表(GDT或LDT)以及表中描述符号,我们就可以定位一个描述符。,内存寻址段
23、描述符表,当发生任务切换时,LDT会更换成新任务的LDT,但是GDT并不会改变。因此,GDT所映射的一半虛拟地址空间是系统中所有任务共有的,但是LDT所映射的另一半则在任务切换时被改变。系统中所有任务共用的段由GDT来映射。这样的段通常包括含有操作系统的段以及所有任务各自的包含LDT的特殊段。LDT段可以想像成属于操作系统的数据。,内存寻址段描述符表,如图所示,一个任务中的段如何能在GDT和LDT之间分开。图中共有6个段,分別用于两个应用程序(A和B)以及操作系统。系统中每个应用程序对应一个任务,并且每个任务有自己的LDT。应用程序A在任务A中执行,拥有LDTA,用来映射段CodeA和Data
24、A。类似地,应用程序B在任务B中执行,使用LDTB来映射CodeB和DataB段。包含操作系统內核的两个段Codeos和Dataos使用GDT来映射,这样它们可以被两个任务所共用。两个 LDT段:LDTA和LDTB也使用GDT来映射。,内存寻址段描述符表,内存寻址段描述符表,当任务A在执行时,可存取的段包括LDTA映射的CodeA和DataA段,加上GDT映射的操作系统的CodeOS 和dataOS段。当任务B在执行时,可存取的段包括LDTB映射的CodeB和DataB段,加上GDT映射的操作系统的CodeOS 和dataOS段。,内存寻址段描述符表,这个例子通过让每个任务使用不同的LDT,演
25、示了虛拟地址空间如何能够被组织成隔离每个任务。当任务A在执行时,任务B的段不是虛拟地址空间的部分,因此任务A沒有办法存取任务B的内存。同样地,当任务B执务A的段也不能被定址。这种使用LDT来隔离每个应用程序任务的方法,正是关键保护需求之一。每个系统必须定义一个GDT,并可用于系统中所有程序或任务。另外,可以选定义一个或多个LDT。例如,可以为每个执行任务定义一个LDT,或者某些或所有任务共用一个LDT,内存寻址分页机制,分页机制是80X86内存管理机制的第二部分。它在分段机制的基础上完成虛拟(逻辑)地址到实体地址转换的行程。分段机制把逻辑地址转换成线性地址,而分页则把线性地址转换成实体地址。分
26、页可以用于任何一种分段模型。处理器分页机制会把线性地址空间(段已映射到其中)划分成页面,然后这些线性地址空间页面被映射到实体地址空间的页面上。分页机制几种页面级保护措施,可和分段机制保护机制合用或替代分段机制的保护措施。例如,在基于页面的基础上可以加強读/防写。另外,在页面单元上,分页机制还提供了用戶-超级用户两级保护。,内存寻址分页机制,我们通过设置控制寄存器CR0的PG位可以啟用分页机制。如果PG=1,则启用分页操作,处理器会使用本节描述的机制将线性地址转换成物理地址。如果PG=0,则禁用分页机制,此时分段机制产生的线性地址被直接用作物理地址。分页机制对固定大小的内存区块(称为页面)进行操
27、作。分页机制把线性和物理地址空间都划分成页面。线性地址空间中的任何页面可以被映射到物理地址空间的任何页面上。如后图显示出了分页机制是如何把线性和物理地址空间都划分成各个页面,并在这两个空间之间提供了任意映射。图中的箭头把线性地址空间中的页面与物理地址空间中的页面对应了起来。,内存寻址分页机制,线性地址空间页面到物理地址空间页面对应是示意图,内存寻址分页机制,80X86使用4K(2)字节固定大小的页面。每个页面均是4KB,并且在对齐4K地址边界。这表示分页机制把2字节(4GB)的线性地址空间划分成220(1M=1048576)个页面。分页机制通过把线性地址空间中的页面重新定位到物理地址空间中进行
28、操作。由于4K大小的页面作为一个单元进行映射,并且对齐于4K边界,因此线性地址的低12Bit可作为页內偏移量直接作为物理地址的低12位。分页机制执行的重定位功能可以看作是把线性地址的高20位转换到对应物理地址的高20位。,内存寻址分页机制,另外,线性到物理地址的转换功能被扩展成允许一个线性地址被标注为无效的,而非让其产生一个物理地址。在两种情況下一个页面可以被标注为无效的:操作系统不支援的线性地址;对应在虛拟内存系统中的页面在磁盘上而非在物理内存中在第一种情況下,产生无效地址的程序必须被终止。在第二种情况下,该无效地址实际上是请求操作系统虛拟内存管理器把对应页面从磁盘上载入到物理内存中,以供程
29、序存取。因为无效页面通常与虛拟储存系统相关,因此它们被称为不存在的页面,并且由页表中称为存在(present)的属性来确定。,内存寻址分页机制,在保护模式中,80X86允许线性地址空间直接映射到大容量的实体内存(例如4GB的RAM)上,或者(使用分页)间接地映射到较小容量的实体内存和磁盘储存空间中。这后一种映射线性地址空间的方法被称为虛拟储存或者需求页(Demand-paged)虛拟储存。当使用分页时,处理器会把线性地址空问划分成固定大小的页面(长度4KB),这些页面可以映射到实体内存中和/或磁盘储存空间中。当一个程序(或任务)引用内存中的逻辑地址时,处理器会把该逻辑地址转换成一个线性地址,然
30、后使用分页机制把该线性地址转换成对应的物理地址。,内存寻址分页机制,如果包含线性地址的页面当前不在物理内存中,处理器就会产生一个页错误异常。页错误异常的处理程序通常就会让操作系统从磁盘中把相应页面载入到物理内存中(操作过程中可能还会把物理内存中不同的页面写到磁片上)。当页面载入到实体内存中之后,从异常处理行程的返回操作会使得导致异常的指令被重新执行。处理器用于把线性地址转换成物理地址和用于产生页错误异常(若必要的话)的信息包含在储存于内存中的页目录和页表中。,内存寻址分页机制,分页与分段最大的不同之处在于分页使用了固定长度的页面段的长度通常与存放在其中的代码或数据结构具有相同的长度;与段不同,
31、页面有固定的长度。如果仅使用分段地址转换,那么储存在物理内存中的一个数据结构将包含其所有的部分。但如果使用了分页,那么一个数据结构就可以一部分储存于物理内存中,而另一部分保存在磁盘中,内存寻址分页机制,为了減少地址转换所要求的总线周期数量,最近存取的页目录和页表会被存放在处理器的缓冲器件中,该缓冲器件被称为转换查找缓冲区TLB(Transla-tion Lookaside Buffer)。TLB可以满是大多数读页目录和页表的请求而无需使用总线周期。只有当TLB中不包含要求的页表项时才会使用额外的总线周期从内存中读取页表项,这通常在一个页表项很长时间沒有存取过时才会出现这种情況,内存寻址页表结构
32、,分页转换功能由驻留在内存中的表来描述,该表称为页表(page table),存放在物理地址空间中。页表可以看作是简单的220物理地址数组。线性到物理地址的映射功能可以简单地看作是进行数组查找。线性地址的高 20位构成这个数组的索引值,用于选择对应页面的物理(基)地址。线性地址的低12位给出了页面中的偏移量,加上页面的基地址最终形成对应的物理地址。由于页面基地址对齐在4K边界上,因此页面基地址的低12位肯定是0。这意味着高20位的页面基地址和12位偏移连接组合在一起就能得到对应的物理地址。,内存寻址页表结构,页表中每个页表项大小为32位。由于只需要其中的20位来存放页面的物理基底地址,因此剩下
33、的12位可用于存放诸如页面是否存在等的属性信息。如果线性地址索引的页表项被标注为存在的,则表示该项即有效,我们可以从中取得页面的物理地址。如果项中表明不存在,那么当存取对应物理页面时就会产生一个异常。,内存寻址两级页表结构,页表含有220(1M)个表项,而每项占用4字节。如果作为一个表来存放的话,它们最多将占用4MB的内存。因此为了減少内存占用量,80X86使用了两级表。由此,高20位线性地址到物理地址的转换也被分成两步来进行,每步使用(转换)其中10个Bit。第一级表称为页目录(page directory)。它被存放在1页4K页面中,具有210(1K)个4字节长度的表项。这些表项指向对应的
34、二级表。线性地址的最高10位(位3 1-22)用作一级表(页目录)中的索引值来选择210个二级表之一。,内存寻址两级页表结构,第二级表称为页表(page table),它的长度也是1个页面,最多含有1K个4字节的表项。每个4字节表项含有相关页面的20位物理基地址。二级页表使用线性地址中间10位(位 2112)作为表项索引值,以获取含有页面20位物理基地址的表项。该20位页面物理基底地址和线性地址中的低12位(页內偏移)组合在一起就得到了分页转换行程的输出值,即对应的最终物理地址。,内存寻址两级页表结构,后图给出了二级表的查找行程。其中CR3寄存器指定页目录表的基地址。线性地址的高10位用于索引
35、这个页目录表,以获得指向相关第二级页表的指针。线性地址中间10位用于索引二级页表,以获得物理地址的高20位。线性地址的低12位直接作为物理地址低12位,从而组成一个完整的32位物理地址。,内存寻址两级页表结构,二级页表的查找过程,内存寻址两级页表结构,不存在的页表二级表结构允许页表被分散在内存各个页面中,不需要保存在在连续的4MB内存区块中。另外,并不需要为不存在的或线性地址空间未使用部分配二级页表。虽然目录表页面必须总是存在于物理内存中,但是二级页表可以在需要时再分配。这使得页表结构的大小对应于实际使用的线性地址空间大小。,内存寻址两级页表结构,不存在的页表页目录表中每个表项也有一个存在(p
36、resent)属性,类似于页表中的表项,页目录表项中的存在属性指明对应的二级页表是否存在。如果目录表项指明对应的二级页表存在,那么通过存取二级表,表查找过程第2步将同如上描述继续下去。如果存在位表明对应的二级表不存在,那么处理器就会产生一个异常来通知操作系统。页目录表项中的存在属性使得操作系统可以根据实际使用的线性地址范围来分配二级页表页面。,内存寻址两级页表结构,目录表项中的存在位还可以用于在虛拟内存中存放二级页表。这意着在任何时候只有部分二级页表需要存放在物理内存中,而其余的可保存在磁盘上。处于物理内存中页表对应的页目录项将被标注为存在,以表明可用它们进行分页转换。处于磁盘上的页表对应的页
37、目录项将被标注为不存在。由于二级页表不存在而引发的异常会通知操作系统把缺少的页表从磁盘上载入进物理内存。把页表储存在虛拟内存中減少了保存分页转换表所需要的物理内存量,内存寻址页表项格式,页目录和页表的表项格式见后图所示。其中位3 l12含有物理地址的高20位,用于定位物理地址空间中一个页面(也称为页框)的物理基地址。表项的低12位含有页属性信息,这里简要说明其余属性的功能和用途。,内存寻址页表项格式,内存寻址页表项格式,P:位0是存在(Present)标志,用于指明表项对地址转换是否有效。P=1表示有效;P=0表示无效。在页转换过程中,如果说涉及的页目录或页表的表项无效,则会导致一个异常。如果
38、P=0,那么除表示表项无效外,其余Bit位可供程序自由使用,见前图所示。例如,操作系统可以使用这些位来保存已储存在磁片上的页面的序号。,内存寻址页表项格式,R/W:位l是读/写(Read/Write)标志。如果等于l,表示页面可以被读、写或执行。如果为0,表示页面只读或可执行。当处理器执行在超级用戶特权级(级別0、l或2)时,则R/W位不起作用。页目录项中的R/W位对其所映射的所有页面起作用。U/S:位2是用戶/超级用戶(User/Supervisor)标志。如果为1,那么执行在任何特权级上的程序都可以存取该页面如果为0,那么页面只能被执行在超级用户特权级(0、1或2)上的程序存取。页目录项中
39、的U/S位对其所映射的所有页面起作用。,内存寻址页表项格式,A:位5是已存取(Accessed)标志。当处理器存取页表项映射的页面时,页表表项的这个标志就会被置为l。当处理器存取页目录表项映射的任何页面时,页目录表项的这个标志就会被置为1。处理器只负责设置该标志,操作系统可通过定期地重定该标志来统计页面的使用情況。D:位6是页面已被修改(Dirty)标志。当处理器对一个页面执行写操作时,就会设置对应页表表项的D标志。处理器并不会修改页目录项中的D标志。AVL:该栏位保留专供程序使用。处理器不会修改这几个位,以后的升级处理器也不会。,内存寻址虛拟储存,页目录和页表表项中的存在标志P为使用分页技术
40、的虛拟储存提供了必要的支援。若线性地址空间中的页面存在于物理内存中,则对应表项中的标志P=l,并且该表项中含有相应物理地址。页面不在物理内存中的表项其标志P=0。如果程序存取物理内存中不存在的页面,处理器就会产生一个缺页异常。此时操作系统就可以利用这个异常处理行程把缺少的页面从磁盘上调入物理内存中,并把相应物理地址存放在表项中。最后在返回程序重新执行引起异常的指令之前设置标志P=1.,内存寻址虛拟储存,已存取标志A和已修改标志D可以用于有效地实现虛拟储存技术。通过周期性地检查和重定所有A标志,操作系统能够确定哪些页面最近沒有存取过。这些页面可以成为移出到磁盘上的候选者。假设当一页面从磁盘上读入内存时,标志D=0,那么当页面再次被移出到磁盘上时,若D标志还是为0,则该页面就无需被写入磁盘中。若此时D=l,则说明页面內容已被修改过,于是就必须将该页面写到磁盘上。,