`
wls981
  • 浏览: 137886 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

段描述符高速缓冲寄存器

阅读更多
[转载]--中国自学编程网 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。
分享到:
评论

相关推荐

    80x86汇编语言程序设计教程

    10.2.5 段描述符高速缓冲寄存器 10.3 80386控制寄存器和系统地址寄存器 10.3.1 控制寄存器 10 3.2 系统地址寄存器 10.4 实方式与保护方式切换实例 10.4.1 演示实方式和保护方式切换的实例(实例一) 10.4.2 演示32位...

    80X86汇编语言程序设计

    - **段描述符高速缓冲寄存器**:加速段描述符的访问。 **10.3 80386控制寄存器和系统地址寄存器** - **控制寄存器**:控制处理器的各种特性。 - **系统地址寄存器**:用于存储处理器状态和配置信息。 **10.4 实...

    保护模式 Protect Mode

    无论是在实模式还是保护模式下,CPU都将段的基地址保存在描述符缓冲寄存器中。当加载段寄存器时,除了基地址外,还包括段大小限制和访问属性等信息也会被加载到这些隐藏寄存器中。这样做的目的是为了提高性能,避免...

    保护模式基础学习教程

    无论在实模式还是保护模式下,CPU都会使用描述符缓冲寄存器来存储每个段的基地址、大小限制和访问属性。当CPU加载段寄存器时,相关信息被加载到这些隐藏寄存器中,从而加速后续的内存访问,避免频繁查询描述符表带来...

    微机系统与接口:第八章 从286到Pentium.ppt

    寄存器方面,尽管基本寄存器集与8086保持一致,但增加了一些新的寄存器,如机器状态字(MSW)、描述符表寄存器、任务寄存器和描述符高速缓冲寄存器,以支持新的存储器管理和保护机制。 标志寄存器FLAGS扩展了IOPL和...

    Linux内存管理报告[收集].pdf

    段选择符,也就是段寄存器,作为16位的索引,配合GDTR寄存器形成32位的段描述符地址。 Linux的分页机制采用二级页表结构,由页目录表和页表组成。这使得内存管理更加灵活且高效。当进程执行时,CPU会通过页目录找到...

    Linux内存管理报告[定义].pdf

    段描述符是一个包含段信息的数据结构,存储在全局描述符表(GDT)和局部描述符表(LDT)中。GDT用于全局地址空间,LDT作为二级表,用于局部地址空间。段选择符实际上是一个索引,用于在描述符表中找到对应的段描述符,...

    IA-32架构软件开发人员手册第3卷 系统编程指南 中文版

    - **系统段、段描述符和门**:系统段包括任务状态段(TSS)等,段描述符定义了段的属性,门描述符用于实现不同特权级之间的调用。 - **任务状态段和任务门**:TSS用于保存CPU的状态信息,任务门用于实现任务间的切换...

    Linux 内存管理介绍

    选择器,也就是段寄存器,用来选择描述符,其中TI位指示是从全局还是局部描述符表中选取,索引域则确定具体哪个描述符。 Linux内核对i386的内存管理进行了简化,仅定义了四种段寄存器的取值,分别对应内核代码、...

    IA-32卷3:系统编程指南

    系统寄存器章节深入探讨了IA-32架构中用于管理内存、中断、任务切换等关键功能的特殊寄存器,如GDTR(全局描述符表寄存器)、LDTR(局部描述符表寄存器)、IDTR(中断描述符表寄存器)和TR(任务寄存器)。...

    STM32F750制作USB虚拟串口(Slave)【支持STM32F7系列单片机_寄存器库驱动】.zip

    4. 生成CDC descriptor:这是描述USB设备信息的数据结构,包括设备描述符、配置描述符、接口描述符和endpoint描述符。 5. 数据传输:通过中断处理数据收发,读写USB FIFO(First In First Out)进行数据缓冲。 6. ...

    STM32F767制作USB读卡器(Slave)【支持STM32F7系列单片机_寄存器驱动】.zip

    此外,还需要编写USB设备描述符,如设备描述符、配置描述符、接口描述符和端点描述符,这些描述符定义了USB设备的属性和功能。 接下来,我们要关注SD卡(Secure Digital Card)接口的驱动。STM32F767通常会通过SPI...

    XLP平台NAE引擎的egress

    NAE egress的主要任务是处理从ingress(入口)端接收到的descriptor(描述符),这些描述符包含了关于数据包的信息。NAE egress会根据这些信息从内存中读取待传输的数据包,然后将其发送出去。描述符分为三种类型:...

    Project5 Device Driver 设计文档1

    - `des2`设置为缓冲区的物理地址,`des3`设置为下一个描述符的物理地址。 2. **A-Core 中断处理与数据包统计**: - **数据包数量判断**:在A-Core中,数据包数量的判断发生在`do_net_recv`函数内。设计中,每当...

    内存管理之linux内存管理

    段描述符存储在全局描述符表(GDT)、局部描述符表(LDT)和中断描述符表中。选择器(Segment Selector)是16位的,用于从这些描述符表中选取正确的段。选择器包含TI字段(用于区分全局和局部描述符表)、索引字段...

    高速网卡与主机通信技术研究.pdf

    总结来说,高速网卡与主机通信技术的研究主要集中在如何利用DMA和描述符技术优化数据传输,同时通过改进总线架构和中断管理来提高系统整体性能,满足高速网络应用的需求。这些技术对于网络服务器和数据中心的高效...

Global site tag (gtag.js) - Google Analytics