lock指令
今天看源码发现了⼀条以前没关注的汇编指令lock,查了⼀篇⽇志,解释⽐较清除,转来参考。
以下为转载内容:
今天看L4的代码,其中⼀个名为L4_KernelInterface的API让我迷惑了很久。其实现如下:
void * L4_KernelInterface(
L4_Word_t *ApiVersion,
L4_Word_t *ApiFlags,
L4_Word_t *KernelId
)
{
void * base_address;
__asm__ __volatile__ (
" lock; nop"
: /* outputs */
"=a" (base_address),
"=c" (*ApiVersion),
"=d" (*ApiFlags),
"=S" (*KernelId)
/* no inputs */
/* no clobbers */
);
return base_address;
}
整个函数的核⼼就是⼀条内联汇编语句,⽽汇编指令只有⼀条:
lock; nop
我们知道,lock是⼀个指令前缀,Intel的⼿册上对其的解释是:
Causes the processor's LOCK# signal to be asserted during execution of the accompanying instruction (turns the instruction into an atomic instruction). In a multiprocessor environment, the LOCK# signal insures that the processor has exclusive use of any shared memory while the signal is asserted.
真正的指令是nop,nop指令是⼀条什么也不⼲的指令,意思是no operation,⼀般⽤来做指令对齐。
所以,从代码上看,你⽆论如何都不明⽩,为什么⼀条什么也不⼲的指令最后,可以通过eax来得到KernelInterface的基地址。
由于我们看到的是C语⾔语句,有可能编译器做了⼀些我们看不到的事情,所以我们应该检查⼀下⽣成的汇编:
push %ebp
mov %esp,%ebp
push %esi
push %ebx
sub $0xc,%esp #为base_address分配空间
lock nop #C代码中的内联汇编
mov %edx,%ebx
offset指令是什么意思mov 0x8(%ebp),%edx
mov %ecx,(%edx) # *ApiVersion = %ecx
mov 0xc(%ebp),%edx
mov %ebx,(%edx) # *ApiFlags = %edx
mov 0x10(%ebp),%edx
mov %esi,(%edx) # *KernelId = %esi
add $0xc,%esp
pop %ebx
pop %esi
leave
ret # return %eax
mov %esi,%esi
从汇编代码中看不出任何倪端,因为⽣成的代码正是C语⾔所表达的意思。那问题到底出在哪⼉?难道有⿁了不成?
仔细查看⼀下源代码,难道lock本⾝可能会导致异常?然后异常处理程序会改变%eax, %ecx, %edx和%esi的值?
赶紧再翻出IA-32的指令⼿册,果然,上⾯写着:
An undefined opcode exception will be generated if the LOCK prefix is used with any other instruction except ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG,DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, and XCHG.
原来如此,赶紧搜索⼀个L4的异常处理程序,果然看到了下⾯代码段:
case 0xf0: /* lock prefix */
if (space->get_from_user(addr_offset(addr, 1)) == 0x90)
{
/* lock; nop */
frame->eax = (u32_t)space->get_kip_page_area().get_base();
frame->ecx = get_kip()->api_version;
frame->edx = get_kip()->api_flags;
frame->esi = get_kip()->get_kernel_descriptor()->_raw();
frame->eip+= 2;
return;
}
真相终于⼤⽩。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论