我是一个程序员,学习汇编语言,以便直观地理解我的代码是如何在CPU上运行的。
在我学习ASM关键字锁时,google告诉我CPU将在执行以下带有锁前缀的指令时,获得数据总线的独占所有权。
但是在没有任何额外信息的情况下,如何才能独占。
我还发现8086微芯片有一个锁销,它与关键字锁所做的事情完全一样。这可能是实现锁关键字的逻辑电路。
有人能解释一下锁销的机制吗?当锁定引脚处于活动状态时,当试图获取数据总线的使用时,其他CPU将如何被拒绝。
发布于 2022-04-09 10:02:15
如果唯一的CPU已锁定内存总线,则在此期间,没有任何其他设备能够读取或更改内存内容,甚至连DMA都不能。(或者在共享总线上使用多个CPU,没有缓存,同样的处理。)因此,在加载和存储lock add [di], ax之间根本不可能发生其他内存操作--例如,使其成为原子wrt。任何可能的观察者。(除了连接到总线的逻辑分析器之外,它不算在内。)
半相关的:Can num++ be atomic for 'int num'?描述了lock前缀是如何在可缓存内存的现代CPU上工作的,它不需要总线锁就能提供RMW原子性,只需要在整个过程中保持缓存行。
我们将此称为“缓存锁”;所有现代CPU都以这种方式对对齐locked操作工作,只对跨越两个缓存行之间边界的xchg [mem], ax这样的操作执行昂贵的总线锁。这会损害所有内核的吞吐量,而且成本太高,以至于现代CPU有一种方法可以使这个错误始终存在,而不是其他未对齐的负载/存储,以及它的性能计数器。
有趣的事实:xchg [mem], reg在386和更新版本上有隐式lock语义。(这是不幸的,因为由于性能原因,它无法使用,因为在寄存器不足时,它只是普通的加载/存储)。它不是在286或更早,除非你做了lock xchg。这可能与存在SMP 386系统(具有原始的顺序一致的内存模型)有关。现代x86内存模型适用于486和更高版本的SMP系统。
https://stackoverflow.com/questions/71806848
复制相似问题