对于每个外设的控制,都是通过读写寄存器来进行的。通常,一个外设会有好几个寄存器,并且这些寄存器的存取地址是连续的。这些存取地址要么处于内存地址空间,要么属于IO地址空间。
从纯硬件的角度来看,内存区域和IO区域没有概念上的区别。它们都是通过在地址总线和控制总线上发出电信号(即, 读写信号)来访问,并且都是从数据总线读取或者往数据总线写入。
一些 CPU 制造商在他们的芯片上只实现了一个单独的地址空间,然而有人认为外设不同于内存, 因此应该有一个分开的地址空间. 一些处理器(最有名的是x86 家族)有分开的读和写电线给 I/O 端口和通过特殊的CPU 指令来存取端口.
外设是为了用来适配一个外设总线而存在的, 并且大部分流行的 I/O 总线成型在个人计算机上。即便那些没有单独地址空间给 I/O 端口的处理器, 也必须在存取或访问一些外设时伪装读写端口。这种伪读写常常是通过外部的芯片组或者 CPU 核的额外电路来实现的. 这种方法在用在嵌入式应用的小处理器中比较常见.
出于同样的理由, Linux 在所有它运行的计算机平台上实现了 I/O 端口的概念, 甚至在那些 CPU 只实现一个单独地址空间的平台上. 端口存取的实现有时依赖特殊的主机制造和型号( 因为不同的型号使用不同的芯片组来映射总线传送到内存地址空间).
即便外设总线有一个分开的地址空间给I/O 端口, 也并不是所有的设备都需要映射它们的寄存器到 I/O 端口. 对于 ISA 外设板来说,使用 I/O 端口是普遍的, 然而大部分 PCI 设备来说会把寄存器映射到一个内存地址区域. 这种 I/O 内存方法通常是首选的, 因为它不需要使用特殊目的处理器指令; CPU 核访问内存更加有效, 并且编译器在访问内存时有更多自由在寄存器分配和寻址模式的选择上.