I/O 寄存器和常规内存
- 硬件寄存器和内存之间的强相似性, 存取 I/O 寄存器的程序员必须小心避免被CPU(或者编译器)优化所戏弄, 它可能修改希望的 I/O 行为.
- I/O 寄存器和 RAM 的主要不同是 I/O 操作有边际效果, 而内存操作没有:一个内存写的唯一效果是存储一个值到一个位置, 并且一个内存读返回最近写到那里的值. 因为内存存取速度对 CPU 性能是至关重要的,这种无边际效果的情况已被多种方式优化: 值被缓存, 并且 读/写指令被重编排.
- 编译器能够缓存数据值到 CPU 寄存器而不写到内存, 并且即便存储它们,读和写操作都能够在缓冲内存中进行而不接触物理 RAM. 重编排也可能在编译器级别和在硬件级别都发生: 如果它以不同于在程序文本中出现的顺序来执行,常常换一种指令序列能够执行得更快。所以重编派后执行序列可能和我们的预期不相同。
- 所以当使用内存的访问方式来操作IO寄存器的时候,可能会造成无法预见的错误。因为他们(编译器或CPU)干扰了那些“边际效果”
- 对编译器优化和硬件重编排的解决方法是在必须以一个特殊顺序对硬件(或者另一个处理器)可见的操作之间安放一个内存屏障
|
|
因为内存屏障影响性能, 它们应当只用在确实需要它们的地方.