统一编址
统一编址是将主存地址空间分出一部分用于对I/O端口(外设)进行编址。统一编址将I/O端口映射至主存空间的某些地址上,又称为存储映射I/O(或I/O内存)方式。
优点
- 无需专门的I/O指令,用访问主存的指令即可访问I/O端口。
- 访问I/O端口和访问主存的指令相同,所以它的保护机制可由分段或分页存储管理来实现,而无需另外专门的保护机制。
- 给编程提供了非常大的灵活性。任何访问内存的指令都可被用来访问位于主存空间中的I/O端口,并且所有与主存相关的寻址方式都适用于I/O端口。例如,可用MOV指令实现寄存器和I/O端口的数据传送,可用AND、OR或TEST等指令直接操作I/O接口中的控制寄存器或状态寄存器。
- 由于外设和I/O寄存器的数目几乎不受限制,这种编制方式还便于扩大系统吞吐量,这在大型控制或数据通信系统等特殊场合很有用。
缺点
- I/O端口使用了部分原本用于主存(通常为内存)的地址空间,导致能够使用的主存容量减少。
独立编址
独立编址是将I/O端口单独进行编址,使I/O端口和主存的地址空间相互独立。独立编址也称为“I/O端口”方式,外设寄存器位于“I/O(地址)空间”。
优点
- I/O端口不占用主存的地址空间,不影响主存的容量。
缺点
- CPU访问I/O端口时需使用专用的I/O指令。
操作系统对编址方式的兼容方式
对于某一既定的系统,编址方式是唯一确定的。要么是独立编址、要么是统一编址,具体采用哪一种则取决于CPU的体系结构。 如,PowerPC、m68k等采用统一编址,而X86等则采用独立编址。目前,大多数嵌入式微控制器如ARM、PowerPC等并不提供I/O空间,仅有内存空间,可直接用地址、指针访问。
对于Linux内核而言,可能用于不同的CPU,它必须考虑兼容这两种方式。于是它采用一种新的方法,将独立编址或统一编址的I/O端口通称为“I/O区域”(I/O region)。不论你采用哪种方式,都要先申请IO区域:request_resource(),并在结束时释放它:release_resource()。