8086锁销和ASM LOCK前缀是如何工作的
8086 lock pin and ASM LOCK prefix how it works
我是一名程序员,学习汇编语言是为了直观地理解我的代码 运行 在 CPU 上的表现。
当我在研究ASM关键字LOCK时,google告诉我CPU将在执行时独占数据总线以下带有 LOCK 前缀的指令。
但在没有任何额外信息的情况下,CPU 如何 获得独家所有权。
我还发现 8086 微芯片有一个锁销,其作用与关键字 LOCK 完全相同。这可能是实现 LOCK 关键字的逻辑电路。
任何人都可以解释 锁销 的机制。当锁定引脚处于活动状态时,其他 CPU 在尝试获取数据总线的使用时将如何被拒绝。
如果只有 CPU 锁定了内存总线,那么在此期间没有其他设备可以读取或更改内存内容,即使是通过 DMA。 (或者在没有缓存的共享总线上有多个 CPUs,同样的处理。)因此,例如 lock add [di], ax
的加载和存储之间根本不会发生其他内存操作,使得它原子wrt。任何可能的观察者。 (除了连接到总线的逻辑分析仪,这不算在内。)
Semi-related: 描述了 lock
前缀如何在现代 CPUs 上用于可缓存内存,提供 RMW 原子性 而没有 一个总线锁,在这段时间内只挂在高速缓存行上。
我们称之为“缓存锁”;所有现代 CPU 都以这种方式为对齐的 locked
操作工作,仅对跨越两个 cache-lines 之间边界的 xchg [mem], ax
进行昂贵的总线锁定。这会损害所有内核的吞吐量,而且成本如此之高,以至于现代 CPU 有办法让它始终出错,但其他未对齐的 loads/stores 以及它的性能计数器却不会。
有趣的事实:xchg [mem], reg
在 386 和更新的 上具有隐式 lock
语义 。 (不幸的是,当你的寄存器 运行 不足时,它会因为性能原因而无法使用,就像普通的 load/store 一样)。它没有出现在 286 或更早版本上,除非你 lock xchg
。这可能与存在 SMP 386 系统(具有原始 sequentially-consistent 内存模型)这一事实有关。现代 x86 内存模型适用于 486 及更高版本的 SMP 系统。
我是一名程序员,学习汇编语言是为了直观地理解我的代码 运行 在 CPU 上的表现。
当我在研究ASM关键字LOCK时,google告诉我CPU将在执行时独占数据总线以下带有 LOCK 前缀的指令。
但在没有任何额外信息的情况下,CPU 如何 获得独家所有权。
我还发现 8086 微芯片有一个锁销,其作用与关键字 LOCK 完全相同。这可能是实现 LOCK 关键字的逻辑电路。
任何人都可以解释 锁销 的机制。当锁定引脚处于活动状态时,其他 CPU 在尝试获取数据总线的使用时将如何被拒绝。
如果只有 CPU 锁定了内存总线,那么在此期间没有其他设备可以读取或更改内存内容,即使是通过 DMA。 (或者在没有缓存的共享总线上有多个 CPUs,同样的处理。)因此,例如 lock add [di], ax
的加载和存储之间根本不会发生其他内存操作,使得它原子wrt。任何可能的观察者。 (除了连接到总线的逻辑分析仪,这不算在内。)
Semi-related:lock
前缀如何在现代 CPUs 上用于可缓存内存,提供 RMW 原子性 而没有 一个总线锁,在这段时间内只挂在高速缓存行上。
我们称之为“缓存锁”;所有现代 CPU 都以这种方式为对齐的 locked
操作工作,仅对跨越两个 cache-lines 之间边界的 xchg [mem], ax
进行昂贵的总线锁定。这会损害所有内核的吞吐量,而且成本如此之高,以至于现代 CPU 有办法让它始终出错,但其他未对齐的 loads/stores 以及它的性能计数器却不会。
有趣的事实:xchg [mem], reg
在 386 和更新的 上具有隐式 lock
语义 。 (不幸的是,当你的寄存器 运行 不足时,它会因为性能原因而无法使用,就像普通的 load/store 一样)。它没有出现在 286 或更早版本上,除非你 lock xchg
。这可能与存在 SMP 386 系统(具有原始 sequentially-consistent 内存模型)这一事实有关。现代 x86 内存模型适用于 486 及更高版本的 SMP 系统。