Linux内核源码中container_of详解

news/2024/7/20 10:20:52 标签: linux内核, structure, 编译器, struct

本文出自:http://blog.csdn.net/hongchangfirst

关于container_of的用法,可参考http://blog.csdn.net/hongchangfirst/article/details/7076225其实就是解决了”如何通过结构中的某个变量的地址获取结构本身的指针“这样的问题。container_of实现了根据一个结构体变量中的一个成员变量的指针来获取指向整个结构体变量的指针的功能。

首先container_of出现在linux/kernel.h中。定义如下:

 

/**
 * container_of - cast a member of a structure>structure out to the containing structure>structure
 * @ptr:	the pointer to the member.
 * @type:	the type of the container struct this is embedded in.
 * @member:	the name of the member within the struct.
 *
 */
#define container_of(ptr, type, member) ({			\
	const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
	(type *)( (char *)__mptr - offsetof(type,member) );})

 

typeof( ((type *)0)->member ) *__mptr 就是声明了一个指向其
我们在看一下offset的定义,在linux/stddef.h中。定义如下:

 

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)


offset顾名思义就是获得该成员变量基于其包含体地址的偏移量。先分析一下这个宏:
1. ( (TYPE *)0 ) 将零转型为TYPE类型指针; 
2. ((TYPE *)0)->MEMBER 访问结构中的数据成员; 
3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址; 
4.(size_t)(&(((TYPE*)0)->MEMBER))结果转换类型。

        有人可能感觉很不适应(TYPE *)0这种用法,把一个0转换成一个结构体指针是什么意思呢?其实就是声明了一个指向无物的指针,并告诉编译器这个指针式指向TYPE类型的,然后成员地址自然为偏移地址,因为成员地址-0还是成员地址。

 

        最后把__mptr 强制类型转换为char*类型,保证指针相减时是以一个字节为单位进行相减的,保证了程序的正确性。

 

         这样我们就可以利用container_of来根据一个成员变量的指针来获取指向整个结构体变量的指针,对于应用层程序而言,这种机制完全没有必要,但是对于设备驱动程序而言,运用container_of就很有必要了。



http://www.niftyadmin.cn/n/748370.html

相关文章

shell入门(四)——循环语法结构

目录1、for循环语法结构列表循环不带列表循环类C风格的for循环循环控制语句2、应用案例1、脚本计算1-100奇数和2、判断所输整数是否为质数3、批量创建用户4、局域网内脚本检查主机网络通讯3、while循环语句1. while循环语法结构2.应用案例4、until循环1. until语法结构1、for循…

Linux内核中list_head、list_for_each、list_entry、container_of之间的关系

原文:http://blog.csdn.net/hongchangfirst/article/details/7076225 作者:hongchangfirst Linux内核需要经常用到链表,所以为了避免重复的代码,就自己实现了一个循环双向链表。 首先我们先看一下list_head的定义,该结构体在linux/types.h中定…

什么是yaml

YAML(IPA: /ˈjməl/,尾音类似camel骆驼)是一个可读性高,用来表达资料序列的 编程语言。YAML参考了其他多种语言, 包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822。Clark Evans在2001年在首次发表了…

yaml语言简介

阮一峰的网络日志 首页 档案上一篇:谷歌的代码管理 下一篇:如何识别图像边缘? 分类: 开发者手册YAML 语言教程 作者: 阮一峰 日期: 2016年7月 4日 编程免不了要写配置文件,怎么写配置也是…

shell入门(五)

目录1、随机数1、如何生成随机数2、随机产生以139开头的电话号码3、随机抽出5位幸运观众① 思路② 落地实现4、批量创建用户(密码随机产生)① 思路② 落地实现2 、嵌套循环1、打印指定图案3、影响shell程序的内置命令4、expect5、sudo简单介绍6、数组定义7、其他变量定义1、随机…

初学android开发环境配置

本文出自:http://blog.csdn.net/hongchangfirst 废话不说,直接进入正题: 下载的文件有: 1、jdk-6u7-windows-i586-pJavaSE.exe 2、installer_r09-windows.exe 3、Eclipse.rar 4、mAndroid.rar 这个开发环境,已经包含了Android …

最简单的SpringBoot示例之.yml配置文件

使用SpringBoot yml配置文件(三) 原创 2017年02月20日 16:13:24 标签:服务器 /对象 /springBoot /yml配置 1.上一次我们已经使用SpringBoot实现了一个简单的HelloWord程序,辣么接下来我们简单的使用一下他的yml格式的配置文件。 …