从实模式到保护模式-第11章

  1. 和一大段有关的信息需要8个字节来描述,所以称为段描述符,每个段都需要一个描述符。为了存放这些描述符,需要在内存中开辟出一段空间。在这段空间里,所有的描述符都是挨在一起,集中存放的,这就构成一个描述符表
  2. 最主要的描述符表是全局描述符表(GDT),所谓全局,意味着该表是为整个软硬件系统服务的。在进入保护模式之前,必须要定义全局描述符表
  3. 为了跟踪全局描述符表,处理器内部有一个48位的寄存器,称为全局描述符表寄存器(GDTR)。该寄存器分为两部分,分别是32位的线性地址和16位的边界。32位的处理器具有32根地址线,可以访问的地址范围是0x00000000到0xFFFFFFFF,共2^32字节的内存,即4GB。所以,GDTR的32位线性基地址部分保存的是全局描述符表在内存中的起始线性地址,16位边界部分保存的是全局描述符表的边界(界限),其在数值上等于表的大小(总字节数)减1,换句话说,全局描述符表的界限值就是表内最后1字节的偏移量。第一字节的偏移量是0,最后一字节的偏移量是表大小减一,如果界限值为0,表示表的大小是1字节
  4. 因为GDT的界限值是16位,所以,该表最大是2^16字节,也就是65536字节(64KB)。又因为一个描述符占8字节,故最多可以定位8192个描述符
  5. 理论上,全局描述符表可以位于内存中的任何地方,但是由于进入保护模式之后,处理器立即要按新的内存访问模式工作,所以必须在进入保护模式之前定义GDT,但是由于实模式下只能访问1MB的内存,故GDT通常都定义在1MB以内的内存范围中。当然,允许在进入保护模式之后换个位置重新定义GDT
  6. 描述符不是由用户程序自己建立的,而是在加载时,由操作系统根据你的程序结构建立的,而用户程序通常是无法建立和修改GDT的,也就只能老老实实地在自己的地盘上工作。在这种情况下,操作系统为你的程序建立了几个段,你就只能在这些段内工作,超出这个范围,或者未按预定的访问这些段,都会被处理器阻止
  7. 8字节描述符(64位)如下,上面为高位,下面为低位
    在这里插入图片描述
    (1) 20位的段界限用来限制的扩展范围,因为访问内存的方法使用段基地址加上偏移量,所以,对于向上扩展的段,如代码段和数据段,偏移量是从0开始递增的,段界限决定了偏移量的最大值;对于向下扩展的段,比如栈段,段界限决定了偏移量的最小值
    (2) G位是粒度位,用于解释段界限的含义。当G位是0时,段界限以字节为单位,此时,段的扩展范围是从1字节到1兆字节(20位);如果该位是1,段界限是以4KB为单位,段的扩展范围是从4KB到4GB
    (3) S位用于指定描述符的类型,为0时,表示系统段;为1时,表示代码段或数据段(栈段也是特殊的数据段)
    (4) DPL是特权级
    (5) P是段存在位,用于指示描述符所对应的段是否存在。一般来说,描述符所指示的段都位于内存中。但是,当内存空间紧张时,有可能只是建立了描述符,对应的内存空间并不存在,这时,就应当把描述符的P位清零,表示段并不存在;另外,同样是在内存空间紧张的情况下,会把很少用到的段换出到硬盘中,腾出空间给当前急需内存的程序使用(当前正在执行的),这时,同样需要把段描述符的P位清零。当再次轮到它执行时,再装入内存,然后将P位置1
    (6) D/B位是默认操作数大小,16位或32位,为了兼容16位程序
    (7) L位是64位代码段标志,保留给64位程序使用
    (8)TYPE共4位,用于指示描述符的子类型,或者说类别,对于数据段来说,这4位分别是X,E, W,A;对于代码段来说,这四位分别是X,C,R,A位
    在这里插入图片描述
    X表示是否可以执行(eXecutable),数据段总是不可执行的,X=0;代码段总是可执行的,X=1
    A表示已访问(Accessed)位,用于指示它所指的段最近是否被访问过。在创建描述符的时候,应该清零。之后,每当该段被访问时,处理器自动将该位置1,对该位的清零由操作系统负载,通过定期监视该位的状态,就可以统计出该段的使用频率,在内存紧张的时候,可以把不经常用的段退到硬盘上,从而实现虚拟内存管理
  8. 控制实模式和保护模式的切换是CR0寄存器,CR0是一个32位寄存器,包含了一系列用于控制处理器操作模式和运行状态的标志位。它的第一位(位0)是保护模式允许位(Protection Enable,PE),如果该位置1,则处理器进入保护模式,按保护模式的规则开始运行
  9. 保护模式和实模式下的中断机制不同,在保护模式下,BIOS中断都不能再用,因为它们是实模式下的代码,在重新设置保护模式下的中断环境之前,必须关中断
    10.实模式下的6个段寄存器CS,DS,ES,FS,GS,SS,在保护模式下叫做段选择器。和实模式不同,保护模式的内存访问有它自己的方式,在保护模式下,传送到段选择器的内容不是逻辑段地址,而是段描述符在描述符表中的索引号。然后将描述符表中该段的线性基地址,段界限,和段的访问属性加载到寄存器的描述符高速缓存器中。只有不改变段寄存器的内容,以后每次内存访问都直接使用DS描述符高速缓存器中的内容 (怎么知道段寄存器有没有改变
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值