尽管硬件寄存器和内存之间有很强的相似性, 程序员在存取 I/O 寄存器的时候还是要格外小心,避免被CPU(或者编译器)优化所迷惑, 因为它可能修改你期待的 I/O 行为.
I/O 寄存器和 RAM 一个主要的不同是:I/O 操作会带来副作用, 而内存操作没有。一个内存写操作的唯一效果是存储一个值到某个地址, 并且一个内存读操作返回上次写到该地址的值. 由于内存存取速度对CPU 性能是至关重要的, 这种无副作用的操作已被多种方式优化: 值被缓存, 并且读/写指令被重新编排.
编译器能够缓存数据值到CPU 寄存器而不写到内存, 并且即使数据值已经存储到内存, 读和写操作都能够在缓冲内存中进行而不是直接接触物理RAM. 此外,指令重编排可能在编译器级别或在硬件级别发生: 很多情况下,如果一个指令以不同于在程序文本中出现的顺序来执行(例如, 为避免在 RISC 流水线中的互锁),它能够执行得更快,
对于传统内存(至少在单处理器系统)来说,这些优化是透明和有益的。驱动直接存取I/O寄存器的主要目的是能提高CPU性能。然而,这些优化对正确的 I/O 操作可能是致命的. 处理器无法预见这种情形, 一些其他的操作(在一个独立处理器上运行, 或者发生在一个 I/O 控制器的事情)依赖内存存取的顺序. 编译器或者 CPU 可能只尽力胜过你并且重编排你请求的操作; 结果可能是奇怪的错误而非常难于调试. 因此, 一个驱动必须确保没有进行缓冲并且在存取寄存器时没有发生读或写的重编排.