Chinaunix首页 | 论坛 | 博客
  • 博客访问: 341832
  • 博文数量: 56
  • 博客积分: 2058
  • 博客等级: 中尉
  • 技术积分: 688
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-11 09:19
个人简介

code rush

文章分类

全部博文(56)

文章存档

2012年(2)

2011年(54)

分类: LINUX

2011-06-27 23:53:25

__init宏使内建模块中的init函数在执行完成后释放掉,仅用于初始化。编译器将所有代码存储
到特殊的内存段中,初始化结束就释放这段内存。

__initdata,和__init的作用基本上一样,不过它是针对数据。

__exit和__exitdata 仅用于退出和关闭线程,一般在注销设备驱动程序时使用。

likely和unlikely 的实现:
#define likely(x) __builtin_expect(!!(x),1)
#define unlikely(x) __builtin_expect(!!(x),0)

__builtin_expect() 是编译器来预测分之。

通知程序链// notifier_block 对象链表。

include/linux/notifier.h  
struct notifier_block  
{  
int(*notifier_call)(struct notifier_block *self, unsigned long, void *);  
struct notifier_block *next; 指向链中的下一个通知块。  
int priority;  优先级声明
};

#define  __define_initcall(level,fn,id) \
     static initcall_t __initcall_##fn##id  __attribute_used__ \
    __attribute__ ((__section__(".initcall" level ".init"))) = fn
这条宏带有3个参数:level,fn, id。
1.用来定义类型为initcall_t的static函数指针,函数指针的名称由参数fn和id决定:
__initcall_##fn##id,这就是函数指针的名称,它其实是一个变量名称。利用宏的参数
产生名称。

2.  __attribute__ ((__section__ (".initcall" level ".init"))),
输入段的名称由level决定,如果level="1",则输入段是.initcall1.init,如果level="3s",
则输入段是.initcall3s.init。这一函数指针变量就是放在用这种方法决定的输入段中的。

3. 函数指针变量的初始值其实就是宏参数fn,实际使用中,fn其实就是真实定义好的函数。
一般用法如下:
#define pure_initcall(fn)  __define_initcall("0",fn,0)
#define core_initcall(fn)  __define_initcall("1",fn,1)


#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
asmllinkage这个标志符和函数声明放在一起,告诉gcc编译器该函数不需要通过任何寄存器
来传递参数,参数只是通过堆栈来传递。

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