Linux 驱动程序中相关函数注释汇总(跟新中)


1、ARRAY_SIZE
宏,是求设备结构体中设备的个数
 
定义在linux/kernel.h中
 
#define ARRAY_SIZE(arr)(sizeof(arr)/sizeof((arr)[0]) + __must_be_array(arr))
 
sizeof(arr)/sizeof((arr)[0])是求出设备的个数,__must_be_array(arr)是防止被吴用,比如用指针而不是数组上。


2、INT_WORK
 
以前内核里对这个函数是这样定义的 #define INIT_WORK(_work, _func, _data),可以理解为INIT_WORK会在你定义的_work工作队列里面增加一个工作任务,该任务就是_func。_func这个任务会需要一些数据作为参数,这个参数就是通过_data传递的。
 
       do{                                                           /
                 (_work)->data = (atomic_long_t) WORK_DATA_INIT();      /
                    INIT_LIST_HEAD(&(_work)->entry);                       /
                    PREPARE_WORK((_work),(_func));                        /
          } while (0)
    
      #define INIT_DELAYED_WORK(_work,_func)                        /
            do{                                                   /
                    INIT_WORK(&(_work)->work,(_func));            /
                  init_timer(&(_work)->timer);                   /
             } while (0)
 

3、container_of()
 
#define container_of(ptr, type, member)({                     
const typeof(((type *)0)->member ) *__mptr = (ptr);   
(type *)( (char*)__mptr - offsetof(type,member) );})
 
(char *)__mptr转换为字节型指针。(char *)__mptr -offsetof(type,member) )用来求出结构体起始地址(为char *型指针),然后(type*)( (char *)__mptr - offsetof(type,member) )在(type *)作用下进行将字节型的结构体起始指针转换为type *型的结构体起始指针。
 
它的作用显而易见,那就是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。