linux设备驱动程序学习笔记——container_of宏
来源:互联网 发布:手机淘宝店店招图片 编辑:程序博客网 时间:2024/06/05 02:12
在open函数中,int (*open) (struct inode *inode,strcut file *flip); inode->i_cdev结构包含了我们在注册时配置的cdev结构,但是我们实际真正需要的是包含cdev结构的scull结构,在open中,我们应当获得这个scull结构的指针,方便以后的操作。如何获得,要利用到container_of宏。
该宏定义在<linux/kernel.h>中
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
typeof 用于确定某个变量的实际类型,offsetof宏用于确定某个成员在结构体中的偏移值。
第一句话,仅仅是用来定义一个跟member同类型的指针,这里可理解为临时变量。我们在定义一个宏时,如果也需要和参数相同的临时变量,就可以采用这种方法。这里的(type*)0,假定有一个在0地址的type类型指针,因为这不牵涉到读写,所以安全上没有问题。这里的0可以为任意都可以,在这里仅仅是获得变量类型,它和下面的offsetof宏不同。
第二句话:用member的地址减去member在type中的偏移,就得到了包含这个member的type的首地址。
offsetof宏定义在[include/linux/stddef.h]中:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
这里的技巧是假定有一个在0地址的TYPE类型指针,那么将它的MEMBER地址获得,并转为size_t(int)类型,这就是MEMBER的偏移了。很巧妙的思路。
- linux设备驱动程序学习笔记——container_of宏
- linux设备驱动程序学习笔记——主次设备号
- 学习笔记——Linux设备驱动程序——【第一章】设备驱动程序简介(完结)
- linux设备驱动程序学习笔记——分配内存
- Linux设备驱动程序 学习笔记
- Linux设备驱动程序学习笔记
- linux设备驱动程序学习笔记
- Linux设备驱动程序学习笔记
- linux设备驱动程序学习笔记
- Linux设备驱动程序笔记2—Urbs
- Linux设备驱动程序学习笔记01:设备驱动程序简介
- Linux设备驱动程序学习笔记03:字符设备驱动程序I
- Linux设备驱动程序学习笔记04:字符设备驱动程序II
- Linux设备驱动程序学习笔记05:字符设备驱动程序III
- Linux设备驱动程序学习笔记06:字符设备驱动程序IV
- Linux设备驱动程序学习笔记07:字符设备驱动程序V
- Linux设备驱动程序学习笔记3——简单的字符设备框架实现
- Linux设备驱动程序学习笔记4——简单的字符设备实现
- Exception String: Error in invoking target ‘agent nmo nmb’ of makefile CentOS 64位安装Oracle 10g 报错
- CentOS下 MySQL 5.5.13 CMake 安装笔记
- 3.17 inappropriateintimacy (狎昵关系)
- [MSCHART]多标题显示
- 融资向领头羊集中 深圳三成电商死于出生之年
- linux设备驱动程序学习笔记——container_of宏
- 选择新兴产业创业项目:四项原则与四个步骤
- UTF8和UNICODE和GBK编码
- 笔试题目小结
- 分享一个简单的iphone自定义状态栏例子
- 多线程访问共享内存的不加锁实现方式
- yaffs2文件系统制作
- 三大UML建模工具Visio、Rational Rose、PowerDesign的区别
- My first jsp page!