PMIO 全称为 port-mapped I/O,它使用专门为执行 I/O *** 作而设计的一类特殊 CPU 指令,如 x86 和 x86-64 架构中的 in 和 out 指令。I/O 设备有一个独立于通用内存的地址空间,可以通过 CPU 物理接口上的额外 I/O 引脚来实现。因为 I/O 的地址空间与主存的地址空间是隔离的,所以这有时被称为隔离 I/O。
优点:
- I/O 端口地址不占用存储器空间;使用专门的 I/O指令对端口进行 *** 作,I/O指令短,执行速度快。
- 由于使用专门的 I/O 指令访问端口,并且 I/O 端口地址和存储器地址是分开的,I/O 端口地址和存储器地址可以重叠,而不会相互混淆。
缺点:
- cpu 需要设计单独的指令,实现相对复杂
- 只能使用 EAX、AX 和 AL 寄存器来控制数据的读写,访问 I/O 设备需要很多条指令完成
- 需要使用专用指令 *** 作 I/O 空间,不能使用通用的内存访问指令 *** 作,编码成本高
早期 cpu 位数与存储器空间较小,PMIO 不占用存储器空间的优势较大,随着处理器位数与存储器空间的扩展,PMIO 架构的这种优势逐渐丧失,MMIO 架构逐渐占据主流。
MMIO 是什么?MMIO 全称为 Memory-mapped I/O,内存映射 I/O 对内存与 I/O 设备使用相同的地址空间寻址。I/O 设备的内存和寄存器被映射到统一的地址空间中。
在这种架构下,内存地址可以指代物理 RAM 的一部分,也可以指代I/O 设备的内存和寄存器。用于访问内存的 cpu 指令也可能用于访问外设 I/O 的内存和寄存器空间。
MMIO 的优点- MMIO 作为一种不同的 CPU 到设备通信方法,不会影响设备 DMA 过程
- MMIO 丢弃了端口 I/O 带来的复杂性,cpu 需要更少的内部逻辑
- MMIO 架构下,常规内存指令可用于访问 I/O 外设,CPU 的所有寻址模式都可用于 I/O 及内存。
linux 内核中使用 ioremap 来映射 I/O 物理内存,示例如下:
gpio_base_addr = ioremap(GPIO_BASE_ADDR, 0x7000);
ioremap 映射完成后,读写 I/O 寄存器与普通的内存读写 *** 作一致,不需要使用专用代码,示例如下:
unsigned int *base_addr;
base_addr = (unsigned int *)(gpio_base_addr + offset);
*base_addr &= ~(0x8 << 7);
MMIO 的方式下不访问 I/O 寄存器不需要使用任何特殊指令,访问 I/O 寄存器与访问普通内存空间一致。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)