【x86】不同架构的编址方法
I/O的概念
本人是从单片机嵌入式入行BIOS,以前接触的I/O概念是在GPIO中是一个简单的引脚的概念。
GPIO = General Purpose Input / Output
- 是一种简单、灵活的引脚接口,用于和外部电路通信。
- 每个 GPIO 引脚可以单独配置为输入或输出。
📌 特点: - 主要面向低速控制、信号采集、灯、按钮等。
- 控制的是芯片封装上的某一个具体引脚的电平高低。
- 通常直接连到硬件引脚、没有复杂的协议。
在CPU中,I/O当然也是表示输入/输出。但是这里的 I/O = Input / Output 设备接口。是指 CPU 和外设(比如显卡、键盘、网卡、串口卡等)之间的读写接口。
通常对应总线上的地址空间的一部分,比如:
- I/O 地址空间(比如 x86 的 0x0000~0xFFFF I/O 端口)
- 或者是内存映射 I/O(MMIO,把外设寄存器映射到主存空间)
📌 特点: - 主要面向 外设控制器。
- 编程时访问的是总线上的 I/O 端口或者 MMIO 地址。
- 比如在 x86 里用
in,out指令操作 I/O 端口。
针对这IO端口和IO内存两个概念,下面进行详细介绍。
IO 端口和IO 内存
CPU是通过IO接口/端口和外设交换数据的。8086CPU和外部设备之间是通过I/O接口进行联系的,从而达到相互间传输信息的目的。
每个I/O芯片上都有一个端口或几个端口,一个端口往往对应于芯片上的一个寄存器或一组寄存器。微机系统要为每个端口分配一个地址,这个地址成为端口号。各个端口号和存储器单元地址一样,具有唯一性。
外设都是通过读写设备上的寄存器来进行的,外设寄存器也称为“I/O端口”,而I/O端口有两种编址方式:独立编址和统一编址。
也就是说,CPU要控制所链接的设备,需要通过IO操作设备上的寄存器来实现对设备的控制。
一般厂商按照IO空间性质将IO划分为IO端口和IO内存。两者划分按照空间是否与CPU空间独立划分:

IO内存,也被称为MMIO(Memory Mapped I/O),将IO空间映射到了内存空间,访问这篇IO空间就和访问内存一样没什么不同。两者都是通过CPU的地址总线和控制总线发送电平信号进行访问,再通过数据总线读写数据。要想操纵该IO就得首先将该IO映射到CPU的地址中,然后就可以访问该IO,如同访问内存。大多数嵌入式设备都属于此。
IO端口,也被称为PMIO(Port Mapped I/O,有的地方也叫PIO),该IO的空间和CPU空间相互独立。两者互相独立,相互不干扰,这种类型IO在X86中比较常见,该IO端口有独立的空间,所以CPU要想访问该端口就得通过一些专有函数或者指令。
独立编址
x86 架构
独立编址指的是CPU访问内存和IO端口是分开独立编址。IO端口地址不占用存储空间的地址范围。
这样,系统中就有了两类地址--IO地址和存储地址。CPU如果访问IO端口,则需要使用专用的输入输出操作的指令[IN] [OUT] 指令和控制逻辑。
当地址总线上有一个地址过来,外设备是不知道给IO端口还是给寄存器的,于是处理器通过MEMR/MEMW和IOR/IOW两组控制信号来实现对I/O端口和存储器的不同寻址。
独立编址也称为“I/O端口”方式,外设寄存器位于“I/O(地址)空间”。
对于x86架构来说,通过IN/OUT指令。PC架构一共有65536个8bit的I/O端口,组成64K个I/O端口,编号从0~0xFFF,有16位,80x86用低16位地址线A0~A15来寻址。连续两个8bit的端口可以组成一个16bit的端口,连续4个组成一个32bit的端口。I/O地址空间和CPU的物理地址空间是两个不同的概念,例如I/O地址空间为64K,一个32bit的CPU物理地址空间是4G。
优点:
不占用内存空间;使用I/O指令,程序清晰,很容易看出是I/O操作还是存储器操作;译码电路比较简单(因为I/O端口的地址空间一般比较小,所用地址线也比较少)。
缺点:
只能用专门的I/O指令,访问端口的方法不如访问存储器的方法多。
现代的x86 平台普通使用了名为内存映射(MMIO)的技术,该技术是PCI规范的一部分,IO设备端口被映射到内存空间,映射后,CPU访问I/O端口就如同访问内存一样。看Intel TA 719文档给出的x86/x64系统典型内存地址分配表:
BIOS 1M
本地APIC 4K
芯片组保留 2M
IO APIC 4K
PCI设备 256M
PCI Express设备 256M
PCI设备(可选) 256M
显示帧缓存 16M
TSEG 1M
统一编址
Arm架构
外设结构中的I/O寄存器(即I/O端口)与主存单元一样看待,每个端口占用一个存储单元的地址,将主存的一部分划出来用作I/O地址空间,如,在PDP-11中,把最高的4K主存作为I/O设备寄存器地址。端口占用了存储器的地址空间,使存储容量减小。
此统一编址也称为“I/O内存”方式,外设寄存器位于“内存空间”(很多外设有自己的内存、缓冲区、外设的寄存器和内存统称“I/O空间”)。
优点:
可以利用存储器的寻址方式来寻址I/O端口。
缺点:
I/O端口占用了存储空间,而且进行I/O操作时,因地址编码较长,将导致速度较慢。
举例:
STM32芯片,是32位ARM处理器,它的4GB地址空间被外设、RAM等瓜分。
总结:
x86是有MMIO的,虽然我们在本文中将x86架构划定为独立编址,实际上因为MMIO在Modern x86的应用,已经模糊了这个界限,可以说x86是统一编址+少量的独立IO端口。
一句话: x86 现在本质上是“统一编址为主,兼容独立 I/O 编址”。
实际上,这些都是历史遗留的,为了兼容性而牺牲的历史包袱,IN/OUT这种输入输出的方式完全可以用MMIO来替代。IN/OUT占着指令编码,使用起来需要注意的东西也很多,并且硬件上实现也很奇怪。

浙公网安备 33010602011771号