`
wls981
  • 浏览: 135945 次
  • 性别: 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。
分享到:
评论

相关推荐

    8086/8088汇编语言程序设计教程

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

    80X86汇编语言程序设计

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

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

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

    微机课后题目答案 答案

    答:80386响应中断后,接收由中断源提供的类型码并将其乘8,与IDTR寄存器中基地址相加,指出中断描述符的位置,读出中断描述符,依其中的段选择符及条件决定从两个描述符表LDT或GDT中的一个得到段描述符,形成中断...

    深入分析Linux内核源码

    2.3.5 选择符与描述符表寄存器 2.3.6 描述符投影寄存器 2.3.7 Linux中的段 2.4 分页机制 2.4.1 分页机构 2.4.2页面高速缓存 2.5 Linux中的分页机制 2.5.1 与页相关的数据结构及宏的定义 2.5.2 对页目录及...

    深入分析Linux内核源码.chm

    2.3 段机制和描述符 2.4 分页机制 2.5 Linux中的分页机制 2.6 Linux中的汇编语言 第三章中断机制 3.1 中断基本知识 3.2中断描述符表的初始化 3.3异常处理 3.4 中断处理 3.5中断的后半部分处理机制 第四章 进程描述 ...

    《汇编语言》-第三版-王爽-以及课后答案

    2.9段寄存器 2.10CS和IP 2.11修改CS、IP的指令 2.12代码段 实验1查看CPU和内存,用机器指令 和汇编指令编程 第3章寄存器(内存访问) 3.1内存中字的存储 3.2DS和(address) 3.3字的传送 3.4mov、add、sub指令 3.5...

    Windows内核安全与驱动开发光盘源码

    8.4.1 从缓冲区中获得KEYBOARD_INPUT_DATA 123 8.4.2 从KEYBOARD_INPUT_DATA中得到键 124 8.4.3 从MakeCode到实际字符 124 8.5 Hook分发函数 126 8.5.1 获得类驱动对象 126 8.5.2 修改类驱动的分发函数指针 127...

    Windows内核安全驱动开发(随书光盘)

    8.4.1 从缓冲区中获得KEYBOARD_INPUT_DATA 123 8.4.2 从KEYBOARD_INPUT_DATA中得到键 124 8.4.3 从MakeCode到实际字符 124 8.5 Hook分发函数 126 8.5.1 获得类驱动对象 126 8.5.2 修改类驱动的分发函数指针 127...

    王爽著《汇编语言》课件及课后习题答案和实验解答

    2.9 段寄存器 2.10 CS和IP 2.11 修改CS.IP的指令 2.12 代码段 实验1 查看CPU和内存,用机器指令和汇编指令编程 第3章寄存器(内存访问) 3.1 内存中字的存储 3.2 DS和[address] 3.3 字的传送 3.4 mov.add....

    USB虚拟串口的资料汇总(包括USB虚拟串口例程)-电路方案

    主机在成功获取到一个数据包的设备描述符后并且确认无错误后,返回一个0长度的状态数据包给设备。 主机再对设备复位一下,接下来进入到设置地址阶段。 USB主机发出一个设置地址的请求,地址包含在建立包中。 USB设备...

    直接存储器存取—基本原理、结构与应用(下)

    在上一期中,我们讨论了分别基于寄存器和描述符的DMA模式。在本文中,我们将在系统层面上探讨应用中关于数据移动的各种选项所应做出的某些重要的决策问题,以及某些先进的DMA功能特性如何协助数据在多媒体系统中有效...

    Linux2.6内核标准教程(共计8-- 第1个)

    5.3.1 中断描述符表的初步初始化 204 5.3.2 中断描述符表的最终初始化 206 5.4 具体处理过程 216 5.4.1 公用的硬件处理阶段 217 5.4.2 中断的软件处理阶段 218 5.4.3 异常的软件处理阶段 229 5.5 延迟...

    Linux2.6内核标准教程(共计8--第6个)

    5.3.1 中断描述符表的初步初始化 204 5.3.2 中断描述符表的最终初始化 206 5.4 具体处理过程 216 5.4.1 公用的硬件处理阶段 217 5.4.2 中断的软件处理阶段 218 5.4.3 异常的软件处理阶段 229 5.5 延迟...

    Linux2.6内核标准教程(共计8--第3个)

    5.3.1 中断描述符表的初步初始化 204 5.3.2 中断描述符表的最终初始化 206 5.4 具体处理过程 216 5.4.1 公用的硬件处理阶段 217 5.4.2 中断的软件处理阶段 218 5.4.3 异常的软件处理阶段 229 5.5 延迟...

    Linux2.6内核标准教程(共计8--第4个)

    5.3.1 中断描述符表的初步初始化 204 5.3.2 中断描述符表的最终初始化 206 5.4 具体处理过程 216 5.4.1 公用的硬件处理阶段 217 5.4.2 中断的软件处理阶段 218 5.4.3 异常的软件处理阶段 229 5.5 延迟...

    Linux2.6内核标准教程(共计8--第2个)

    5.3.1 中断描述符表的初步初始化 204 5.3.2 中断描述符表的最终初始化 206 5.4 具体处理过程 216 5.4.1 公用的硬件处理阶段 217 5.4.2 中断的软件处理阶段 218 5.4.3 异常的软件处理阶段 229 5.5 延迟...

    Linux2.6内核标准教程(共计8--第7个)

    5.3.1 中断描述符表的初步初始化 204 5.3.2 中断描述符表的最终初始化 206 5.4 具体处理过程 216 5.4.1 公用的硬件处理阶段 217 5.4.2 中断的软件处理阶段 218 5.4.3 异常的软件处理阶段 229 5.5 延迟...

    Linux2.6内核标准教程(共计8--第5个)

    5.3.1 中断描述符表的初步初始化 204 5.3.2 中断描述符表的最终初始化 206 5.4 具体处理过程 216 5.4.1 公用的硬件处理阶段 217 5.4.2 中断的软件处理阶段 218 5.4.3 异常的软件处理阶段 229 5.5 延迟...

    Linux2.6内核标准教程(共计8--第8个)

    5.3.1 中断描述符表的初步初始化 204 5.3.2 中断描述符表的最终初始化 206 5.4 具体处理过程 216 5.4.1 公用的硬件处理阶段 217 5.4.2 中断的软件处理阶段 218 5.4.3 异常的软件处理阶段 229 5.5 延迟...

Global site tag (gtag.js) - Google Analytics