内存映射I/O与端口映射I/O的区别

CPU与设备的控制寄存器和数据缓冲区进行通信,控制器中寄存器的两种编址方案

PMIO(Port-mapped I/O端口映射I/O ):
内存映射I/O与端口映射I/O的区别_第1张图片
内存和I/O设备有各自的地址空间。每个控制寄存器被分配一个I/O端口号,这是一个8位或16位的整数。所有I/O端口形成I/O端口空间。端口映射I/O通常使用一种特殊的CPU指令,专门执行I/O操作。在Intel的微处理器中,使用的指令是IN和OUT。这些指令可以读/写1,2,4个字节(例如:outb, outw, outl)从/到IO设备上。I/O设备有一个与内存不同的地址空间,为了实现地址空间的隔离,要么在CPU物理接口上增加一个I/O引脚,要么增加一条专用的I/O总线。由于I/O地址空间与内存地址空间是隔离的,所以有时将PMIO称为被隔离的IO(Isolated I/O)。

MMIO(Memory-mapped I/O 内存映射I/O )
内存映射I/O与端口映射I/O的区别_第2张图片
MMIO是应用得最为广泛的一种IO方法,内存和I/O设备共享同一个地址空间。它使用相同的地址总线来处理内存和I/O设备,I/O设备的内存和寄存器被映射到与之相关联的地址。当CPU访问某个内存地址时,它可能是物理内存,也可以是某个I/O设备的内存。因此,用于访问内存的CPU指令也可来访问I/O设备。每个I/O设备监视CPU的地址总线,一旦CPU访问分配给它的地址,它就做出响应,将数据总线连接到需要访问的设备硬件寄存器。为了容纳I/O设备,CPU必须预留给I/O一个地址区域,该地址区域不能给物理内存使用。在大多数系统中,分配给控制寄存器的地址位于或者靠近地址空间的顶端,如图。

两种方法工作原理
当CPU想要读入一个字的时候,不论是从内存中读入还是从IO端口中读入,它都要将需要的地址放到总线的地址线上,然后在总线的一条控制线上置起一个READ信号。还要用到第二条信号线来表明需要的是IO空间还是内存空间。如果是内存空间,内存将响应请求。如果是IO空间,IO设备将响应请求。如果只有内存空间(MMIO),则每个内存模块和每个IO设备都会将地址线和它所服务的地址范围进行比较,如果地址落在这一范围之内,它就会响应请求。因为绝对不会有地址既分配给内存又分配给IO设备,所以不会存在歧义和冲突。

注意: 内存映射I/O作为一种CPU对I/O设备(CPU-to-device)的通信方法,并不影响DMA(直接内存访问), 因为DMA是一种绕过CPU的内存对设备(memory-to-device)的通信方法。

你可能感兴趣的:(操作系统,操作系统)