状态和控制寄存器

本文深入探讨了处理器中的状态和控制寄存器,包括指令指针寄存器、标志寄存器及其重要标志位,以及控制寄存器CR0、CR1、CR2和CR3的功能和用途。文章详细解释了每个寄存器的作用,并强调了在进程管理和虚拟内存管理中CR0、CR2及CR3的重要性。
部署运行你感兴趣的模型镜像

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

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

指令指针寄存器EIP中存放下一条将要执行指令的偏移量(offset ),这个偏移量是相对于目前正在运行的代码段寄存器CS而言的。偏移量加上当前代码段的基地址,就形成了下一条指令的地址。EIP中的低16位可以分开来进行访问,给它起名叫指令指针IP寄存器,用于16位寻址。

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

386标志寄存器EFLAGS

在这些标志位中,我们只介绍在Linux内核代码中常用且重要的几个标志位:

第8位TF(Trap Flag)是自陷标志,当将其置1时则可以进行单步执行。当指令执行完后,就可能产生异常1的自陷(参看第四章)。也就是说,在程序的执行过程中,每执行完一条指令,都要由异常1处理程序 (在Linux内核中叫做debug())进行检验。当将第8位清0后,且将断点地址装入调试寄存器DR0~DR3时,才会产生异常1的自陷。                                  

第12、13位IOPL是输入输出特权级位,这是保护模式下要使用的两个标志位。由于输入输出特权级标志共两位,它的取值范围只可能是0、1、2和3共4个值,恰好与输入输出特权级0~3级相对应。但Linux内核只使用了两个级别,即0和3级,0表示内核级,3表示用户级。在当前任务的特权级CPL(Current Privilege Level)高于或等于输入输出特权级时,就可以执行像IN、OUT、INS、OUTS、STI、CLI和LOCK等指令而不会产生异常13(即保护异常)。在当前任务特权级CPL为0时,POPF(从栈中弹出至标志位)指令和中断返回指令IRET可以改变IOPL字段的值。

第9位IF(Interrupt Flag)是中断标志位,是用来表示允许或者禁止外部中断(参看第四章)。若第9位IF被置为1,则允许CPU接收外部中断请求信号;若将IF位清0,则表示禁止外部中断。在保护模式下,只有当第12、13位指出当前CPL为最高特权级时,才允许将新值置入标志寄存器EFLAGS以改变IF位的值。

第10位DF(Direction Flag)是定向标志。DF位规定了在执行串操作的过程中,对源变址寄存器ESI或目标变址寄存器EDI是增值还是减值。如果DF为1,则寄存器减值;若DF为0,则寄存器值增加。

第14位NT是嵌套任务标志位。在保护模式下常使用这个标志。当80386在发生中断和执行CALL指令时就有可能引起任务切换。若是由于中断或由于执行CALL指令而出现了任务切换,则将NT置为1。若没有任务切换,则将NT位清0。

第17位VM (Virtual 8086 Mode Flag)是虚拟8086方式标志,是80386新设置的一个标志位。表示80386CPU是在虚拟8086环境中运行。如果80386CPU是在保护模式下运行,而VM为又被置成1,这时80386就转换成虚拟8086操作方式,使全部段操作就像是在8086CPU上运行一样。VM位只能由两种方式中的一种方式给予设置,即或者是在保护模式下,由最高特权级(0)级代码段的中断返回指令IRET设置,或者是由任务转换进行设置。Linux内核实现了虚拟8086方式,但在本书中我们不准备对此进行详细讨论。

   从上面的介绍可以看出,要正确理解标志寄存器EFLAGS的各个标志需要很多相关的知识,有些内容在本章的后续部分还会涉及到。在后面的章节中,你会体会如何灵活应用这些标志。

2.控制寄存器

 状态和控制寄存器组除了EFLAGSEIP ,还有四个32位的控制寄存器,它们是CR0CR1CR2CR3。现在我们详细看看它们的结构,如下图所示:i386中的控制寄存器组

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

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位定义的操作方式如下图所示:

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

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

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

CR3是页目录基址寄存器,保存页目录表的物理地址,页目录表总是放在以4K字节为单位的存储器边界上,因此,它的地址的低12位总为0,不起作用,即使写上内容,也不会被理会。

     这几个寄存器是与分页机制密切相关的,因此,在进程管理及虚拟内存管理中会涉及到这几个寄存器,读者要记住CR0、CR2及CR3这三个寄存器的内容。

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think> 我们正在讨论的是计算机体系结构中的寄存器概念。根据用户的问题,我们需要区分控制寄存器数据寄存器。参考引用内容,可以总结如下: 引用[2]提到: - 数据寄存器:保存处理器与外设之间交换的数据,包括数据输入寄存器(保存从输入设备获取的数据)数据输出寄存器(保存处理器发往输出设备的数据)。 - 控制寄存器:保存处理器控制接口电路外设操作的有关信息。 另外,引用[1]引用[3]都提到了通用寄存器(如AX、BX、CX、DX)的功能,它们主要用于数据操作,属于数据寄存器的一种。 因此,我们可以将控制寄存器数据寄存器的区别总结如下: 1. **功能**: - 数据寄存器:用于暂存数据,包括输入数据输出数据,直接参与数据的传输运算。 - 控制寄存器:用于存储控制信息,控制接口电路或外设的工作方式,如选择工作模式、使能中断等。 2. **操作方式**: - 数据寄存器:通常可读可写,用于数据的输入输出。 - 控制寄存器:通常可写(用于配置)也可读(用于状态反馈),但写入的是控制命令,而不是普通数据。 3. **在I/O接口中的位置**: - 数据寄存器:位于接口的数据缓冲部分。 - 控制寄存器:位于接口的控制部分。 4. **编程视角**: - 数据寄存器:在程序中,我们通过读写数据寄存器来交换数据。 - 控制寄存器:通过写入特定的控制字(命令字)来配置接口或外设的工作方式。 举例说明: - 在串口通信中,我们通过数据寄存器发送接收数据。 - 而通过控制寄存器设置波特率、数据位、停止位等。 因此,区别的核心在于:数据寄存器用于数据本身,而控制寄存器用于控制行为。 </think>### 控制寄存器与数据寄存器的区别 在计算机体系结构I/O接口设计中,控制寄存器数据寄存器是两类功能不同的专用寄存器,主要区别如下: #### 1. **功能定位** - **数据寄存器** 用于**暂存传输的数据**,是处理器与外设之间数据交换的桥梁: - 数据输入寄存器:保存从外设读取的数据(如传感器数值)$[^2]$ - 数据输出寄存器:暂存处理器发往外设的数据(如显示内容)$[^2]$ - 示例:通用寄存器AX在I/O指令中传输数据$[^1][^3]$ - **控制寄存器** 用于**配置硬件工作状态**,控制外设行为: - 存储控制命令字(如使能中断、选择工作模式) - 设置传输参数(如串口波特率、ADC采样频率)$[^2]$ - 示例:设置DMA传输方向或GPIO中断触发方式 #### 2. **操作特性** | **特性** | **数据寄存器** | **控制寄存器** | |----------------|--------------------------------|--------------------------------| | 读写方向 | 双向读写(输入/输出) | 主要单向写入(配置),部分可读状态 | | 数据性质 | 实际传输的原始数据 | 控制命令编码(二进制位模式) | | 访问频率 | 高频访问(每次数据传输都需操作) | 低频访问(初始化或模式变更时操作) | | 位宽意义 | 直接对应数据值(如8位温度值) | 每位独立控制功能(如bit0=1使能中断)| #### 3. **在I/O接口中的角色** ```plaintext +---------------+ 处理器 <--------> | I/O接口控制器 | <--------> 外设 +---------------+ | | | 数据寄存器 ◄---- 传输实际数据 | 控制寄存器 ◄---- 配置工作模式 | 状态寄存器 ◄---- 反馈设备状态 +---------------+ ``` - **数据寄存器**实现**速度匹配**:缓冲快速处理器与慢速外设的数据$[^2]$ - **控制寄存器**实现**信号变换**:将控制命令转换为外设可识别的电信号$[^2]$ #### 4. **编程差异** - **数据寄存器操作** ```asm MOV AX, [DATA_PORT] ; 从数据寄存器读取输入 MOV [DATA_PORT], BX ; 向数据寄存器写入输出 ``` - **控制寄存器操作** ```asm MOV AL, 00001111b ; 设置控制字(如使能4个中断) MOV [CTRL_PORT], AL ; 写入控制寄存器 ``` #### 5. **典型应用场景** - **数据寄存器** - 读取ADC转换结果 - 发送数据到UART串口 - 存储键盘扫描码 - **控制寄存器** - 配置定时器工作模式(周期/单次) - 设置PWM占空比 - 使能SPI时钟相位 > ⚠️ 注意:某些寄存器可能兼具两种功能(如GPIO方向寄存器),但通常通过独立地址严格区分数据与控制路径$[^2]$。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值