对 typeof 的理解:

实际上, typeof 并不是宏定义,它是GCC的关键字,是GCC特有的特性。如果只知道一个变量的名字要得到其类型,并不是宏定义能够完成的,这需要编译时的信息。所以,typeof 操作是GCC内置的功能,在内核头文件和Glibc头文件中都是找不到typeof的宏定义的。

对 offsetof 的理解:

offsetof 是一个真正的宏,它定义在内核源代码 include/linux/stddef.h 文件中:

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

在这里,TYPE表示一个结构体的类型,MEMBER是结构体中的一个成员变量的名字。offsetof 宏的作用是计算成员变量 MEMBER 相对于结构体起始位置的内存偏移量,以字节(Byte)为单位。

它的计算原理是,把整数0进行强制类型转换,转换为一个 TYPE 类型的指针; 然后找到成员变量 MEMBER; 最后用取地址符 & 得到 MEMBER 的地址。 因为结构体是从地址0处开始的,所以 MEMBER 的地址就是其相对于结构体起始位置的偏移量。

对 container_of 的理解:

三个参数, ptr是成员变量的指针, type是指结构体的类型, member是成员变量的名字。 container_of 的作用就是在已知某一个成员变量的名字、指针和结构体类型的情况下,计算结构体的指针,也就是计算结构体的起始地址。 计算的方法其实很简单,就是用该成员变量的指针减去它相对于结构体起始位置的偏移量。

493 #define container_of(ptr, type, member) ({                      \
494          const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
495          (type *)( (char *)__mptr - offsetof(type,member) );})

在这个定义中,typeof( ((type *)0)->member ) 就是获得 member 的类型, 然后定义了一个临时的常量指针 __mptr, 指向 member 变量。 为什么不直接使用 ptr 而要多此一举呢? 我想可能是为了避免对 ptr 及prt 指向的内容造成破坏。 把 __mptr 转换成 char * 类型, 因为 offsetof 得到的偏移量是以字节为单位。 两者相减得到结构体的起始位置, 再强制转换成 type 类型。

Linux内核中container_of宏的理解相关推荐

  1. Linux内核中max()宏的奥妙何在?(二)——大神Linus对这个宏怎么看?

    最新max()宏 上回,我们在<Linux内核中max()宏的奥妙何在?(一)>一文中说到,在3.18.34版Linux内核源码中的max()宏,采用了GCC的扩展特性,可以避免一些错误. ...

  2. 内核中container_of宏的详细分析【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637597.html 内核中container_of宏的详细分析 16年2月28日09:00:37 内核中 ...

  3. Linux内核中max()宏的奥妙何在?(一)

    Linux内核中max()宏的奥妙何在?(一) 1.max()宏那点事 在Linux内核中,有这样四个比较大小的函数,如下: max(x,y) //两个数求最大值 min(x,y) //两个数求最小值 ...

  4. Linux 内核中的宏定义

    Linux 内核中的宏定义 rtoax 日期 内核版本:linux-5.10.13 注释版代码:https://github.com/Rtoax/linux-5.10.13 __attribute__ ...

  5. linux内核函数 ffs,linux内核中的宏ffs(x)【转】

    linux内核中ffs(x)宏是平台相关的宏,在arm平台,该宏定义在 arch/arm/include/asm/bitops.h #define ffs(x) ({ unsigned long __ ...

  6. linux内核函数 ffs,linux内核中的宏ffs(x)

    转自:https://www.cnblogs.com/fengeryi/p/3449720.html linux内核中ffs(x)宏是平台相关的宏,在arm平台,该宏定义在 arch/arm/incl ...

  7. linux内核中链表代码分析---list.h头文件分析(一)

    linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17:13:14 在学习数据结构时,有一个重要的知识点就是链表.对于链表的一些基本操作,它的最好学习资料就是内核中的li ...

  8. 如何放出Linux内核中的链表大招

    前言 上回,我们说到Linux内核中max()宏的终极奥义,Linux内核链表也不甘示弱,那么接下来,让我们看看Linux内核中的链表大招. 如何放出Linux内核中的链表大招 前言 一.链表简介 ( ...

  9. Linux内核中的常用宏container_of其实很简单【转】

    转自:http://blog.csdn.net/npy_lp/article/details/7010752 开发平台:Ubuntu11.04 编 译器:gcc version 4.5.2 (Ubun ...

最新文章

  1. Php魔术函数学习与应用 __construct() __destruct() __get()等
  2. vim在系统剪切板的复制与粘贴
  3. Android异步下载
  4. HDU 6304 Chiaki Sequence Revisited
  5. occam‘s razor
  6. aop阻止方法运行_Spring AOP无法拦截内部方法调用
  7. 在apache访问日志中统计统计前十名pv
  8. 通过conda安装imgaug
  9. 用ASP.NET编写一个在线RSS新闻聚合器
  10. 一,数据库基础,MySQL安装,配置文件,语法
  11. 帮助新手理解equals和hashCode
  12. Tomcat 基于域名的虚拟主机设置
  13. SaltStack 二修命令注入和提权漏洞
  14. 关于键盘事件对象code值
  15. 【Unity】雷达+Unity +TUIO 介绍一
  16. 微服务学习笔记 演进式架构 适应度函数概念
  17. 如何听清楚、说明白--《结构思考力》
  18. 参加第八届中国软件杯大学生软件设计大赛如何准备?以课工场为例!
  19. MySQL主主从复制+TomCat高可用实践案例
  20. 【68期分享】7款红色大气PPT模板免费下载

热门文章

  1. python爬虫基础扫盲之URL
  2. eclipse无法打开.ftl文件或打开.ftl没提示
  3. bcb6通过https接口post数据_Python+Requests+Pytest+YAML+Allure实现接口自动化
  4. mysql 性能拐点_性能压测及分析调优实践
  5. linux手动生成dump文件权限不足_linux下生成dump文件方法及设置
  6. [Discuz插件] HUX虚拟社区 3.0.9绿色版(huxcity)+打工模块
  7. 帐篷篷房建筑建材产品营销型网站源码 dedecms织梦模板
  8. FluidSynth(实时MIDI合成器)
  9. ds18b20温度转换指令_STM32接口DS18S20温度传感器
  10. 盲盒拓客小程序商家联盟红包分销裂变抽奖小程序源码