Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156593
  • 博文数量: 49
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 445
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-16 23:55
文章分类
文章存档

2009年(49)

我的朋友

分类: LINUX

2009-06-02 18:02:24

第二讲IA32寄存器简介

IA32作为80x86系列中的一员,必须保证向后兼容,也就是说,既要支持16位的处

理器,也要支持32位的处理器。在8086中,所有的寄存器都是16位的,下面我们来看一

IA32中寄存器有何变化:

· 把16位的通用寄存器、标志寄存器以及指令指针寄存器扩充为32位的寄存器

· 段寄存器仍然为16位。

· 增加432位的控制寄存器

· 增加4个系统地址寄存器

· 增加8个调式寄存器

· 增加2个测试寄存器

一、通用寄存器

8个通用寄存器是8086寄存器的超集,它们的名称和用途分别为:

EAX 一般用作累加器

EBX 一般用作基址寄存器(Base

ECX 一般用来计数(Count

EDX 一般用来存放数据(Data

EBP 一般用作堆栈指针(Stack Pointer

EBP 一般用作基址指针(Base Pointer

ESI 一般用作源变址(Source Index

EDI 一般用作目标变址(Destinatin Index

8个通用寄存器中通常保存32位数据,但为了进行16位的操作并与16为机保持兼容,

它们的低位部分被当成816位的寄存器,即AXBXDI。为了支持8位的操作,还进一

步把EAXEBXECXEDX这四个寄存器低位部分的16位,再分为8位一组的高位字节和低

位字节两部分,作为88位寄存器。这8个寄存器分别被命名为AHBHCHDH

ALBLCLDL。对8位或16位寄存器的操作只影响相应的寄存器。例如,在做8位加法运

算时,位7的进位并不传给目的寄存器的位9,而是把标志寄存器中的进位标志(CF)置

位。因此,这8个通用寄存器既可以支持1位、8位、16位和32位数据运算,也支持16位和

32位存储器寻址。

二、段寄存器

8086中有416位的段寄存器:CSDSSSES,分别用于存放可执行代码的代码段、

数据段、堆栈段和其他段的基地址。在IA32中,有616位的段寄存器,但是,这些段寄

存器中存放的不再是某个段的基地址,而是某个段的选择符(Selector)。因为16位的寄

存器无法存放32位的段基地址,段基地址只好存放在一个叫做描述符表(Descriptor

的表中。因此,在IA32中,我们把段寄存器叫做选择符。下面给出6个段寄存器的名称和

用途:

CS 代码段寄存器

DS 数据段寄存器

SS 堆栈段寄存器

ESFSGS 附加数据段寄存器

有关段选择符、描述符表及系统表地址寄存器将在段机制一节进行详细描述。

三、状态和控制寄存器

状态和控制寄存器是由标志寄存器EFLAGS、指令指针EIP4个控制寄存器组成,

如图2.1所示:

2.1状态和控制寄存器

1.指令指针寄存器和标志寄存器

指令指针寄存器EIP中存放下一条将要执行指令的偏移量(offset ),这个偏移量

是相对于目前正在运行的代码段寄存器CS而言的。偏移量加上当前代码段的基地址,就

形成了下一条指令的地址。EIP中的低16位可以分开来进行访问,给它起名叫指令指针IP

寄存器,用于16位寻址。

标志寄存器EFLAGS存放有关处理器的控制标志,如图2.2所示。标志寄存器中的第13515位及1831位都没有定义。

2.2 i386标志寄存器EFLAGS

程序 (在Linux内核中叫做debug())进行检验。当

将第8位清0后,且将断点地址装入调试寄存器DR0DR3时,才会产生异常1的自陷。

1213IOPL是输入输出特权级位,这是保护模式下要使用的两个标志位。由于输

入输出特权级标志共两位,它的取值范围只可能是01234个值,恰好与输入输出

特权级03级相对应。但Linux内核只使用了两个级别,即03级,0表示内核级,3

表示用户级。在当前任务的特权级CPLCurrent Privilege Level)高于或等于输入输出

特权级时,就可以执行像INOUTINSOUTSSTICLILOCK等指令而不会产生异常13

(即保护异常)。在当前任务特权级CPL0时,POPF(从栈中弹出至标志位)指令和中

断返回指令IRET可以改变IOPL字段的值。

9 IFInterrupt Flag)是中断标志位,是用来表示允许或者禁止外部中断

(参看第四章)。若第9IF被置为1,则允许CPU接收外部中断请求信号;若将IF位清

0,则表示禁止外部中断。在保护模式下,只有当第1213位指出当前CPL为最高特权级时,

才允许将新值置入标志寄存器EFLAGS以改变IF位的值。

10DFDirection Flag)是定向标志。DF位规定了在执行串操作的过程中,对

源变址寄存器ESI或目标变址寄存器EDI是增值还是减值。如果DF1,则寄存器减值;

DF0,则寄存器值增加。

14NT是嵌套任务标志位。在保护模式下常使用这个标志。当IA32在发生中断和

执行CALL指令时就有可能引起任务切换。若是由于中断或由于执行CALL指令而出现了任

务切换,则将NT置为1。若没有任务切换,则将NT位清0

17VM Virtual 8086 Mode Flag)是虚拟8086方式标志,是IA32新设置的一

个标志位。表示IA32CPU是在虚拟8086环境中运行。如果IA32CPU是在保护模式下运行,

VM为又被置成1,这时IA32 就转换成虚拟8086 操作方式,使全部段操作就像是在

8086CPU上运行一样。VM位只能由两种方式中的一种方式给予设置,即或者是在保护模式

下,由最高特权级(0)级代码段的中断返回指令IRET设置,或者是由任务转换进行设

置。Linux内核实现了虚拟8086方式,但在本书中我们不准备对此进行详细讨论。

从上面的介绍可以看出,要正确理解标志寄存器EFLAGS的各个标志需要很多相关的

知识,有些内容在本章的后续部分还会涉及到。在后面的章节中,你会体会如何灵活应用

这些标志。

2.控制寄存器

状态和控制寄存器组除了EFLAGSEIP ,还有四个32位的控制寄存器,它们是

CR0CR1CR2CR3。现在我们详细看看它们的结构,如图 23所示。__

这几个寄存器中保存全局性和任务无关的机器状态。

CR0中包含了6个预定义标志,0位是保护允许位PE(Protedted Enable),用于启动保

护模式,如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。1位是监控协处

理位MP(Moniter coprocessor),它与第3位一起决定:当TS=1时操作码WAIT是否产生一个

“协处理器不能使用”的出错信号。第3位是任务转换位(Task Switch),当一个任务转换

完成之后,自动将它置1。随着TS=1,就不能使用协处理器。CR0的第2位是模拟协处理器位

EM (Emulate coprocessor),如果EM=1,则不能使用协处理器,如果EM=0,则允许使用协

处理器。第4位是微处理器的扩展类型位ET(Processor Extension Type),其内保存着处理

器扩展类型的信息,如果ET=0,则标识系统使用的是287协处理器,如果 ET=1,则表示

系统使用的是387浮点协处理器。CR0的第31位是分页允许位(Paging Enable),它表示芯片

上的分页部件是否允许工作,下一节就会讲到。由PG位和PE位定义的操作方式如图2.4

示。

24 PG位和PE位定义的操作方式

CR1是未定义的控制寄存器,供将来的处理器使用。

CR2是页故障线性地址寄存器,保存最后一次出现页故障的全32位线性地址。

CR3是页目录基址寄存器,保存页目录表的物理地址,页目录表总是放在以4K字节

为单位的存储器边界上,因此,它的地址的低12位总为0,不起作用,即使写上内容,也

不会被理会。

这几个寄存器是与分页机制密切相关的,因此,在进程管理及虚拟内存管理中会涉

及到这几个寄存器,读者要记住CR0CR2CR3这三个寄存器的内容。

四、系统地址寄存器

IA324个系统地址寄存器,如图2.5所示,它保存操作系统要保护的信息和地址转换

表信息:

2.5 IA32系统地址寄存器

选择符

选择符

4个专用寄存器用于引用在保护模式下所需要的表和段,它们的名称和作用如下:

· 全局描述符表寄存器GDTRGlobal Descriptor Table Register ),是48位寄存

器,用来保存全局描述符表(GDT)的32位基地址和16GDT的界限。

· 中断描述符表寄存器IDTRInterrupt Descriptor Table Register),是48位寄存

器,用来保存中断描述符表(IDT)的32位基地址和16IDT的界限。

· 局部描述符表寄存器LDTRGlobal Descriptor Table Register ),是16位寄存器,

保存局部描述符表LDT段的选择符。

· 任务状态寄存器TRTask State Register)是16位寄存器,用于保存任务状态段

TSS段的16位选择符。

用以上4个寄存器给目前正在执行的任务(或进程)定义任务环境、地址空间和中断

向量空间。有关全局描述符表GST、中断描述符表IDT、局部描述符表LDT及任务状态段TSS

的具体内容将在稍后进行详细描述。

五、 调试寄存器和测试寄存器

1.调试寄存器

IA32为调试提供了硬件支撑。在IA32芯片内有832位的调试寄存器DR0~DR7,如

2.6所示。

这些寄存器可以使系统程序设计人员定义4个断点,用它们可以规定指令执行和数

据读写的任何组合。DR0~DR3是线性断点地址寄存器,其中保存着4个断点地址。DR5DR6

是两个备用的调试寄存器,目前尚未定义。DR6是断点状态寄存器,其低序位是指示符位,

当允许故障调试并检查出故障而进入异常调试处理程序(debug())时,由硬件把指示符

位置1,调试异常处理程序在退出之前必须把这几位清0DR7是断点控制寄存器,它的高

序半个字又被分为4个字段,用来规定断点字段的长度是1个字节、2个字节、4个字节及

规定将引起断点的访问类型。低序半个字的位字段用于“允许”断点和“允许”所选择的

调试条件。

2. 测试寄存器

IA32 有两个32 位的测试寄存器TR6 TR7。这两个寄存器用于在转换旁视缓冲器

Translation Lookaside Buffer ) 中测试随机存储器( RAM ) 和相联存储器

CAM)。TR6是测试命令寄存器,其内存放测试控制命令。TR7是数据寄存器,其内保存

转换旁路缓冲器测试的数据。

 

阅读(1101) | 评论(0) | 转发(0) |
0

上一篇:X86与linux(一)

下一篇:X86与linux(三)

给主人留下些什么吧!~~