在i386架构上读取和写入Linux内核的Atom操作

时间:2014-03-05 10:10:20

标签: linux assembly kernel i386

    static __inline__ int atomic_dec_and_test(atomic_t *v)
{
    unsigned char c;

    __asm__ __volatile__(
        LOCK "decl %0; sete %1"
        :"=m" (v->counter), "=qm" (c)
        :"m" (v->counter) : "memory");
    return c != 0;
} 

这个实现让我很感兴趣 原子意味着什么在这个功能?只有减少部分? 但是我们怎样才能确保sete返回正确的价值呢? 我们需要在函数中禁用中断这一个?,似乎原子只用于这个函数中的一个句子(decl),而不是整个函数?

2 个答案:

答案 0 :(得分:2)

v是一个原子变量。访问该变量必须是原子的。 decl指令是该函数中访问v的唯一指令,因此它是唯一需要确保原子访问的指令。之后,根据decl的结果设置局部变量(因此不能被不同的CPU /上下文访问)。

所以atomic_dec_and_test()意味着原子地递减一个原子变量,并测试它是否导致达到零值。

答案 1 :(得分:0)

我不知道您正在查看哪个版本的Linux内核代码(我没有找到您在当前内核版本上发布的代码片段,而在最近的内核上它已被LOCK_PREFIX替换)但是试着找出来LOCK代表什么,它被定义为宏。我确定你会在lock宏中找到LOCK指令,它告诉cpu以原子方式look here执行后面的指令。特别是以下一行:

In a multiprocessor environment, the LOCK# signal insures that the processor has 
exclusive use of any shared memory while the signal is asserted.

请注意独占使用任何共享内存。而且我认为这是关键。