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"> </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"> </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"> </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"> </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"> </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"> </span></p>
<p> <-->