在分析/lib/kobject.c文件中出现atomic_inc(&kref->refcount);
这是个什么函数呢,不就是要把计数加一,还专门定义一个函数。
查看了一下资料,原来是个原子操作,貌似以前听过,那就去看看到底长什么样吧!
首先在atomic_t类型定义
-
typedef struct {
-
int counter;
-
} atomic_t;
再看atomic_inc()函数原型
点击(此处)折叠或打开arch/x86/include/asm/atomic.h
-
static inline void atomic_inc(atomic_t *v)
-
{
-
asm volatile(LOCK_PREFIX "incl %0"
-
: "+m" (v->counter));
-
}
看到函数内嵌了一段汇编,有一个lock的宏,然后把相应的内存中的值加一
这个
LOCK_PREFIX宏锁定的是什么呢
点击(此处)折叠或打开/arch/x86/include/asm/alternative.h
-
#ifdef CONFIG_SMP
-
#define LOCK_PREFIX_HERE \
-
".section .smp_locks,\"a\"\n" \
-
".balign 4\n" \
-
".long 671f - .\n" /* offset */ \
-
".previous\n" \
-
"671:"
-
-
#define LOCK_PREFIX LOCK_PREFIX_HERE "\n\tlock; "
-
-
#else /* ! CONFIG_SMP */
-
#define LOCK_PREFIX_HERE ""
-
#define LOCK_PREFIX ""
-
#endif
程序大概意思是如果定义了多处理器,就定义一段汇编,因为没详细看过x86的芯片手册,不清楚lock指令是不是只启用多个处理器中的一个,然后完成原子操作??
阅读(2067) | 评论(0) | 转发(0) |