80386保护模式学习记录1

$保护方式的作用
#在保护方式下,全部32条地址线有效,可以寻址高达4G字节的物理地址空间;
#扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提哦那个了硬件支持;
#支持多任务,能够快速的进行任务切换和保护任务环境;
#4个特权级别和完善的特权检查机制,既能实现资源共享又能保证代码及数据的安全和保密、及任务的隔离;
#支持虚拟8086方式,便于执行8086程序。
$在以80386及其以上处理器为CPU的PC兼容机系统中,把地址在1M以下的内存称为常规内存,把地址在1M以上的内存称为扩展内存。
$实际的微机系统在80386出现的时候,不可能安装4G的内存,因此为了运行大型程序以及实现多任务,必须采用 虚拟存储器。
$保护方式下的虚拟存储器由大小可变的存储块儿构成,这样的存储块儿称为段。80386采用称为描述符的数据来描述段的位置大小和使用情况。虚拟存储器的地址,也就是逻辑地址,由指示描述符的选择子和段内偏移两部分组成。
$80386支持的虚拟空间可达64T字节。原因是这样的:一个任务可使用的整个虚拟地址空间分为相等的两半,一半空间的描述符在全局描述符表中,另一半空间的描述符在局部描述符表中。由于全局和局部描述符表都可以包含多达8096个描述符,而每个描述符所描述的段最大可达4G字节,因此最大的虚拟地址空间可为:4GB*8096*2=64TB
$虚拟空间必须映射到物理地址空间,二维的虚拟地址必须转换为一维的物理地址。但是物理地址空间远远小于虚拟地址空间,所以只有虚拟地址空间中的部分可以映射到物理地址空间。由于物理地址空间的大小要远大于物理存储器的大小,所以只有上述部分中的部分才能真正映射到物理存储器。
物理地址空间:
$每一个任务都有一个虚拟地址空间。为了避免多个并行任务的多个虚拟地址空间直接映射到同一个物理地址空间,采用线性地址空间隔离虚拟地址空间和物理地址空间。
线性地址空间由一维的线性地址构成,线性地址空间和物理地址空间对应,线性地址有32位长,线性地址空间容量位4G字节。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#80386的地址映射转换,两种方式:
1.选择子(15bit):偏移量(32bit) -- >  分段管理机制 --> 线性地址(32bit)  -->物理地址(32bit)
2.选择子(15bit):偏移量(32bit) -- >  分段管理机制 --> 线性地址(32bit)  --> 分页管理机制 --> 物理地址(32bit)


#通过描述符表和描述符,分段管理机制实现虚拟地址空间到线性地址空间的映射,实现吧二维的虚拟地址转换为一维的线性地址。
#分页管理机制把线性地址空间和物理地址空间分别划分为大小相同的块,这样的块儿称为页。通过在线性地址空间的页与物理地址空间的页之间建立的映射表,分页管理机制实现线性地址空间到物理地址空间的映射,实现线性地址到物理地址的转换。
#分页管理机制是可选的,在不采用分页管理机制的时候,线性地址空间就直接等同于物理地址空间,线性地址就直接等于物理地址。
#分段管理机制使用的可变大小的块儿,是分段管理机制比较适宜处理复杂系统的逻辑分段。存储块儿的大小可以根据适当的逻辑含义进行定义,而不用考虑固定大小的页所强加的人为限制。每个段可以作为独立的单位处理,以简化段的保护和共享。分页机制使用的固定大小的块最适合于管理物理存储器,无论是管理内存还是外存都是同样有效。分页管理能够有效地支持实现虚拟存储器。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#保护机制能够有效的实现不同任务之间的保护和同一任务内的保护。
#通过把每个任务放置到不同虚拟地址空间,来实现任务与任务的隔离,达到应用程序之间保护的目的。虚拟地址到物理地址的映射函数在每个任务中进行定义。随着任务的切换,映射函数也切换。因此对于两个不同的任务,尽管虚拟存储单元地址相同,但是实际的物理存储单元地址可以不同。
#在同一个任务之内,定义四种执行特权级别,用于限制对任务中的段进行访问。按照包含在段中的数据的重要性和代码的可信任程度,给段指定特权级别。把最高的特权级别分配给最重要的数据段和最可信任的代码段。用0~3表示特权级别。使用“里面”或“内层”这样的术语表示较高特权级。
#在任何时候,一个任务总在四个特权级之一下运行,任务在特定时刻的特权级称为当前特权级(CPL)。每当一个程序试图访问一个段的时候,就把CPL和要访问的段的特权级进行比较,以决定是否允许这一访问。
#特权级的典型用法是:把操作系统的核心放在0级,操作系统的其他部分放在1级,应用程序放在3级,留在2级供中间软件使用。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
10.2节,分段管理机制
#段是实现虚拟地址到线性地址转换机制的基础。保护方式下,段由段基地址,段界限,段属性三个参数定义。
#段基地址规定线性地址空间中段的开始地址。80386保护方式下,段基地址的长度为32bit。由于寻址地址的长度也是32bit,所以任何一个段都可以从32位线性地址空间中的任何一个字节开始,而不是实方式下规定的段的边界必须能够被16整除。
#实方式下,段寄存器长16位,而8086/8088CPU有20根地址线,所以,逻辑段的开始地址必须是16的倍数;由于指针寄存器也是16位的,所以逻辑段的最大长度是64K 。
#段界限规定段的大小。保护方式下,段界限用20位表示,而且可以是以字节为单位或者以4K字节为单位。段属性中的粒度位对此进行定义。
#基地址和界限定义了段所映射的线性地址的范围。段内从偏移0到limit范围的虚拟地址对应着从base到base+limit范围内的线性地址。
#通过增加段界限,可以是段的容量得到扩展。数据段的扩展方向和段界限一起决定了数据段内偏移的有效范围。


#堆栈段是特殊的数据段。只有数据段的段属性中才有扩展方向属性位ED,也就是说只有数据段才有向高扩展和向低扩展之分,其他段都是自然的向高扩展。
#在每次把虚拟地址转换为线性地址的过程中,要对偏移进行检查。如果偏移不再有效的范围之内就会引起异常。
#用于表示上述定义段的三个参数的数据称为描述符。每个描述符长8个字节。在保护方式下,每一个段都有一个相应的描述符来描述。描述符按照描述的对象划分可以分为存储段描述符,系统段描述符和门描述符。
#存储段描述符是存放可由程序直接进行访问的代码和数据的段,也被称为代码和数据段描述符。
--------------------------------------------------------------------
存储段描述符的结构类型表示:                                                                                                    
DESCRIPTOR      STRUC                                                                                        
       LIMITL        DW 0 ;段界限(0~15)                                           
       BASEL         DW 0 ;段基址(0~15)
       BASEM         DB 0 ;段基地址(15~23)
       ATTRIBUTES    DW 0 ;段属性(含段界限的高4位)
       BASEH         DB 0 ;段基地址(24~31)
DESCRIPTOR      ENDS
--------------------------------------------------------------------
#一个任务会涉及多个段,每个段需要一个描述符来描述,为了便于组织和管理,80386把描述符组织成线性表。由描述符组成的线性表称为描述符表。GDT,LDT,IDT是80386中的三种类型的描述符表。在整个系统中,GDT和LDT只有一张,LDT可以每个任务有一张。
#每个描述符表本身形成一个特殊的数据段,这样的数据段最多可以含有8K个描述符。原因如下:全局描述符表寄存器GDTR长48位,其中高32位含基地址,低16位含有界限。所以段最大2^16=64KB.每个描述符8B。所以每个描述符表最多含有64KB/8B=8192个描述符。书上说含有8096个描述符,应该是印刷错误。关于这个还有另外一种说法,#段选择子中描述符索引字段用13位表示,所以最多可区分8192个描述符,这也就是描述符表最多含有8192个描述符的原因。书上说8096应该是错误的。
#LDT中含有该任务自己的代码段、数据段和堆栈段的描述符,也包含该任务所使用的一些门描述符,如任务门和调用门描述符等。随着任务的切换,系统当前的局部描述符表LDT也随之切换。
#全局描述符表GDT含有每一个任务都可能或可以访问的段的描述符,通常包含描述操作系统所使用的代码段、数据段、和堆栈段的描述符。
#通过LDT可以使各任务私有的各个段与其他任务相隔离,从而达到受保护的目的。通过GDT可以使各任务都需要使用的段都可以被共享。
#一个任务可使用的整个虚拟空间可以分成相等的两半,一半的空间的描述符在GDT中,一半的描述符在LDT中。
#保护方式下的段选择子代替了实方式下的段值。段选择子长16位,其中高13位是描述符索引。选择子确定描述符,描述符确定段基地址,段基地址与偏移之和就是线性地址。
#由于描述符长8字节,屏蔽选择子的低三位后得到的值就是选择子所指定的描述符在描述符表中的偏移。这可认为是安排选择子高13位为描述符索引的原因。
#空选择子index=0,TI=0。但是空选择子不对应与GDT中的第0个描述符,有特定的用途。


#为了避免在每次存储器访问的时候,都要访问描述符表而获得对应段描述符,增加了段描述符高速缓冲寄存器,或者描述符投影寄存器。
#每当把一个选择子装入到某个段寄存器时,处理器自动从描述符表中取出对应的描述符,把描述符中的信息保存到对应的告诉缓冲寄存器。绝大多数情况下,对存储器的访问是在对应的选择子装入到段寄存器之后进行的,所以使用段描述符高速缓冲寄存器可以得到很好的执行性能。段描述符高速缓冲寄存器中保存的描述符信息将一直保存到重新把选择子装载到段寄存器时再进行更新。通过重新装载段寄存器可以实现更新相应的段描述符告诉缓冲寄存器。


#80386有CR0,CR1,CR2,CR3四个32位的控制寄存器。但是CR1被保留,供今后开发的处理器使用。80386不能使用CR1,否则将会引起无效指令操作异常。
#CR0包含指示处理器工作方式的控制位,包含启用和禁用分页管理机制的控制位,包含控制浮点协处理器操作的控制位。CR2和CR3由分页管理机制使用。
#CR0中的位5~30及CR3中的位0~11是保留位,这些位不能是随意值,必须为0.
#控制寄存器CR0的低16位等同于80286的机器状态字MSW.
#CR0的位0用PE标记,位31用PG位标记,这两个位控制分段和分页管理机制的操作,所以把他们称为保护控制位。PE控制分段管理机制。PE=0,处理器运行于实方式,PE=1,处理器运行于保护方式。
#CR0用于在发生页异常时报告出错信息。发生异常的时候,处理器把引起页异常的线性地址保存在CR2中。
#CR3用于保存页目录表的起始物理地址。由于目录是页对齐的,所以仅高20位有效,低12位保留未用。向CR3中装入新的值的时候,低12位必须为0;但是从CR3中取值的时候,低12位被忽略。
#系统地址寄存器:GDTR,LDTR,IDTR,TR
#GDTR长48位,其中高32位含有基地址,低16位含界限。由于GDT不能由GDT本身之内的描述符进行描述定义,所以采用GDTR.
------------------------------------------------------------------------------------
;伪描述符结构类型的定义
PDESC  STRUC
   LIMIT  DW 0 ;16位界限
   BASE   DD 0 ;基地址
PDESC  ENDS
------------------------------------------------------------------------------------
3LDTR类似于段寄存器,由程序员可见的一个16位寄存器和程序员不可见的高速缓冲寄存器组成。实际上每个任务的局部描述符表LDT作为系统的一个特殊的段,由一个描述符描述,这个描述符存放在GDT中。
#在初始化或者任务切换的过程中,把指示描述对应任务LDT的描述符的选择子装入LDTR,处理器根据装入LDTR可见部分的选择子,从GDT中取出对应的描述符,并把LDT的基地址和界限等信息保存到LDTR的不可见的高速缓冲寄存器中。随后对LDT的访问,就可以根据保存在高速缓冲寄存器中的有关信息进行合法性检查。
#IDTR长48位,其中32位的基地址规定IDT的基地址,16位的界限规定IDT的段界限。由于80386的只支持256个中断/异常,所以IDT表的最大长度是2K,以字节为单位的段界限为7FFH。
#任务状态段寄存器TR包含只是描述当前任务的任务状态段的描述符选择子,从而规定了当前任务的状态段。TR包含程序员可见的和不可见的部分。同LDTR.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值