linux 内核代码的offsetof()宏

转载 2015年07月08日 15:24:54
* 之前一直不理解((type *)0->member)是啥意思;甚至之前还在测试这种用法是否正确。
 * 这次在看list_entry的时候,又发现了这个用法。
 * 是在offsetof(type,member)中被调用的,
 * 原宏为:
#define offsetof(type,member) ((size_t) &((type *)0)->member)
 * size_t 是内核中的一种数据类型。是无符号的长整形。
 * 这个宏的作用是,计算元素member在其所在结构提type中的偏移量。
 * 那 看代码,还是不理解 。这不是在取member的地址么,还强制转化成size_t类型,
 * 怎么就是他在里面的偏移量了呢?甚至,用0->取元素,这种用法对还是错呢?
 * 哈哈,其实,重点就在用0->取元素上。
 *
 * 我们知道,定义结构体,内存会分配一块连续内存。结构体变量名也是该块连续内存的首地址。
 * 平时取元素 ,也是利用偏移量来进行操作。
 * 结构体内某一个元素的地址  =  结构体变量地址(即首地址)+ 偏移量。
 * 所以,如果结构体变量地址 == 0;
 * 该元素的地址 == 偏移量。
 * 所以,利用这样的小技巧,通过从0(NULL)作为首地址取元素,
 * 只要获取该元素的地址,就是该元素在其结构体内的偏移量了。

真的感叹c语言的巧妙,以及内核代码的构思,真真的灵活运用啊!

offsetof宏解析

offsetof宏解析 今天看代码时,发现一个有用的东东,offsetof(s,m),这是一个宏,MSDN文档的说明如下: Retrieves the offset of a memb...
  • xdonx
  • xdonx
  • 2013年07月22日 10:51
  • 1041

Linux内核源码中使用宏定义的若干技巧

在C中,宏定义的概念虽然简单,但是真要用好却并不那么容易,下面从Linux源码中抽取一些宏定义的使用方法,希望能从中得到点启发: 1. 类型检查 比如module_init的宏定义: ...
  • sdulibh
  • sdulibh
  • 2016年04月19日 15:05
  • 577

巧妙使用offsetof宏定义,在c,c++开发中解决问题

根据一个已经分配空间的结构体指针a中的某个成员b的地址,来获取该结构体指针地址...
  • lingyun1981
  • lingyun1981
  • 2014年07月09日 20:08
  • 1956

宏内核与微内核、Linux内核与Unix内核的区别

操作系统内核可能是微内核,也可能是单内核(后者有时称之为宏内核Macrokernel)。按照类似封装的形式,这些术语定义如下: 单内核:也称为宏内核。将内核从整体上作为一个大过程实现,并同时运行在一...
  • Silencegll
  • Silencegll
  • 2016年05月25日 10:06
  • 3156

offsetof和container_of两个内核中的宏

1、前言   很早之前就接触到这两个宏,只是觉得功能很强大,最近在内核漏洞利用中又看到这两个宏被使用,觉得有必要对内核中经典的算法,结构等mark一下。offsetof是用来判断结构体中成员的偏...
  • koozxcv
  • koozxcv
  • 2015年12月24日 14:47
  • 303

对linux内核的container_of和offsetof宏的理解

linux内核中存在container_of宏,其定义如下:/** * container_of - cast a member of a structure out to the containi...
  • GQ1900
  • GQ1900
  • 2017年07月22日 23:38
  • 253

sizeof与offsetof有关的结构体详解

sizeof与offsetof在程序中经常遇到,但在面试中其应用使得许多小伙伴吃闭门羹,被面试官问得哑口无言。接下来对两者的应用做详细介绍。关于sizeof定义:sizeof乃C/C++中的一个操作符...
  • callinglove
  • callinglove
  • 2015年06月17日 16:09
  • 3485

list_for_each_entry宏函数解析(上)

在内核中,经常用到list_for_each_entry函数, container_of
  • Richard_LiuJH
  • Richard_LiuJH
  • 2015年06月02日 10:42
  • 2292

Linux内核模块分析(module_init宏)

我们在学习Linux驱动开发时,首先需要了解Linux的模块化机制(module),但是module并不仅仅用于支撑驱动的加载和卸载。一个最简单的模块例子如下:// filename: HelloWo...
  • luckydarcy
  • luckydarcy
  • 2016年05月17日 03:25
  • 1121

一年后再次回头看container_of宏的作用

container_of宏在很久以前的文章我就已经有分析写过了,但是看回去,感觉以前自己对这个宏的表达描述分析能力还是有待提高,毕竟那时候刚接触linux内核不久,整个人都懵懵哒,无法说得让别人通俗易...
  • morixinguan
  • morixinguan
  • 2017年01月11日 14:58
  • 696
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 内核代码的offsetof()宏
举报原因:
原因补充:

(最多只允许输入30个字)