第1章 背景知识
1.3 必须了解的东西(2)
80386的段寄存器是16位的,无法放下保护模式下64位的段描述符。如何解决这个新的问题呢?解决办法是把所有段的段描述符顺序放在内存中的指定位置,组成一个段描述符表(Descriptor Table);而段寄存器中的16位用来做索引信息,指定这个段的属性用段描述符表中的第几个描述符来表示。这时,段寄存器中的信息不再是段地址了,而是段选择器(Segment Selector)。可以通过它在段描述符表中“选择”一个项目以得到段的全部信息。
既然这样,段描述符表放在那里呢?80386中引入了两个新的寄存器来管理段描述符表。一个是48位的全局描述符表寄存器GDTR,一个是16位的局部描述符表寄存器LDTR。那么,为什么有两个描述符表寄存器呢?
GDTR指向的描述符表为全局描述符表GDT(Global Descriptor Table)。它包含系统中所有任务都可用的段描述符,通常包含描述操作系统所使用的代码段、数据段和堆栈段的描述符及各任务的LDT段等;全局描述符表只有一个。
LDTR则指向局部描述符表LDT(Local Descriptor Table)。80386处理器设计成每个任务都有一个独立的LDT。它包含有每个任务私有的代码段、数据段和堆栈段的描述符,也包含该任务所使用的一些门描述符,如任务门和调用门描述符等。
不同任务的局部描述符表分别组成不同的内存段,描述这些内存段的描述符当做系统描述符放在全局描述符表中。和GDTR直接指向内存地址不同,LDTR和CS,DS等段选择器一样只存放索引值,指向局部描述符表内存段对应的描述符在全局描述符表中的位置。随着任务的切换,只要改变LDTR的值,系统当前的局部描述符表LDT也随之切换,这样便于各任务之间数据的隔离。但GDT并不随着任务的切换而切换。
看到这里,读者可能会提出一个问题,既然有全局描述符表和局部描述符表两个表,那么段选择器中的索引值对应哪个表中的描述符呢。实际上,16位的段选择器中只有高13位表示索引值。剩下的3个数据位中,第0,1位表示程序的当前优先级RPL;第2位TI位用来表示在段描述符的位置;TI=0表示在GDT中,TI=1表示在LDT中。
以图1.3为例,在保护模式下,同样以xxxx:yyyyyyyy格式表示一个虚拟地址。单单凭段选择器中的数值xxxx根本无法反映出段的基址在哪里。对于这个地址,首先要看xxxx的TI位是否为0,如果是的话,则先从GDTR寄存器中获取GDT的基址(图中的步骤①),然后在GDT中以段选择器xxxx的高12位当做位置索引得到段描述符(步骤②)。段描述符包含段的基址、限长、优先级等各种属性,这就得到了段的起始地址(步骤③);如果xxxx的TI位为1的话就更复杂了,这表示段描述符在LDT中,这时第一步的操作还是从GDTR寄存器中获取GDT的基址(步骤1'),并且要从LDTR中获取LDT所在段的位置索引(步骤2');然后以这个位置索引在GDT中得到LDT段的位置(步骤3');然后才是用xxxx做索引从LDT段中获得段描述符(步骤4'),再以这个段描述符得到段的基址等信息(步骤5')。分这两种情况得到段的基址后(图中Result所示),再以基址加上偏移地址yyyyyyyy才得到最后的线性地址。
关于段描述符的格式定义,读者可以参考其他讲述保护模式的书籍。
分享到:
相关推荐
总的来说,"VC版水波特效根据罗云彬汇编代码改写"是一个将底层汇编代码转化为高级语言的过程,同时兼顾了代码的可读性、性能和跨平台兼容性。这个项目对于学习图形编程、了解底层机制以及代码优化的开发者来说,具有...
《罗云彬的汇编教程》是一份专为学习汇编语言的人士精心准备的教程资源,由知名讲师罗云彬编写。这份教程涵盖了汇编语言的基础知识、进阶技巧以及实际应用,旨在帮助初学者快速掌握汇编语言的核心概念,并逐步提升到...
《罗云彬的汇编教程》是一本深受读者好评的汇编语言学习资源,它以其深入浅出的讲解和丰富的实例赢得了广大编程爱好者的青睐。汇编语言是计算机科学的基础,是与机器直接对话的语言,对于理解计算机底层运作机制、...
《罗云彬的汇编教程-汇编经典》是一份深度涵盖汇编语言学习的资源,主要关注Win32汇编和X86汇编这两个关键领域。汇编语言是计算机科学的基础,它允许程序员直接与机器硬件进行交互,执行低级别的计算任务,对系统...
本书作者罗云彬拥有十余年汇编语言编程经验,是汇编编程网站http://asm.yeah.net和汇编编程论坛http://win32asm.yeah.net的站长。本书是作者多年来编程工作的总结,适合于欲通过Win32汇编语言编写Windows程序的读者...
《汇编编写的卡通小闹钟》是一款独特的软件应用,其核心编程语言是汇编,这使得它在执行效率和对系统资源的控制上具有显著优势。汇编语言是一种低级编程语言,直接对应计算机的机器指令,因此,用汇编编写的程序通常...
《罗云彬的汇编教程》是一套深入浅出、全面介绍汇编语言编程的教程。汇编语言,作为计算机科学的基础,是直接对应机器指令的编程语言,它以其高效性和底层控制能力在系统编程、嵌入式开发以及性能优化等领域有着广泛...
《罗云彬的汇编教程》是一份极富价值的学习资源,专为对汇编语言感兴趣的初学者和进阶者设计。这份教程详尽地介绍了汇编语言的基础知识,以及它与计算机硬件之间的紧密联系,旨在帮助学习者深入理解计算机底层运作...
《罗云彬win32汇编教程》是一部深入讲解Windows平台下汇编语言的经典教程,由知名编程专家罗云彬撰写。本教程以其详尽的内容和深入浅出的讲解方式,深受广大编程爱好者喜爱,是学习Win32汇编语言不可多得的参考资料...
《罗云彬win32汇编教程》是一本专注于Windows平台下汇编语言编程的经典教材。作者罗云彬以其深入浅出的讲解风格,为读者揭示了Win32汇编语言的魅力与精髓。这本书旨在帮助读者理解计算机底层运作机制,掌握在Windows...
【标题】:“罗云彬 Windows32位汇编罗云彬” 【描述】:这个描述似乎存在重复,但我们可以理解为这是对一个专注于Windows平台32位汇编语言学习资源的强调。罗云彬可能是一位知名的讲师或者作者,他专注于Windows下...
《罗云彬——Windows环境下32位汇编语言程序设计》是罗云彬老师的一部经典教程,专门针对想要深入理解计算机底层运作机制并学习汇编语言的读者。该教程以Windows操作系统为背景,详细讲解了32位汇编语言在这一平台上...
罗云彬32位汇编及源码是一个关于汇编语言编程的学习资源,包含了详细的教程和实际的代码示例。这个资源特别适用于那些希望深入理解计算机底层运作原理、提升编程技能或者进行系统级编程的IT从业者。以下是这些资料中...
### 罗云彬的Win32汇编教程——深入解析32位环境与Win32汇编 #### 一、32位环境简介及差异对比 在深入了解罗云彬的Win32汇编教程之前,我们首先要明确的是,32位环境与早期的DOS环境在操作系统权限、内存管理以及...
产生随机数的汇编代码.zip(6k) . 保护模式的内存管理.doc(76k) . 保护模式的内存管理2.doc(133k) . 农历阳历转换程序.zip(15k) . 在.exe文件上附加密码程序的例子.zip(6k) . 我的卡通小闹钟V1.0的源代码.zip...
《罗云彬WIN32环境汇编光盘》是一份包含丰富汇编语言学习资源的集合,主要针对在Windows 32位操作系统下进行汇编编程的学者和开发者。汇编语言是计算机科学的基础,它允许程序员直接控制硬件,因此在系统级编程、...
本书作者罗云彬拥有十余年汇编语言编程经验,是汇编编程网站http://asm.yeah.net和汇编编程论坛http://win32asm.yeah.net的站长。本书是作者多年来编程工作的总结,适合于欲通过Win32汇编语言编写Windows程序的读者...