LOCK前缀

本文介绍了Intel处理器中的LOCK前缀指令,它使处理器在执行特定指令时锁定共享内存,确保指令的原子性。LOCK前缀可用于多种指令,并在多处理器环境中提供关键的同步保障。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LOCK前缀
(翻译自:Intel指令LOCK)

LOCK前缀导致处理器在执行指令时会置上LOCK#信号,于是该指令就被作为一个原子指令(atomic instruction)执行。在多处理器环境下,置上LOCK#信号可以确保任何一个处理器能独占使用任何共享内存。

注意:后来的Intel64和IA32处理器(包括Pentium4,Intel Xeon, P6)有时即使没有置上LOCK#信号也会产生锁动作的。

LOCK前缀只能放在下列指令前面: ADD, ADC, AND, BTC,BTR,BTS,CMPXCHG, CMPXCH8B, DEC,INC, NEG,NOT, OR, SBB, SUB, XOR, XADD以及XCHG。如果LOCK指令用在了非上述指令前则会引发#UD异常(undefined opcode exception,未定义操作数异常);而且LCOK前缀的指令的目标操作数只能是内存寻址方式,否则也会引发#UD异常的.XCHG指令不管前面有无LOCK前缀都会置上LOCK#信号,即XCHG总是作为原子指令执行。

LOCK前缀常常放在BTS前,用来实现对一个共享内存的读-修改-写(read-modify-write)原子化操作。

内存是否地址对齐并不影响LOCK前缀的功能。实际上,内存锁定对任何非对齐内存地址都其作用的。

这个指令的操作在64位和非64位模式下是一致的。

<!--[if gte mso 10]> <mce:style><! /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} > <! [endif] > </p> <p class="MsoNormal" style="text-align: center;" mce_style="text-align: center;"><span style="font-weight: normal;" mce_style="font-weight: normal;" lang="EN-US">LOCK</span><span style="font-weight: normal;" mce_style="font-weight: normal;">前缀</span></p> <p class="MsoNormal" style="text-align: center;" mce_style="text-align: center;"><span style="font-size: x-small;" mce_style="font-size: x-small;"><span style="font-weight: normal;" mce_style="font-weight: normal;">(翻译自:Intel指令LOCK)</span></span></p> <p class="MsoNormal"><span style="font-weight: normal;" mce_style="font-weight: normal;"><br /></span></p> <p class="MsoNormal" style="text-indent: 24pt;" mce_style="text-indent: 24pt;"><span style="font-weight: normal;" mce_style="font-weight: normal;" lang="EN-US">LOCK</span><span style="font-weight: normal;" mce_style="font-weight: normal;">前缀导致处理器在执行指令时会置上<span lang="EN-US">LOCK#</span>信号,于是该指令就被作为一个原子(<span lang="EN-US">atomic instruction</span>)指令执行。在多处理器环境下<span lang="EN-US">,</span>置上<span lang="EN-US">LOCK#</span>信号可以确保任何一个处理器能独占使用任何共享内存。</span></p> <p class="MsoNormal"><span style="font-weight: normal;" mce_style="font-weight: normal;" lang="EN-US">&nbsp;</span></p> <p class="MsoNormal" style="text-indent: 24pt;" mce_style="text-indent: 24pt;"><span style="font-weight: normal;" mce_style="font-weight: normal;">注意<span lang="EN-US">:</span>后来的<span lang="EN-US">Intel64</span>和<span lang="EN-US">IA32</span>处理器<span lang="EN-US">(</span>包括<span lang="EN-US">Pentium4,Intel Xeon, P6)</span>有时即使没有置上<span lang="EN-US">LOCK#</span>信号也会产生锁动作的。</span></p> <p class="MsoNormal"><span style="font-weight: normal;" mce_style="font-weight: normal;" lang="EN-US">&nbsp;</span></p> <p class="MsoNormal" style="text-indent: 24pt;" mce_style="text-indent: 24pt;"><span style="font-weight: normal;" mce_style="font-weight: normal;" lang="EN-US">LOCK</span><span style="font-weight: normal;" mce_style="font-weight: normal;">前缀只能放在下列指令前面<span lang="EN-US">: ADD, ADC, AND, BTC,BTR,BTS,CMPXCHG, CMPXCH8B, DEC,INC, NEG,NOT, OR, SBB, SUB, XOR, XADD</span>以及<span lang="EN-US">XCHG</span>。如果<span lang="EN-US">LOCK</span>指令用在了非上述指令前则会引发<span lang="EN-US">#UD</span>异常<span lang="EN-US">(undefined opcode exception</span>,未定义操作数异常<span lang="EN-US">)</span>;而且<span lang="EN-US">LCOK</span>前缀的指令的目标操作数只能是内存寻址方式,否则也会引发<span lang="EN-US">#UD</span>异常的<span lang="EN-US">.XCHG</span>指令不管前面有无<span lang="EN-US">LOCK</span>前缀都会置上<span lang="EN-US">LOCK#</span>信号,即<span lang="EN-US">XCHG</span>总是作为原子指令执行。</span></p> <p class="MsoNormal"><span style="font-weight: normal;" mce_style="font-weight: normal;" lang="EN-US">&nbsp;</span></p> <p class="MsoNormal" style="text-indent: 24pt;" mce_style="text-indent: 24pt;"><span style="font-weight: normal;" mce_style="font-weight: normal;" lang="EN-US">LOCK</span><span style="font-weight: normal;" mce_style="font-weight: normal;">前缀常常放在<span lang="EN-US">BTS</span>前,用来实现对一个共享内存的读<span lang="EN-US">-</span>修改<span lang="EN-US">-</span>写<span lang="EN-US">(read-modify-write)</span>原子化操作。</span></p> <p class="MsoNormal"><span style="font-weight: normal;" mce_style="font-weight: normal;" lang="EN-US">&nbsp;</span></p> <p class="MsoNormal" style="text-indent: 24pt;" mce_style="text-indent: 24pt;"><span style="font-weight: normal;" mce_style="font-weight: normal;">内存是否地址对齐并不影响<span lang="EN-US">LOCK</span>前缀的功能。实际上,内存锁定对任何非对齐内存地址都其作用的。</span></p> <p class="MsoNormal"><span style="font-weight: normal;" mce_style="font-weight: normal;" lang="EN-US">&nbsp;</span></p> <p class="MsoNormal" style="text-indent: 24pt;" mce_style="text-indent: 24pt;"><span style="font-weight: normal;" mce_style="font-weight: normal;">这个指令的操作在<span lang="EN-US">64</span>位和非<span lang="EN-US">64</span>位模式下是一致的。</span></p> <p class="MsoNormal"><span style="font-weight: normal;" mce_style="font-weight: normal;" lang="EN-US">&nbsp;</span></p> <p>&nbsp;<-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值