Chinaunix首页 | 论坛 | 博客
  • 博客访问: 424016
  • 博文数量: 58
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 623
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-26 18:48
个人简介

在生存面前,那纯洁的理想,原来是那么脆弱不堪!

文章分类

全部博文(58)

文章存档

2022年(1)

2021年(1)

2019年(3)

2018年(6)

2017年(6)

2016年(14)

2015年(10)

2014年(16)

2013年(1)

我的朋友

分类: LINUX

2014-05-18 11:21:28

在分析/lib/kobject.c文件中出现atomic_inc(&kref->refcount);

这是个什么函数呢,不就是要把计数加一,还专门定义一个函数。
查看了一下资料,原来是个原子操作,貌似以前听过,那就去看看到底长什么样吧!

首先在atomic_t类型定义

点击(此处)折叠或打开

  1. typedef struct {
  2.         int counter;
  3. } atomic_t;
再看atomic_inc()函数原型

点击(此处)折叠或打开arch/x86/include/asm/atomic.h

  1. static inline void atomic_inc(atomic_t *v)
  2. {
  3.         asm volatile(LOCK_PREFIX "incl %0"
  4.                      : "+m" (v->counter));
  5. }
看到函数内嵌了一段汇编,有一个lock的宏,然后把相应的内存中的值加一

这个LOCK_PREFIX宏锁定的是什么呢


点击(此处)折叠或打开/arch/x86/include/asm/alternative.h

  1. #ifdef CONFIG_SMP
  2. #define LOCK_PREFIX_HERE \
  3.                 ".section .smp_locks,\"a\"\n" \
  4.                 ".balign 4\n" \
  5.                 ".long 671f - .\n" /* offset */ \
  6.                 ".previous\n" \
  7.                 "671:"

  8. #define LOCK_PREFIX LOCK_PREFIX_HERE "\n\tlock; "

  9. #else /* ! CONFIG_SMP */
  10. #define LOCK_PREFIX_HERE ""
  11. #define LOCK_PREFIX ""
  12. #endif
程序大概意思是如果定义了多处理器,就定义一段汇编,因为没详细看过x86的芯片手册,不清楚lock指令是不是只启用多个处理器中的一个,然后完成原子操作??




阅读(1996) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~