asm volatile("incl %0":"+r"(b));是原子操作么。。。

Superisys 2010-07-01 09:10:46
asm volatile("incl %0":"+r"(b));

请问这个是原子操作么?如果不是,那么要怎么改呢?
ps:反汇编生成的对应的代码如下:
movl _b, %eax
/APP
incl %eax
/NO_APP
movl %eax, _b
...全文
554 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyfwx1213 2010-07-09
  • 打赏
  • 举报
回复
LOCK 好象是条汇编指令,可以锁住系统数据总线,锁了总线当然就变成原操作了
Superisys 2010-07-08
  • 打赏
  • 举报
回复
/*linux2.6.27.46/include/asm-x86/alternative.h*/
#ifdef CONFIG_SMP
#define LOCK_PREFIX \
".section .smp_locks,\"a\"\n" \
_ASM_ALIGN "\n" \
_ASM_PTR "661f\n" /* address */ \
".previous\n" \
"661:\n\tlock; "

#else /* ! CONFIG_SMP */
#define LOCK_PREFIX ""
#endif

/*linux2.6.27.46/include/asm-x86/atomic_32.h*/
static inline void atomic_add(int i, atomic_t *v)
{
asm volatile(LOCK_PREFIX "addl %1,%0"
: "+m" (v->counter)
: "ir" (i));
}

现在大概知道原子操作怎么实现的了
Superisys 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 coder_granger 的回复:]
用的时候这么弄:
static inline void atomic_add(int i, atomic_t *v) 
{
asm volatile(LOCK_PREFIX "addl %1,%0"
: "+m" (v->counter)
: "ir" (i));
}

[/Quote]
那么LOCK_PREFIX的头文件怎么个包含法呢。。。
Coder_Granger 2010-07-06
  • 打赏
  • 举报
回复
X86下是这样定义的,
arch/x86/include/asm/alternative.h
#ifdef CONFIG_SMP
#define LOCK_PREFIX \
".section .smp_locks,\"a\"\n" \
_ASM_ALIGN "\n" \
_ASM_PTR "661f\n" /* address */ \
".previous\n" \
"661:\n\tlock; "

#else /* ! CONFIG_SMP */
#define LOCK_PREFIX ""
#endif


用的时候这么弄
static inline void atomic_add(int i, atomic_t *v) 
{
asm volatile(LOCK_PREFIX "addl %1,%0"
: "+m" (v->counter)
: "ir" (i));
}

Superisys 2010-07-06
  • 打赏
  • 举报
回复
网上看了下,是用加锁的汇编解决原子操作的。
asm volatile(LOCK "incl %0":"+r"(b));
似乎找不到那LOCK在哪里定义的额。不过也有可能是Cygwin下没那东西吧。啥时候去Ubuntu下看下。
原子操作内核源码剖析:http://www.linuxforum.net/forum/showthreaded.php?Board=linuxK&Number=589252
Superisys 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 helldevil 的回复:]
atomic_inc()
[/Quote]
这个函数我知道
我就想知道用汇编嵌到C里面怎么实现
好像有看到过LOCK_PROFIX这样的宏定义,但是找不到在哪里定义的额。。。
T-Quake 2010-07-02
  • 打赏
  • 举报
回复
atomic_inc()
Superisys 2010-07-02
  • 打赏
  • 举报
回复
自己顶起来。。。
Superisys 2010-07-02
  • 打赏
  • 举报
回复
怎么都没人帮忙回答呢。。。
嫌太菜了么???

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧