段描述符高速缓冲寄存器

标签:
保护模式,段描述符,高速缓冲寄存器


[转载]--中国自学编程网 http://www.zxbc.cn


  在实模式下,段寄存器含有段值,为访问存储器形成物理地址时,处理器引用相应的某个段寄存器并将其值乘以16,形成20位的段基地址。在保护模式下,段寄存器含有段选择子,如上所述,为了访问存储器形成线性地址时,处理器要使用选择子所指定的描述符中的基地址等信息。为了避免在每次存储器访问时,都要访问描述符表而获得对应的段描述符,从80286开始每个段寄存器都配有一个高速缓冲寄存器,称之为段描述符高速缓冲寄存器或描述符投影寄存器,对程序员而言它是不可见的。每当把一个选择子装入到某个段寄存器时,处理器自动从描述符表中取出相应的描述符,把描述符中的信息保存到对应的高速缓冲寄存器中。此后对该段访问时,处理器都使用对应高速缓冲寄存器中的描述符信息,而不用再从描述符表中取描述符。 

  各段描述符高速缓冲寄存器之内容如下表所示。其中,32位段基地址直接取自描述符, 32位的段界限取自描述符中20位的段界限,并根据描述符属性中的粒度位转换成以字节为单位。其它十个特性根据描述符中的属性而定,“Y”表示“是”,“N”表示“否” ,“R”表示必须可读,“W”表示必须可写,“P”表示必须存在,“D”表示根据描述符中属性而定。 

  段描述符高速缓冲寄存器再处理器内,所以可对其进行快速访问。绝大多数情况下,对存储器的访问是在对应选择子装入到段寄存器之后进行的,所以,使用段描述符高速缓冲寄存器可以得到很好的执行性能。 

  段描述符高速缓冲寄存器之内保存的描述符信息将一直保存到重新把选择子装载到段寄存器时再更新。程序员尽管不可见段描述符高速缓冲寄存器,但必须注意到它的存在和它的上述更新时机。例如,在改变了描述符表中的某个当前段的描述符后,也要更新对应的段描述符高速缓冲寄存器的内容,即使段选择子未作改变,这可通过重新装载段寄存器实现。


---------------------------------------


在实模式(dos)下直接访问4GB内存的方法(没有装载XMS驱动程序Himem.sys的情况)。


基本原理

1.物理地址形成的统一性
无论CPU在实方式下或保护方式下,其物理地址的形成都将使用段描述符高速缓冲寄存器。其差别是:
在实方式下,每当向段寄存器赋予新的内容(段地址)时,段描述符高速缓冲寄存器的基地址值相应发生改变,其值为16×SEG,这就线性基地址;CPU最终形成的物理地址为基地址值加偏移量。段描述符高速缓冲寄存器的界限值和属性值始终不变。当CPU复位后,CPU的工作模式为实方式,段描述符高速缓冲寄存器的界限值自动设置为FFFFH。因此,CPU能够访问内存的空间为0~10FFEFH(FFFFH×16+FFFFH),每个段的大小为64KB。
在保护方式下,每当向段寄存器赋予新的内容SEL(选择字)时,段描述符高速缓冲寄存器的内容将由SEL对应的段描述符更新;段描述符高速缓冲寄存器的基地址值、界限值和属性值依据段描述符的设置而发生改变。段的基地址可设置在4GB内存的任意地址处,段的最大界限值可达FFFFFFFFH(4GB-1)。在不分页的情况下,CPU最终形成的物理地址同样是基地址值加偏移量。所以,CPU能够整个访问4GB内存空。
显然,对于CPU在形成物理地址时,在实方式下与在0特权级不分页的保护方式下是相同的。只是段的基地址和段的大小设置范围不同。工作方式确定是由控制寄存器CR0的最低位PE位决定的,若PE为0,则工作在实方式;若PE为1,则工作在保护方式。在通过PE位的改变时,就进行了工作方式切换。这种切换只影响段描述符高速缓冲寄存器的基地址值运算方式,不影响段描述符高速缓冲寄存器的段界限值。

2.直接访问4GB内存
当CPU复位后,CPU处于实方式下,尽管在实方式下可执行诸如“MOV AX,[ESI]”指令的32位寄存器间接寻址操作,但是ESI的内容必须在0~FFFFH范围内,否则,将引起13号异常中断。
基于CPU物理地址形成的统一性,在实方式下直接访问4GB内存的关键是扩大段描述符高速缓冲寄存器的界限值。使诸如“MOV AX,[ESI]”指令的32位寄存器间接寻址操作实现4GB内存的访问。然而,CPU在实方式下并没有提供改变段描述符高速缓冲寄存器的界限值的操作指令。改变段描述符高速缓冲寄存器的内容只能在保护方式下进行,即向段寄存器赋予段的选择字SEL,段描述符高速缓冲寄存器的内容将由SEL对应的段描述符更新。当CPU从保护方式切换到实方式时,段描述符高速缓冲寄存器的内容不发生变化。
因此,在DOS实方式下直接访问4GB内存之前,让CPU进入保护方式下,通过装载具有4GB界限的段描述符到段描述符高速缓冲寄存器中去。然后返回到实方式下。CPU就可以通过32位寄存器间接寻址操作实现4GB内存的访问。


编程情况

1.设置数据段的4GB界限函数
首先,建立一个全局描述符表GDT,它含有二个描述符,第一个为空描述符(保护方式下系统要求的),第二个是具有4GB段界限的数据段描述符(请看补充说明)。它的选择字为8。再计算出GDT的基地址和长度存入GDT_Addr中。然后,装载GDT,进入保护方式,把选择字8赋给DS和ES,此时第二个是具有4GB段界限的数据段描述符被装载到DS和ES的描述符高速缓冲寄存器中。最后返回实模式。同理,也可设置FS和GS的4GB界限。
2.用lgdt加载gdtr
3.打开A20地址线
4.置cr0的PE位切换至保护模式
5.装载具有4GB界限的数据段描述符
6.清cr0的PE位切换回实模式


*补充说明:
表达不清,欢迎各位纠正,谢谢。
描述符大小是8个byte(byte7至byte0)
段界限设置情况:表示段界限的是byte0和byte1和byte6的低4位。
byte0[0-7] 段界限的0-7位,值为 FFh
byte1[0-7] 段界限的8-15位,值为 FFh
byte6[0-3] 段界限的16-19位,值为 Fh

属性位设置情况:表示属性的是byte6的高4位和byte5。
byte5[0-3] type属性,值为2,说明:读/写
byte5[4] S属性,值为1,说明:数据段和代码段描述符
byte5[5-6] DPL属性,值为0,说明:特权级范围0
byte5[7] P属性,值为1,说明:段在内存中存在

byte6[4] AVL属性,值为0,保留位
byte6[5] 0,貌似没作用
byte6[6] D/B属性,值为0,详细内容请google
byte6[7] G属性,值为1,段界限粒度为4KB。(原因不懂)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值