IO端口 (Input / Output)
除了和外存(磁盘,光盘等)传输数据,IA32处理器还可以和 IO 端口 (I/O ports)传输数据。IO端口是构建在系统硬件上的电子电路,该电路能够对处理器的控制、数据和编址进行译码。IO端口和外围设备进行通信,可能是输入端口、输出端口或者双向端口。有的 IO端口用来传输数据(如:给设备寄存器发送数据),有的是用来控制外围设备(如:控制磁盘控制器的寄存器)。
IO端口编址(IO port addressing)
处理器允许程序(这里的程序是相对CPU的程序,例如 OS 等)通过以下两种方式来访问IO端口:
通过 IO地址空间 来访问 IO端口, 是利用了一组 IO指令 和 特殊的IO保护机制;通过 内存映射IO 来访问 IO端口,是使用了处理器提供的 MOV 和 string 指令 和 段 or 页 提供的保护机制。IO端口可以被映射,所以IO端口起来就像是 IO地址空间 或 物理内存地址空间(memory mapped IO)或两者兼而有之。
- 通过 独立IO地址空间访问 (separate IO addressing space);
- 通过 内存映射 IO 访问 (memory-mapped IO);
使用 IO地址空间 的一个好处就是,写IO端口操作的指令,一定在下一条开始执行之前完成。因此,对IO端口的写操作,会导致硬件在其他指令执行之前就处于一个新的状态。总之,通过 IO地址空间 来写IO端口,会在下一条指令之前,执行完并其执行结果作用到相关硬件上。
IO地址空间(IO Address space)
处理器的 IO地址空间 是和物理内存地址地址空间不同的单独的地址空间。IO地址空间 由 2^16(64K)个单独编址的 80bit IO端口组成,范围是 0~FFFFH。IO地址空间 中 0F8H~0FFH 被保留,而任何访问超出 FFFFH 的地址的操作结果,取决于具体的实现。任意两个连续的 8-bit 端口可以当做一个 16-bit 端口,任意连续的四个 8-bit 端口可以当做一个 32-bit端口。通过这种方式,处理器可以和IO地址空间内的设备传输 8、16、32bit的的数据。跟内存中的 word 操作一样,16-bit端口可以对齐到偶数地址(0、2、4....)所以所有的16-bit端口使用一个单独的总线周期(bus circle)来传输数据。同理,32-bit端口对齐到4的倍数(0、4、8....)。处理器支持和不对齐的端口进行数据传输,但是这会带来严重的效率问题,因为需要