x86架构的原子指令对DMA读操作是否同样具备原子性?
问题结论
x86(x64)架构下,CPU执行带lock前缀的原子指令时,对同地址的DMA读操作同样能保证原子效应,你的判断是正确的。
具体原理说明
- x86的
lock前缀原子指令的原子性是面向所有总线访问发起者设计的,并不只局限于CPU核心,DMA控制器属于总线发起者之一,自然被覆盖在原子性保障范围内。 - 早期x86处理器实现
lock前缀依赖总线锁:执行lock前缀指令时会直接拉低总线锁电平,阻塞所有其他总线请求(包括DMA的内存读写请求),直到原子指令执行完成才释放总线锁,这段时间DMA不可能访问到目标内存区域,自然不会读到半更新的数据。 - 现代x86处理器优先使用缓存锁优化:如果原子操作的目标内存对齐到缓存行、且已经加载到CPU缓存中,CPU会通过MESI缓存一致性协议独占该缓存行,不会锁整个总线。目前主流x86平台的PCIe设备DMA默认接入缓存一致性域,DMA读请求会先触发缓存嗅探(snoop):如果目标缓存行被CPU锁定处于修改状态,DMA请求会被阻塞,直到CPU完成原子操作、同步缓存行状态后才会响应DMA请求,保证DMA读到的要么是完整的旧值,要么是完整的新值。
- 就算目标内存被标记为非缓存(UC)、写合并(WC)等不参与缓存一致性的类型,x86处理器也会自动将
lock前缀指令的实现回退到总线锁机制,依然保证对DMA操作的原子性。
内容的提问来源于stack exchange,提问作者IcicleF
相关产品推荐
相关产品推荐

