Linux内核中的clear_bit函数如何工作?

时间:2017-11-03 01:58:30

标签: c assembly linux-kernel inline-assembly

clear_bit在这里定义,http://elixir.free-electrons.com/linux/v3.4/source/arch/alpha/include/asm/bitops.h#L60

static inline void
clear_bit(unsigned long nr, volatile void * addr)
{
    unsigned long temp;
    int *m = ((int *) addr) + (nr >> 5);

    __asm__ __volatile__(
    "1: ldl_l %0,%3\n"
    "   bic %0,%2,%0\n"
    "   stl_c %0,%1\n"
    "   beq %0,2f\n"
    ".subsection 2\n"
    "2: br 1b\n"
    ".previous"
    :"=&r" (temp), "=m" (*m)
    :"Ir" (1UL << (nr & 31)), "m" (*m));
}

这显然使用了一些AT&amp; T汇编语法。 ldl加载了很长时间。 bic清除了一点。 stl_c存储长。 beq是一个分支。

但是&#34; 2之后发生了什么:&#34;?什么是&#34; br?&#34;什么是

:"=%r" (temp), "=m" (*m)
:"Ir" (1UL << (nr & 31)), "m" (*m));

0 个答案:

没有答案