存储器映射输入输出

内存映射输入输出(英语:Memory-mapped I/O, MMI/O,简称为内存映射I/O),以及端口映射输入输出port-mapped I/O, PMI/O,也叫作独立输入输出isolated I/O),是PC机在中央处理器CPU)和外部装置之间执行输入输出操作的两种方法,这两种方法互为补充。除此之外,执行输入输出操作也可以使用专用输入输出处理器(dedicated I/O processors)——这通常是指大型机上的通道输入输出(Channel I/O),这些专用处理器执行自有的指令集

内存映射I/O(不要和内存映射文件的输入输出混淆)使用相同的地址总线来寻址内存和输入输出装置(简称I/O装置),前提是I/O装置上的装置内存和寄存器都已经被映射到内存空间的某个地址。这样当CPU访问某个地址的时候,可能是要访问某一部分物理内存,也可能是要访问I/O装置上的内存。因此,装置内存也可以通过内存访问指令来完成读写。每个I/O装置监测CPU的地址总线,并且在发现CPU访问被分配到本装置的地址区域的时候做出响应,建立数据总线和相应装置寄存器之间的连接。为了实现CPU对MMI/O装置的访问,相应的地址空间必须给这些装置保留, 并且不能再分配给系统物理内存。这可以是永久保留,也可以是暂时性的保留。通常来说X86架构都是永久保留的,而在Commodore 64中,由于采用了I/O装置和普通内存之间的堆交换技术(bank switching),可以做到暂时性保留。

PMI/O通常使用一组专门为I/O设计的CPU指令来执行I/O操作。比如在基于x86和x86-64架构的微处理器中使用in/out指令。这两条指令有一些不同的形式,分别用来在CPU的EAX寄存器(或高16位/低16位/高8位/低8位)和I/O装置的某个端口之间完成对单字节/双字节/四字节数据的操作(比如对out指令,分别有outb, outw和outl) 。I/O装置有一个和内存地址空间相互独立的I/O地址空间。I/O装置通过专用I/O针脚或者专用的总线和CPU相连。因为这个I/O地址空间和内存地址空间相互独立,所以有时候称为独立I/O.

外部链接