答案1
处理器寄存器- 一般来说,CPU 执行的任何操作都必须位于其某个寄存器中。
例如,看看这。这是 Intel x86 指令的各种形式ADD
。您会注意到,您可以将两个寄存器加在一起,或者将一个寄存器与内存位置的内容加在一起(“累加器”只是另一个寄存器,“立即”只是表示数据直接位于内存位置,或者在实际 ADD 操作码之后“立即”位于内存位置)。没有ADD mem,mem
。
RISC CPU(例如 ARM)的灵活性更低。必须始终将内存中的数据作为单独的操作复制到寄存器,然后 CPU 才能对其进行诸如ADD
、SUB
等操作。它们有更多的寄存器来弥补这一点。
输入/输出寄存器- 一般来说,与 I/O 芯片组或设备执行的任何操作有关的某些内容都必须位于其某个寄存器中。
例如,看看这。这是关于标准 VGA“CRTC 寄存器”的详细信息。特别令人感兴趣的是“起始地址高”和“起始地址低”寄存器。这些寄存器中的值告诉 VGA 从哪里开始读取内存以呈现显示。
有很多方法可以让 CPU 访问 I/O 寄存器。通常它不像上面的处理器寄存器。各种方法包括:
- 一种方法是创建 I/O 设备,使其在硬件层面上的响应方式与 RAM 相同,但仅限于某些地址。对这些地址的读取/写入不会转到 RAM,而是转到 I/O 设备。然后,I/O 设备可能会使其寄存器在某些地址可访问。然后,CPU 使用与 RAM 相同的方式读取或写入寄存器。在 8 位和 ARM 架构上非常常见。
- x86 确实有针对 I/O 的特殊
IN
指令OUT
。这些指令指定地址,但不是 RAM 可以连接到的地址。I/O 设备可以连接到这些地址(通常称为“端口”,不要与 TCP 端口混淆),并以这种方式访问其寄存器。
继续上面的 VGA CRTC 寄存器示例,通过我上面解释的“I/O 端口”,你现在已经掌握了理解的知识这并了解通过发出特定OUT
指令,CPU 会修改 VGA 的 I/O 寄存器中的值,该值由 VGA 芯片组保留和使用。
并非所有 I/O 设备都有寄存器。有些设备非常简单,只需要某种信号即可完成工作,而且“读取”设备只会报告当前状态。 旧 PC“游戏端口”就是一个例子。实际上并没有进行数据存储,因此从技术上讲,将其称为寄存器可能不正确。不过,大多数技术文档不会做出这种区分。
答案2
您可以将 I/O 寄存器的概念与通用的硬件寄存器,因为登记是一个任意术语,用于指代数字存储区域。寄存器可以充当累加器,保存执行信息,在设备之间提供输入输出缓冲区等。这也意味着处理器寄存器只是一种硬件寄存器。
因此,I/O 寄存器也是寄存器的抽象 - 它保存在组件之间移动的中间数据。处理器不要有特定 I/O 寄存器而是各种可以完成相同任务的通用寄存器(例如,当系统使用内存映射输入/输出这些用于在系统的 CPU 和内存之间提供通用接口总线,但在 MMIO 的情况下,允许通过实际地址总线访问外部设备的内存。
程序员实际上该怎么做呢?他们需要确定外部设备如何映射到系统的地址总线上,然后使用各种方法之一x86 寄存器存储地址(在索引/指针寄存器中)。然后可以使用该寄存器(与机器指令)将数据传输到处理器中的另一个寄存器或从处理器中的某个寄存器传输到设备上的某个寄存器。
如果 CPU 不支持 MMIO(或者程序员决定不使用它),那么在 x86 的情况下也可能存在I/O 特殊指令来自端口(本质上是另一条总线)。这些指令(IN
和OUT
)的工作原理类似于MOV
操作说明- 它们甚至使用相同的处理器寄存器。唯一的区别是索引/指针寄存器中的地址的含义(因为这些寄存器使用不同的 I/O 地址映射)。
这就是为什么我说 I/O 寄存器是任何其他 CPU 寄存器的抽象 - 它们是同一个东西。无论是否用于中间结果、与 RAM 之间的数据传输或访问外部硬件,数据仍会从处理器移入和移出到相同的寄存器。
根据主板布局,CPU 可以通过实际地址总线本身或连接到 CPU 端口的另一条总线访问外部设备的内存。然而,所有这些通常由主板的北桥用于内存访问,以及南桥用于外围设备访问(例如视频卡,鼠标/键盘)。
最后,如果你熟悉直接接入外部外围设备本身可以从计算机的 RAM 中指定专门用于 I/O 目的的寄存器。请注意,DMA 基本上可以绕过任何 CPU 干预,因此处理器寄存器的概念在这里不适用。
最后说一句:计算机中的每个设备都有某种寄存器,因为没有设备连接直接地到 CPU - 如果是,那么你将浪费 CPU 时钟周期,将数据保存在总线上,直到设备有足够的时间使用它(CPU 通常在任何系统中都有最快的时钟)。这只是设备需要一个地方来存储数据才能使用它的原因之一 - 而这基本上就是寄存器的全部。
答案3
从概念上来说,I/O 寄存器和处理器寄存器是同一个东西。它们都是用于处理操作的数据保存存储单元。
区别在于位置。I/O 寄存器和 CPU 寄存器都属于同一个家族:硬件寄存器。CPU 寄存器位于 CPU 中,I/O 寄存器位于 CPU 外部,位于 I/O 设备自己的数字处理器上。
详细信息: 硬件寄存器,总体解释硬件寄存器,并提及它们的不同种类。
答案4
在正常使用中,“I/O 寄存器”是微处理器的一部分,并且物理连接到微处理器的 I/O 引脚。
微处理器 CPU 只能通过 I/O 引脚与外界通信。微处理器的内部逻辑可以通过多种方式实现这一点:可能有内部总线,可能有内存访问命令,这些命令隐式使用连接到外部地址和数据总线的引脚,可能有显式命令来设置特定引脚的值。一种常见的方法是使用逻辑表示寄存器,寄存器的值控制 I/O 引脚的含义、状态和值。这些“寄存器”(通常是实际的物理寄存器)是 I/O 寄存器。
例如,请参阅 ATtiny261A 的数据表 http://ww1.microchip.com/downloads/en/DeviceDoc/doc8197.pdf
“PortB” 是 8 个 I/O 引脚的逻辑表示。它是寄存器列表中寄存器的名称,在文本中称为 I/O 寄存器。“GPIOR1”是寄存器列表中的另一个寄存器。它是一个“通用”I/O 寄存器,不与物理引脚绑定,用于将数据发送到 I/O 寄存器,如“Port B”