【问题标题】:Atom operation read and write of Linux kernel on i386 architecturei386架构下Linux内核的Atom操作读写
【发布时间】:2014-03-05 10:10:20
【问题描述】:
    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 返回正确的值呢? 我们需要在函数invoke this one中禁用中断吗?似乎原子仅适用于该函数中的一个句子(decl),而不是整个函数?

【问题讨论】:

  • 我需要让自己清楚,我知道在 decl 指令中使用 lock 前缀确保原子性,但是这个函数如何确保 sete 在 sete 之前的 decl 之后使用 eflag 寄存器导致的正确值are 可以是中断,并且 eflag 值可以由中断处理程序更改!!!!!!!!!!!!
  • 中断不会改变标志,除非故意编码这样做。否则你不能写任何代码。比如,如果你不能依赖 CMP 和随附的条件指令之间保留的标志,无论是否是原子的。
  • 或者,更准确地说,从中断返回时,标志会被恢复。
  • 这是我需要听到的正确答案,谢谢ninjalj

标签: linux assembly kernel i386


【解决方案1】:

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

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

【讨论】:

  • 我需要让自己清楚,我知道在 decl 指令中使用 lock 前缀确保原子性,但是这个函数如何确保 sete 在 sete 之前的 decl 之后使用 eflag 寄存器导致的正确值are 可以是中断,并且 eflag 值可以由中断处理程序更改!!!!!!!!!!!!
【解决方案2】:

我不知道您正在查看哪个版本的 Linux 内核代码(我没有找到您在当前内核版本上发布的代码 sn-p,在最近的内核上它已被 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.

请注意,它是对任何共享内存的专有使用。我认为这是关键。

【讨论】:

    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2013-01-10
    相关资源
    最近更新 更多