页表

一 页面与页表
1 页面
       分页存储管理是将作业的逻辑地址划分为一系列同等大小的部分,称为页。并为各页加以编号,每个作业的页的编号都是从0开始的。与之类似, 把可用的物理内存也划分为同样大小的连续的部分,称为块或页框。同样为块也进行标号,从0#开始。 在为进程分配内存空间时,以页为单位,每个内存中的块存放一页用户作业。只要内存中有足够多的块,这些块可以相邻也可以不相邻,就可以存放整个作业了。
      页面的大小对于内存利用和系统开销来说非常重要,页面太大,在作业的最后一页必然会剩余较大不能利用的空间-- 内碎片。页面太小,虽然可以减小内碎片的大小,但是一个作业的页太多,会使得作业页表太长而占用内存,同时系统频繁地进行页面转化,加重系统开销。因此, 页面的大小应该适中,通常为512B - 8KB,windows系统的页面大小为 4KB

2 地址结构
     分页系统中的地址结构由两部分组成,页号和页内偏移量。可以解释为一个二元组(p,w),其中p是页号,w是页面p中的偏移量或者相对于p页开始的位置。 下图(a) 中的地址长度为32位,其中0 - 9位为页内偏移量,每页的大小为2的10次方 = 1k;10 - 31位为页号,共计2的22次方 = 4M页。在图(b)中,地址长度同样为32位,其中0 - 11位页内偏移量,每页的大小为2的12次方 = 4k;12 - 31位为页号,共计2的20次方 = 1M页,由此可知不同的系统页的大小是不一样的。

页面与页表 <wbr>与 <wbr>段
                                       (a)页面大小为1KB(2的10次方)

页面与页表 <wbr>与 <wbr>段
                                       (b)页面大小为4KB(2的12次方)
     对于特定的机器来说,其地址结构是一定的。若给定逻辑地址A,页面大小为L,则页号p和页内偏移量w分别为
p = INT [A/L]                      w = [A]MODL
例如:系统的页面大小事1K,设A = 3096,则由上式得出 p =3,w =24。


3 页表
      在分页存储管理中,页的存放可以是连续的,也可以是不连续的,这就增加了逻辑地址到物理地址转换的难度。 如何在内存中找到页所对应的物理块是地址装换的关键。为此, 系统为每个进程创建了一个页表。在进程逻辑地址空间中的每一页,依次在页表中有一个表项,记录了该页对应的物理块号。如下图所示

      页面与页表 <wbr>与 <wbr>段

      在配置了页表之后 ,通过查找页表就可以很容易地找到该页在内存中的位置。页表具有逻辑地址到物理地址映射的作用。
      对于页的保护通常设置一个存取控制字段。当这个字段占一位时,用于规定该页中的内容允许写还是读;如果存取控制字段占两位,那么它可以表示存取控制为读写、只读和只运行三种。当进程写一个只读页时,系统就会通过中断来报错。

二 地址变换结构
     为了实现分页管理逻辑地址到物理地址的转换,系统中必须设置地址变换机构,用来实现地址映射。由于页的大小和块的大小是一样的,当把进程的某一页放入内存时,该页内地址的页偏移量和块内偏移量是一致的,因此地址转换时就不必考虑偏移量,只考虑逻辑页号和实际物理号的对应即可。页表中存放的就是页号和其对应的物理块号,所以地址变换就要借助页表来完成。

1 基本地址变换
        地址变换的第一步就是检索页表。为了实现快速的检索页表,最好把页表放在寄存器中,每一个表项都用一个寄存器。但是有一个问题,通常计算机中的寄存器都不多,而页表可能非常大,现代计算机的虚拟地址至少是32位的,比如,页的大小为4KB,那么32位的地址空间将有1M个页面,64位的地址空间则更多。虚拟空间中的1M个页面需要1M个表项。并且,每个进程都有自己的页表。因此,页表通常存放在内存中。在系统中只设置一个页表寄存器,其中存放页表的开始地址和页表长度。平时进程未执行时,页表的开始地址和页表的长度放在PCB中,当进程运行时,把这两个数据装入页表寄存器中。
      当进程要访问某个地址中的数据时,地址变换机构首先自动地将地址转换成页号和页内偏移量,然后根据页号来检索页表。在检索之前要判断页号是否大于等于页表长度,如果页号大于等于页表长度,说明超出了有效地址范围,于是产生一个错误中断。否则,把页号和页表项长度相乘得到的结果与页表开始地址相加,就得到了该页表项在页表中的地址,从而找到对应的物理块号,把物理块号装入物理地址寄存器中,同时把页内偏移量送入物理地址寄存器对应的块内偏移量中,由此得到真正的物理地址。

      由于页表是放在内存中的,那么一次数据访问需要两次访问内存,第一次访问页表,找到对应的物理号,然后与偏移量拼接形成物理地址;第二次从第一次得到的物理地址结构中访问数据。系统的运行速度一般都受到CPU从内存中取得指令和数据的速率的限制,一次数据两次访问内存会使计算机的处理速度降低50%。如何有效的解决这个问题?
      采取的解决方法是在地址变换结构中增加一个具有并行查找能力的特殊的高速缓冲寄存器,这种设备称为转换检测缓冲区,又称为快表,用于存放当前访问过的页表项。此时,当给出一个有效地址时,地址变换机构首先通过将该页号p同TLB中的所有表项同时进行比较,判断该表是否在其中,如果发现可匹配的页面,则直接取出其页表项得到物理块号,而不必通过页表。如果地址变换机构没有可匹配的项,就进行正常的页表查询。首先从TLB中淘汰一个表项,然后用新找到的页表项替换它。这样,如果这一页很快再次被访问,那么第二次自然将会命中。
      因为寄存器的价格原因,快表的结构不可能很大,通常能存放16 - 512个页表项,这对中小型作业来说,有可能把全部页表放入快表中,对于大型作业,可以将常用的页表项放入其中。由于程序的局部性原则,快表的引入极大改善了系统的效率,数据显示,从快表中查找到页表项的概率可以达到90%。这样因为访问页表而访问内存的次数就会大大减少,从而降低系统的开销。

   2 多级页表
      现代的计算机都有非常大的逻辑地址空间,以32位计算机为例,假设页的大小为4KB,那么一个作业的页最多可以达到2的20次方个,这意味着该作业的 页表现为2的20次方。假设一个页表现占用一个字节,那么该页表的大小为2的20次方B,即需要1MB的内存空间。并且要求者1MB的内存空间是连续的。这显然是不现实的,解决这个问题的最好方法是:把页表页看成普通的文件,对它进行离散分配,即对页表再分页,由此形成多级页表的思想。
      以二级页表为例,将页表进行分页后,离散的存放在不同的物理块中,这样,对这些离散分配的页表再建立页表,即二级页表。在下图中,32位的虚地址划分成10位的外层页表域,10位的内层页表域和12位的页内偏移量。
      
       页面与页表 <wbr>与 <wbr>段


      32位逻辑地址空间使用两级页表映射到32位物理地址空间,每个页面大小为4KB。一级页表的开始物理地址被存放在页表基址寄存器中,一级地址映射使用逻辑地址的最高10位来索引,并产生第二级页表的物理地址。下面10位用来索引第二级页表,产生出的物理页的地址和逻辑地址的最低12位相结合以生成物理地址。如果某二级页表中没有实际映射,就可将其删除并在顶级页表中标记为不可用。许多分页方案在构造的时候都使各级页表的大小和页的大小一致,这样存储它们占用的空间可以和进程使用的内存页使用相同的分配方案。
      对于32位的机器,采用二级页表是合适的;但对于64位的机器,采用二级页表是不合适的,因此必须采用多级页表。
      分页存储管理方式虽然可以解决程序和数据无需连续存储空间的问题,但是这种内存管理方式依然要求整个作业都要装入内存运行,既没有解决大作业小内存的问题,此外,该种管理方式纯粹从存储的角度去考虑,没有考虑到程序本身的存储问题。
    
    说明总结:单页时,由于页表项是连续的(对应着物理地址空间),造成必须占用一整块连续地址空间,是不可取的,所以采用多页表(主要是二级页表),但造成整个逻辑块被分散。 


基本分段分配方式
       分页存储管可以实现内存利用率的提高,但是分页的纯物理解决方案,一个逻辑段被离散的放在很多个物理块中。很多时候,程序员希望把一个程序按照它的逻辑结构存放在内存中。
    一个程序的逻辑段在程序运行过程中有的大小会发生变化,如数据段和堆栈;而有的逻辑段的大小在运行过程中不发生变化,如代码段。在分页存储管理方式中,对于随时动态增长的段的存储管理是非常困难的,一旦断的增长涉及重新分配物理块,那么就涉及页表的修改等问题。
      一个具有n个过程的程序,在分页存储管理中,过程被一个一个紧紧地放在一起,中间没有间隙,结果是修改一个过程的大小会影响其他进程的起始地址,进而又需要修改所有调用被移动进程的进程,以使它们的访问指向这些过程的新地址。在一个有数百个过程的程序中,这个操作的开销是相当大的。
     在分页存储管理中,一个逻辑段可能存放在n个物理块中,如果几个程序共享这个逻辑段就需要早每个程序的页表中添加n项,以便实现地址转换。这样势必会增加页表的大小,进而增加系统的开销,对于逻辑页的保护也是同样的道理。
     针对这些问题,一个非常通用的办法是为一个程序提供多个相互独立的称为段的地址空间。每个段由一个从0到最大的线性地址序列构成。各个段的长度可以是0到某个允许的最大值之间的一个值。不同段的长度可以不同,而且通常也不同。段的长度在运行期间可以改变,堆栈段的长度在数据被压入时会增长。在数据被弹出时又会减小。
     因为每个段都是一个独立的空间,它们可以独立地增长或减小而不会影响到其他的段。段是一个逻辑实体,一个段可能包括一个过程,一个数组,一个堆栈,一组数值变量,但一般它不会同时包含多种不同类型的内容。分段分配方式实现段长度的扩充,段的动态链接以及段的保护和共享都比页式存储容易实现。
   
1 段表
      在分段存储管理中,逻辑地址结构是二维的,即段号和段内偏移量。如下图所示。在该地址结构中,允许一个作业最长有64K个段,每个段的最大长度为64KB。
   
    页面与页表 <wbr>与 <wbr>段
       
       在分段分配方式中,系统为每个分段分配一个连续的分区,进程中的各个段可以离散地装入内存中的不同分区中。为了实现逻辑地址到物理地址的转换,在系统中为每个进程建立一张段表。每个段在段表中都占有一个表项,其中记录了该段的起始地址和段的地址,如图所示,段表可以存放在一组寄存器中,这样有助于提高地址转换速度;但更常见的是放在内存中。在配置了段表之后,执行中的进程可以通过查找段表找到每个段所对应的内存区。
       
       页面与页表 <wbr>与 <wbr>段

2 采用大小不等的段,逻辑地址和物理地址之间不再是简单的对应关系。考虑一个 n+m 位的地址,左边的n位为段号,右边的m位为段内地址。当进程进入运行状态时,它的段表地址被装入到段表寄存器中。     

<think>好的,用户现在问的是“什么是页表”,我需要详细解释页表的概念、作用、结构以及不同操作系统中的实现差异。首先,页表是虚拟内存管理的核心数据结构,用于将虚拟地址映射到物理地址。我需要先定义页表,然后说明它的功能,比如地址转换、内存保护、换页支持等。接着,可能需要介绍页表的结构,比如多级页表(如x86的4级页表),页目录、页表项等。还要提到页表的存储位置(通常在物理内存中),以及TLB(快表)的作用,因为TLB是页表的缓存,用于加速地址转换。另外,可以对比不同架构(如x86、ARM)的页表差异,或者Linux和Windows在页表管理上的不同。最后,确保回答清晰,覆盖用户可能关心的关键点,比如为什么需要页表页表如何工作,以及相关的术语如页框、页帧、页表项等。 首先,页表的基本定义:页表是操作系统为每个进程维护的一种数据结构,用于将进程的虚拟地址空间中的虚拟页(Virtual Page)映射到物理内存中的物理页框(Physical Page Frame),或者标记为已换出到磁盘(交换空间)。每个进程有自己的页表,这是进程虚拟地址空间独立的基础。 然后,页表的作用:1. 地址转换:将虚拟地址分解为页号和页内偏移,通过页表查找对应的物理页框号,与偏移组合得到物理地址。2. 内存保护:页表项(PTE)中包含访问权限(如读、写、执行)、是否脏页(修改过)、是否有效(是否在物理内存中)等标志位,用于限制非法访问。3. 支持虚拟内存:当页表项标记为“不在内存”时,触发缺页中断,操作系统从磁盘交换空间加载对应页到物理内存,并更新页表。 接下来,页表的结构。现代操作系统通常使用多级页表以减少内存占用。例如,x86-64架构使用4级页表:页全局目录(PML4)、页上级目录(PDP)、页目录(PD)、页表(PT)。每个级别的表项指向下一级表的物理地址,最终页表项指向物理页框。多级结构避免了单级页表需要连续大内存的问题,且仅加载需要的页表层级,节省内存。 页表项的内容:每个页表项通常包含物理页框号(PFN)、有效位(Valid Bit)、脏位(Dirty Bit)、访问位(Accessed Bit)、权限位(Read/Write/Execute)、缓存控制位(如是否允许缓存)等。例如,有效位为0时表示该虚拟页不在物理内存中,需要从磁盘加载;脏位为1表示该页已被修改,换出时需写回磁盘。 TLB的作用:由于页表查询需要多次内存访问(多级页表可能需要4次),为了加速地址转换,CPU内置了TLB(转换后援缓冲器),缓存最近使用的虚拟页到物理页框的映射。TLB命中时,无需访问页表,直接得到物理地址;未命中时,才需要遍历页表,并将结果存入TLB。 不同操作系统的页表管理:Linux和Windows在页表实现上类似,但具体细节可能不同。例如,Linux为每个进程维护独立的页表(通过`mm_struct`中的`pgd`指向页全局目录),而Windows使用进程环境块(PEB)和内核结构管理页表。此外,大页(Huge Page)支持(如2MB1GB的页)可以减少页表项数量,提高TLB命中率,适用于数据库等大内存应用。 最后,总结页表的重要性:页表是虚拟内存管理的核心,支撑了进程隔离、内存保护、大地址空间等现代操作系统的关键特性。 </think>### **页表:虚拟内存管理的核心映射工具** 页表(Page Table)是操作系统为每个进程维护的**核心数据结构**,用于将进程的虚拟地址(逻辑地址)映射到物理内存的物理地址,或标记虚拟页是否已被换出到磁盘(交换空间)。它是实现“虚拟内存”机制的关键,支撑了进程隔离、内存保护和大地址空间等核心功能。 #### **一、页表的核心作用** 页表的核心目标是**建立虚拟地址与物理地址的映射关系**,并通过附加信息实现内存管理与保护。具体功能包括: | **功能** | **说明** | |-------------------------|--------------------------------------------------------------------------| | **地址转换** | 将虚拟地址中的“虚拟页号”映射到物理内存中的“物理页框号”,结合页内偏移生成物理地址。 | | **内存保护** | 通过页表项(Page Table Entry, PTE)的权限位(如读、写、执行)限制非法访问。 | | **虚拟内存支持** | 标记虚拟页是否在物理内存中(有效位),若不在则触发缺页中断,从磁盘加载数据。 | | **内存隔离** | 每个进程拥有独立的页表,确保不同进程的虚拟地址空间互不干扰(进程隔离的基础)。 | #### **二、页表的结构与工作原理** 虚拟地址被划分为“虚拟页号”和“页内偏移”两部分(如x86-64系统中,虚拟地址为48位,页大小4KB时,页内偏移占12位,剩余36位为虚拟页号)。页表通过层级结构(多级页表)将虚拟页号逐步分解,最终找到对应的物理页框号。 ### **1. 多级页表:减少内存占用** 现代操作系统(如Linux、Windows)普遍采用**多级页表**(而非单级页表),以降低页表本身的内存开销。以x86-64架构的4级页表为例: - **第1级(PML4)**:页全局目录(Page Map Level 4),包含512个64位表项,每个表项指向一个PDP(页上级目录)的物理地址。 - **第2级(PDP)**:页上级目录(Page Directory Pointer),同样512个表项,每个指向一个PD(页目录)。 - **第3级(PD)**:页目录(Page Directory),512个表项,每个指向一个PT(页表)。 - **第4级(PT)**:页表(Page Table),512个表项,每个表项包含物理页框号(PFN)及附加标志位。 通过多级索引,仅需加载当前进程需要的页表层级,避免了单级页表需要连续数GB内存的问题(如32位系统单级页表需4MB×4KB=16GB内存,显然不可行)。 ### **2. 页表项(PTE)的内容** 每个页表项(PTE)是页表中的一个条目,通常包含以下关键信息(以x86架构为例): | **字段** | **说明** | |-------------------------|--------------------------------------------------------------------------| | **物理页框号(PFN)** | 虚拟页对应的物理内存页框的起始地址(高位部分,低位由页内偏移填充)。 | | **有效位(Valid Bit)** | 0表示虚拟页不在物理内存中(需从磁盘加载);1表示已映射到物理内存。 | | **脏位(Dirty Bit)** | 1表示该页已被修改(换出时需写回磁盘);0表示未修改(可直接丢弃)。 | | **访问位(Accessed Bit)** | 1表示该页最近被访问过(用于LRU等换页算法,决定优先换出的页)。 | | **权限位(R/W/X)** | 控制页的访问权限(如只读、可写、可执行),用于内存保护(如防止用户进程执行内核代码)。 | | **缓存控制位** | 控制该页是否允许CPU缓存(如设备内存需禁用缓存,避免数据不一致)。 | #### **三、页表的访问加速:TLB** 由于多级页表的地址转换需要多次内存访问(如4级页表需4次内存读),为提升效率,CPU内置了**TLB(转换后援缓冲器,Translation Lookaside Buffer)**,缓存最近使用的虚拟页到物理页框的映射。 - **TLB命中**:CPU直接从TLB中获取物理页框号,无需访问页表,地址转换时间仅为纳秒级。 - **TLB未命中**:CPU需遍历页表查找映射关系,并将结果存入TLB(可能淘汰旧的缓存项),导致访问延迟增加(微秒级)。 #### **四、不同架构与系统的页表差异** 页表的具体实现因CPU架构和操作系统而异: - **x86-64 vs ARM**:x86-64使用4级页表(支持4KB、2MB1GB大页),ARMv8使用3级页表(支持4KB、16KB、64KB页)。大页可减少页表项数量,提升TLB命中率(适用于数据库、虚拟机等大内存场景)。 - **Linux vs Windows**:两者均采用多级页表,但Linux通过`mm_struct.pgd`指向页全局目录,Windows通过进程环境块(PEB)和内核结构管理页表。此外,Linux支持“透明大页(THP)”自动合并小页为大页,而Windows需手动配置大页。 ### **总结** 页表是虚拟内存管理的核心工具,通过多级结构实现虚拟地址到物理地址的映射,同时支持内存保护、进程隔离和虚拟内存扩展。TLB的引入解决了页表访问效率问题,而大页机制进一步优化了大内存场景的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值