80486微处理器工作在保护模式时对存储器的管理有两个特点:一是引入了分段分页虚拟存储器地址转换机制,二是引入了对存储器的保护机制。地址转换机制使操作系统可以灵活地把存储区域分配给各个任务,而保护机制用来避免系统中的一个任务越权访问属于另一个任务的存储区域或属于操作系统的存储区域。

  80486微处理器有三种存储器地址空间:虚拟地址(逻辑地址)空间、线性地址空间和物理地址空间。

  80486CPU工作在保护模式时,使用46位虚拟地址,虚拟地址空间最大可达64TB(字节),采用分段分页管理机制;线性地址空间是一个不分段的、连续的地址空间,线性地址为32位,所以线性地址空间(即段的最大长度)可达4GB(字节),段数最多可达个,页面大小固定在4KB;物理地址空间的大小同线性地址空间。用户在程序中所使用的地址都是由“段选择符”和“偏移量”组成的逻辑地址,程序在系统中运行时,由存储管理机制把逻辑地址转换成物理地址。

  在80486微处理器中集成有存储管理部件MMU,MMU采用了分段机制和分页机制以实现两级“虚拟—物理”地址的转换,如图5.39所示。

图5.39 两级“虚拟—物理”地址转换

1.分段分页存储管理

  80486微处理器的分段分页存储器工作原理与上节介绍的相同:首先将虚拟地址空间分成若干大小不等的逻辑段,逻辑地址由间接指向段基址的16位段选择符和32位段内偏移量两部分组成,并由分段机制将48位逻辑地址转换为32位线性地址,然后再将线性地址空间等分为固定大小的若干页,将线性地址用页基址和页内偏移量表示,以页为单位进行地址映射,并由分页机制将32位线性地址转换为32位物理地址。

  虚拟地址、线性地址和物理地址的关系如图5.40所示。

图5.40 虚拟地址、线性地址和物理地址的关系

2.分段方式中的地址转换

  分段机制实现逻辑地址到线性地址的转换。它把用户程序中的64TB的虚拟地址空间分成1~4GB大小不等的存储分段,并且有实施段间隔离与保护的硬件机构。

  分段方式中的地址转换原理如图5.41虚线左侧部分所示。程序中的逻辑地址由16位段选择符(通过段选择符可获得32位段基址)和32位段内偏移量构成。段选择符的格式如图5.42所示。逻辑地址中的16位段选择符在程序执行时装载到相应的段寄存器CS, DS, SS, ES, GS, FS中,用来选择逻辑地址空间中的一个特定段,32位偏移量由指令中的寻址方式给出。段选择符长16位:13位索引(Index)、1位表选择位(TI)和2位请求特权级(RPL)位。其中,请求特权级不用于段选择,即16位中只有14位用于段选择,可寻址214个逻辑段,加上每个段最大可达4GB,使32位微处理器的虚拟存储空间可达64TB。

  由程序给出的逻辑地址通过描述符表中的描述符数组进行转换。逻辑地址在段寄存器CS, DS, SS, ES, GS, FS中的选择符用于在全局描述符表(GDT)或局部描述符表(LDT)中索引段描述符。每当段选择符装入段寄存器时,由索引指向的段描述符自动从TI位所选定的GDT或LDT中取出,段描述符中的32位段基址与逻辑地址中的32位偏移量相加即可得到32位线性地址。若不启用分页机制(控制寄存器CR0的PG=0)时,线性地址就是物理地址。

  Index:13位长的选择符变址(索引)值,据此值到GDT/LDT中查找对应的描述符。

图5.41 地址空间转换

图5.42 段选择符的格式

  TI(table index):1位长的表指示符。

  当TI=1时,在LDT中;当TI=0时,在GDT中。

  PRL(request privilege level):段选择符的2位长的请求特权级位。

  在保护方式下,80486微处理器常用三类描述符,分别是全局描述符、局部描述符和中断描述符,用来描述程序中所使用的各种存储段的特性,这些描述符分别存放在三种段描述符表中,分别是全局描述符表、局部描述符表和中断描述符表。所有这些表都是变长的数组,其长度在8B到64KB之间,存放在内存中,每个表最多可以容纳8 192()个8B的段描述符。用户程序使用的虚拟存储空间由全局描述符表和局部描述符表定义的存储分段组成。每个段的最大可寻址存储空间是4GB(),所以处理器为用户提供了2××4GB=64TB()的虚拟地址空间。

  全局描述符表(GDT)定义了能被系统中所有任务公用的存储分段,可以避免对同一系统服务程序不必要的重复定义与存储,GDT中包含了除中断服务程序所在段以外的所有类型存储分段的描述符。通常在GDT中包含了操作系统使用的代码段、数据段、任务状态及系统中各个LDT所在段的段描述符,一个系统只能有一个GDT。

  局部描述符表(LDT)包含了与某个任务相关联的段描述符,在设计操作系统时,通常每个任务有一个独立的LDT。LDT提供了将一个任务的代码段、数据段与操作系统的其余部分相隔离的机制。

  中断描述符表(IDT)最多包含256个中断服务程序位置的描述符。为容纳Intel保留的32个中断描述符,IDT的长度至少应有256个字节。系统所使用的每种类型的中断在IDT中必须有一个描述符表项,IDT的表项通过中断指令、外部中断和异常事件来访问。

  GDT在内存中的位置及其长度由全局描述符表寄存器(GDTR)给出。这是一个48位寄存器,其中高32位存放了GDT的基地址,低16位存放了GDT的长度(段限),GDTR同GDT的关系如图5.43所示。

图5.43 GDTR与GDT的关系

  同样,IDT在内存中的位置及其长度也由一个中断描述符表寄存器(IDTR)给出,IDTR与IDT的关系如图5.44所示。

图5.44 IDTR与IDT的关系

  LDT的定位与GDT不同,LDT的段基址和段限由LDT描述符表示,该描述符同一般的段描述符一样存放在全局描述符表中,因此首先要从GDT中找到LDT描述符。80486微处理器中有一个局部描述符表寄存器(LDTR),这是一个16位寄存器,LDTR中存放一个称为“段选择符”的16位数,段选择符用来在GDT中寻找LDT描述符,LDTR与LDT的关系如图5.45所示。

图5.45 LDTR与LDT的关系

3.分页方式中的地址转换

  分页机制实现了线性地址到物理地址的转换。它把用户的线性地址空间等分为固定大小的块,每一块称为一页,线性地址以“页号—页内地址”对表示。系统也把存储器物理空间等分为同样大小、位置固定的块,每一物理存储块称为“页面”,存储空间的物理地址也以“页面号—页内地址”对表示。为实现页面管理,系统为每个作业建立一张页面对照表——页表,页表内记录了每个线性地址块的页号和为其分配的物理存储块的页面号,当控制寄存器CR0的PG位置1时,就启用了分页存储器管理机制,它自动地把线性地址空间中的任何一页映射到物理空间的一页,将线性地址转换成物理地址。

  为了节省页表所占的内存空间,32位微处理器的MMU分页存储管理采用两级页表转换技术:第一级用个表项构成页目录表,每项4个字节,共有1 024项,占4KB内存,其物理基地址由CR3控制寄存器提供;第二级也是由个表项构成页表,每项也是4个字节,最多1 024个页表,占4KB内存。这样,两级页表组合起来只占8KB内存,即可描述220个表项。

  页目录项和页表项分别说明对应页表和页的属性,其格式相同,如图5.46所示。

  D31~D12给出页表或页面的20位地址,其余12位是标志位或保护信息,定义如下。

  D(dirty):写标志,仅页表项中的D位有意义,页目录项中的D位未用。当进行页面写操作时,D位由硬件置1,并一直保持,直到该页被调出内存。当某页要调出内存时,首先检查D位,若D=1,则把该页内容复制到外存相应位置,以刷新外存上的该页内容。

  A(address):访问标志,说明该目录项或页表项是否在近期被访问过。当页面被访问时,A位由硬件置1。若需要调出一些页面时,页面调度程序只需检查A位即可知各页的使用情况,从而决定调出哪些页。

  PCD(page-level cache disable):页cache禁止位,用于分页高速缓冲存储控制。若PCD=1,内部cache被禁止使用。

  PWT(page-level writes transparent):通写方式位,用于cache写操作。PWT只对装有片外cache的系统起作用。PWT=1时,片外cache采用通写方式;PWT=0时,片外cache采用回写方式。

  U/S(user/superisor,用户/管理员)和R/W(read/write,读/写):表示页面的保护属性,用于对单独的页目录或页面项所指定页表的所有页面提供用户/管理员操作和读/写保护。

  P(present):存在位,决定该页是否要用地址转换。若P=1,表示要用地址转换,即页表或页面在存储器中。

  AVAIL(available):用户使用位,供系统设计人员使用。

  为了与两级页表结构相适应,将32位线性地址分成页目录号(10位)、页号(10位)和页内偏移量(12位)三个字段。通过依次访问页目录表和页表,即可找到与线性地址相对应的物理地址所在的页号。再根据页内偏移量,即可求得32位物理地址。分页地址转换原理如图5.41虚线右侧部分所示,实现过程如下。

  ① 由控制寄存器CR3中提供的页目录表的高20位基地址和线性地址中高10位(A31~A22)页目录号乘以4相加,指向页目录项。

  ② 由页目录项中提供的高20位页表的物理基地址和线性地址中间10位(A21~A12)页号乘以4相加,指向页表项。

  ③ 由页表项找到对应物理页的基地址,此物理页基地址的高20位为物理页号,这样,线性地址高20位表示的线性页号就转换为物理地址高20位表示的物理页号。

  ④ 由于不管是线性地址空间中的逻辑页还是物理地址空间中的物理页,都要与4KB的页边界对准,因此,32位线性地址中的最低12位偏移地址就不必再进行转换便可直接使用。所以最后,物理页号与线性地址中低12位(A11~A0)页内偏移量合成为32位物理地址。

  由上述过程可知,页转换只是对线性地址高20位进行转换,即把线性页号转换成物理页号,页内偏移量对两者都是相同的。在线性空间内,相邻页经过页转换后可能分散在物理空间不同区域,而线性空间不相邻页也可能成为物理空间相邻页。

  采用两级页表转换技术固然具有节省内存的优点,但多访问一级页表会使地址转换速度降低。为此,在32位CPU的分页部件中,设置了一个转换后援缓冲器TLB。TLB是一个四路组相连高速缓冲存储器,其间保存了当前最可能访问的32个页表项,构成一个内存页表的局部副本。这种分页存储管理机制有效地加速了从线性地址到物理地址的转换过程。

图5.47 TLB的结构及地址变换原理

  TLB的结构及地址变换原理如图5.47所示。TLB由两个字段组成:页表数据字段中存放页表项;标记字段中存放与其页表项对应的线性地址的高20位(位31~12,线性页号)。TLB中共可保存32个页表项。当页部件将线性地址变换为物理地址时,先用TLB的标记字段来搜索线性地址位31~12。若搜索到,说明TLB命中,则使用TLB中对应的页表数据字段作为页物理地址位31~12(物理页号);若未搜索到,说明TLB未命中,这时才经内存的二级页表结构去寻找物理页号(页表项),同时将它复制到TLB中。如果复制时TLB已满,则按某种算法进行置换。

  32位微处理器的分页机制和分段机制都使用驻留在内存中的各种表格固定各自的转换函数,这些表格具有彼此独立的表结构,段表存储在线性地址空间,页表存储在物理地址空间。这些存储在存储器中的表格只允许由操作系统进行访问,应用程序不能对其进行修改。操作系统为每一任务维护一个不同的转换表格集,使每个任务可使用的地址跨越整个虚拟地址空间,这样不仅使每个任务具有不同的虚拟地址空间,并且使任务之间可以彼此隔离。

4.存储保护机制

  80486微处理器支持两个主要的保护机制:一个是通过给每个任务分配不同的虚拟地址空间,使任务之间完全隔离,每个任务有不同的“虚拟地址—物理地址”的转换映射;另一个是任务内的保护机制操作,保护操作系统存储段及处理器寄存器,使其不能被其他应用程序破坏。

在存储器的虚拟地址空间中仅由一个任务占有的虚拟地址空间部分,即不可被其他任务共享的虚拟地址部分,称为“局部地址空间”。操作系统存储在全局地址空间中,使操作系统由所有任务共享,并且允许每一任务对其进行访问,而且仍然保护了操作系统,使其不被应用程序破坏。

图5.48 80486微处理器支持四级保护的特权级层次结构

  80486微处理器支持四级保护的特权级(privilege level),如图5.48所示。特权级标号为0~3,其0级为最高特权级,处于最内层,3级为最低特权级,处于最外层。每个存储段都同一个特权级相联系,只有足够级别的程序才可以对相应的段进行访问。在运行程序时,微处理器是从CS寄存器寻址的段中取出指令并执行指令的,当前活跃代码段的特权级称为“当前特权级”(current privilege level,CPL),CPL确定哪些段可由程序访问。处理器的保护机制规定,对给定CPL的执行程序,只允许访问同一级别或外层级别的数据段,若试图访问内层级别的数据段则属于非法操作,将产生一个异常,向操作系统报告这一违反特权规则的操作。

  特权级的典型用法是:把操作系统核心放在0级,操作系统的其余部分——系统服务程序放在1级,应用系统服务程序(操作系统扩展)——中间软件放在2级,应用程序放在3级。这样,一个任务的操作系统程序、中断服务程序和其他系统软件因处于不同的特权层而得到保护,因而可与应用程序在同一地址空间内共处而不发生越权操作。

80486保护模式存储管理相关推荐

  1. 实地址模式与保护模式下的中断与异常处理

    在中断和异常的处理过程中,很重要的一件事是如何识别中断源,获取中断服务子程序的入口地址.在80486 CPU系统中,因为CPU的工作模式不同而获取中断向量的方式有所不同,本节讨论CPU工作在实地址模式 ...

  2. x86CPU 实模式 保护模式 傻傻分不清楚? 基于Xv6-OS 分析CR0 寄存器

    基于Xv6-OS 分析CR0 寄存器 之前一直认为晕乎乎的...啥?什么时候切换real model,怎么切换,为什么要切换? ------------------------------------ ...

  3. Windows保护模式学习笔记(十二)—— 控制寄存器

    Windows保护模式学习笔记(十二)-- 控制寄存器 控制寄存器 Cr0寄存器 Cr2寄存器 Cr4寄存器 控制寄存器 描述: 控制寄存器有五个,分别是:Cr0 Cr1 Cr2 Cr3 Cr4 Cr ...

  4. 程序的加载和执行(一)——《x86汇编语言:从实模式到保护模式》读书笔记21

    程序的加载和执行(一) 本文及之后的几篇博文是原书第13章的学习笔记. 本章主要是学习一个例子,对应的代码分为3个文件: ;代码清单13-1;文件名:c13_mbr.asm;文件说明:硬盘主引导扇区代 ...

  5. 【OS学习笔记】三十八 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----微型内核汇代码

    本文是以下几篇文章对应的微型内核代码汇编代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 保护模式十 ...

  6. 【OS学习笔记】三十二 保护模式九:分页机制对应的汇编代码之---内核代码

    本片文章是以下两篇文章: [OS学习笔记]三十 保护模式九:段页式内存管理机制概述 [OS学习笔记]三十一 保护模式九:页目录.页表和页三者的关系详解 对应的内核汇编代码. ;代码清单16-1;文件名 ...

  7. 【OS学习笔记】二十八 保护模式八:任务切换对应的汇编代码之内核代码

    本汇编代码对应以下两篇文章对应的内核汇编代码: OS学习笔记]二十六 保护模式八:任务门-任务切换 [OS学习笔记]二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中断嵌套 ...

  8. 【OS学习笔记】二十一 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之内核代码

    本汇编代码对应文章保户模式下操作系统内核如何加载用户程序并运行 中的实际内核代码 对应的主引导扇区代码:主引导扇区代码 对应的用户程序代码:用户程序代码 ;代码清单13-2;文件名:c13_core. ...

  9. 【OS学习笔记】二十 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之主引导扇区程序

    本汇编代码对应保户模式下操作系统内核如何加载用户程序并运行 的实际主引导扇区代码: 对应的内核代码在:内核代码 对应的用户程序代码在:用户程序代码 ;代码清单13-1;文件名:c13_mbr.asm; ...

最新文章

  1. MyBatis 一个简单配置搞定数据加密解密!
  2. R语言distCosine函数计算大圆距离实战(Law of Cosines Great Circle Distance)
  3. android美颜功能,Android
  4. 开发经理 VS 敏捷专家
  5. js读取div从html中导入,在html中div+css布局的简单应用...-js+div+css下拉导航菜单完整代...-CSS文件的条件导入 - Gene Li_169IT.COM...
  6. linux 安装tomcat遇到的问题
  7. [Perl] Python 与 Perl 合并,打造史上最牛语言 Parrot
  8. pandas 中文打印无法对齐_2天学会Pandas
  9. linux lddbus设备,Linux设备驱动程序学习(14)-Linux设备模型(各环节的整合)
  10. 大学计算机专业的实验室图片,清华大学计算机系人工智能实验室.PDF
  11. 浅谈软件外包项目报价
  12. vue2.0 海报生成器、二维码生成器
  13. 八大顶层设计,决定企业融资难度
  14. Android GMS认证总结01
  15. 服务器系统事件id1001,win10系统玩游戏出现蓝屏事件ID1001的解决方法
  16. Postman高级用法
  17. 【应急】应急信息“一张图”,福建省是这样用的
  18. package.josn中^和~的区别
  19. 家具力学性能测试软件,家具力学性能
  20. 79g道闸雷达_79GHz道闸雷达调试软件

热门文章

  1. hdu4920 矩阵乘法%3
  2. visual studio 汇编 创建 项目
  3. 【Android 插件化】使用 PluginKiller 帮助应用开发者规避发布的 APK 安装包被作为插件的风险 ( 验证应用是否运行在插件化引擎中 )
  4. 【EventBus】EventBus 源码解析 ( 注册订阅者总结 | EventBus 注册订阅者流程梳理 )
  5. 【Android 插件化】Hook 插件化框架 ( 加载插件包资源 )
  6. 【Android 插件化】Hook 插件化框架 ( 合并 “插件包“ 与 “宿主“ 中的 Element[] dexElements | 设置合并后的 Element[] 数组 )
  7. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式...
  8. P4245 【模板】任意模数NTT
  9. mysql 触发器介绍
  10. 如何获取程序返回值,退出码,错误码