感谢支持
我们一直在努力

Linux内核中常见的符号

[THIS_MODULE]


模块是一种可以在内核运行过程中动态加载、卸载的内核功能组件。2.6内核中模块在被使用时,是不允许被卸载的。编程是需要用”使用计数”来描述模块是否在被使用。THIS_MODULE就充当了这个功能。


[likely& unlikely]


在2.6的内核中经常看到这两个符号,表面上看if(likely(value))和if(unlikely(value))其实都等同于if(value),但是在实际上执行是不同,加likely的意识着value为真的可能性要大;unlikely与之相反;加上这两个宏编译器会对其进行优化,提高程序效率。


[BUG_ON]


#define BUG_ON(condition) do { \


if(unlikely(condition)) BUG(); \


} while(0)


一些内核调用可以用来方便标记bug,提供断言并输出信息。最常用的两个是BUG()和BUG_ON()。当被调用的时候,它们会引发oops,导致栈的回溯和错误信息的打印。为什么这些声明会导致 oops跟硬件的体系结构是相关的。大部分体系结构把BUG()和BUG_ON()定义成某种非法操作,这样自然会产生需要的oops。


[IS_ERR& PTR_ERR & ERR_PTR]


#define IS_ERR_VALUE(x) unlikely((x) >=(unsigned long)-MAX_ERRNO)


IS_ERR宏用来检测x地址是否有效;


static inline void *ERR_PTR(long error)


{


         return(void *) error;


}


 


static inline long PTR_ERR(const void *ptr)


{


         return(long) ptr;


}


[container_of]


/**


 *container_of – cast a member of a structure out to the containing structure


 *@ptr:    the pointer to the member.


 *@type:   the type of the container structthis is embedded in.


 *@member: the name of the member within the struct.


 *


 */


#define container_of(ptr, type, member)({          \


         consttypeof(((type *)0)->member)*__mptr = (ptr);    \


                        (type *)((char *)__mptr – offsetof(type,member)); })


这可能是内核里面最长见的宏,替开发者解决了不少问题。通过指向成员(成员可以是一个结构体)member的指针ptr,来获取包含该成员的结构体type的指针。


EXAMPLE:


struct example_1 {
    struct example_2 s;
    int a;
    int b;
};

struct example_2 *doo;

struct example_1 *poo = container_of(doo, struct example_1, s);


[__init& __initdata & __exit & __exitdata]


这些宏定义的作用是告诉编译器将这些函数或者数据放入相应的section中,而在模块加载的阶段,.ko文件中的代码和数据的加载区域是根据section来加载的


比如:如果函数的定义中带有__init,那么这个函数的所有代码被放入.init.text的section中;


如果函数的定义中带有__initdata,那么这个函数的所有代码被放入.init.data的section中


之所以要使用这个宏定义,其中一个原因是标记为初始化的函数和数据,表明该函数和数据仅在初始化期间使用,在模块装载之后,模块就会将初始化函数扔掉。这样可以将该函数占用的内存释放出来。


[ARRAY_SIZE]


#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))


用于计算数组x成员个数

赞(0) 打赏
转载请注明出处:服务器评测 » Linux内核中常见的符号
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏