2011年(17)
分类: Delphi
2011-06-30 10:37:46
前面翻译的Intel微处理器第7版的相关章节里分类介绍了常用的寄存器和主要用途,它们共同组成了80X386系列微处理器的编程模型,所谓编程模型都是程序员编程可用的寄存器。其实除此之外还有一类寄存器,它们只能够在最高特权等级下被程序访问,因而通常应用在内核开发上。尤其是CRX的几个寄存器,读内核分页的相关资料时更是频繁出现。
中断描述符(IDTR):保存中断描述符表的地址。
全局描述符(GDTR):保存全局描述符的地址。
局部描述符(LDTR):保存当前正在运行程序的代码段、数据段和堆栈段的指针。
任务寄存器 (Task Register):保存当前执行任务的任务段(TSS)的地址。
调试寄存器 (Debug Register):用于在调试程序时设置断点等。
控制寄存器 (Control Register):CR0,CR2,CR3:包含用于控制系统级操作(任务切换,分页)的状态标志和数据域。
模型专用寄存器(Model-Specific Registers):用于性能监控和机器体系结构检查等系统级操作。
分段与寄存器在实地址模式下,微处理器使用20位的地址总线可以寻址1MB内存。80X86的16位寄存器无法存放20位的地址。Intel的工程师们采用了分段的方法来解决这个问题。使用两个16位整数来表示地址,也被称为段-偏移地址,它包括16位段(存放在CS,DS,ES或者SS中)和16位偏移值。
保护模式可以寻址4GB的内存。在保护模式下CS,DS和ES寄存器不再是段的基地址,而是存放段描述符表,该表包含段地址,大小等信息。段描述符通常是一个存放在GDTR(全局描述符)中的64位值,从64位中不同的范围可以提取出基地址,界限等信息。
分页与寄存器分页使一段程序可以映射到不同的内存区域,它可以将一部分未被使用的内容保存到磁盘上,从而给人一种内存“无限大”的错觉。
控制寄存器是与分页密切相关的一类寄存器,其中CR1是预留寄存器,CR2主要用于控制一些错误信息,而CR4仅仅能够用于pentium以上微处理器。最核心的与分页息息相关的两个寄存器是CR0和CR1。CR0的最左边几位中如果PG被设置为0则直接将线性地址转换成物理地址使用,否则通过分页机制处理线性地址。PE位被设置为1则以保护模式启动,否则为实模式启动。
CR3用于存放页目录的基地址或者根地址和PCD与PWT位(仅486以上有效),当PCD被设置为1时将允许外部硬件控制二级缓存和高速缓存,PWT则启用外部缓存对页面透写与回写(1,0)。
在保护模式下,线性地址被分成三部分,页目录区(22-31),页表区(12-21),和内存页偏移地址(0-11)。
页表区控制指示在页目录中的位置(哪个个页表),然后按照页表和页表的偏移地址找到合适的内存。