I/O与Memery的区别?

想问的是两个问题:

1、I/O地址和Memery地址的区别?

2、I/O映射和Memery映射的区别?

每种外设都通过读写寄存器进行控制。大部分外设都有几个寄存器,不管是在内存地址空间还是I/O地址空间,这些寄存器的访问地址都是连续的。
在硬件层次上,内存区域和I/O区域没有概念上的区别:他们都是通过向地址总线和数据总线发送电信号来进行访问(即读信号和写信号),再通过数据总线读写数据。
一些CPU制造商在他们的芯片中使用单一地址空间,而另一些则为外设保留了独立的地址空间,以便和内存分开。一些处理器(如X86)还为I/O端口的读写提供了分离的连线,并且使用特殊的CPU指令访问端口。
因为外设要与外围总线相匹配,而最流行的I/O总线是基于PC模型的,所以几十原本没有独立I/O端口地址空间的处理器,在访问外设时也要虚拟成读写I/O端口。这通常是由外部芯片组或CPU核中的附加电路来实现的。后一种方式只是在嵌入式的微处理器中比较多见。
即使外设总线为I/O端口保留了独立的地址空间,也不是所有设备都会把寄存器映射到I/O端口的。ISA设备普遍使用I/O端口,而大多数PCI设备则把寄存器映射到某个内存地址区域。这种I/O内存通常是首选方案,因为不需要特殊的处理器指令;而且CPU核访问内存更有效率,访问内存时,编译器在寄存器分配核寻址方式选择上也有更多的自由。

I/O内存操作时不能使用高速缓存,并且在访问寄存器时不能发生读或写指令的重新排序,而编译器或CPU可能会自作聪明地重新排序所要求的操作。

这种由硬件自身缓存引起的问题,把底层硬件配置成访问I/O区域时禁用硬件缓存就行了。

并不是所有的总线结构都能清楚地区分每种设备所属的I/O区域。有时候,驱动程序需要猜测它的I/O区域在哪儿,甚至需要通过读写“可能的地址范围”来探测设备。ISA总线中就存在这样的问题,并且它仍然使用在插入简单设备的个人计算机中,在工业领域它的PC/104实现也依然非常流行。
尽管一些总线中存在这些特性(或者缺少这些特性),但设备驱动程序仍然必须保证它对I/O区域的独占式访问,以防止来自其他驱动程序的干扰。