linux内核双向链表中的INIT_LIST_HEAD函数以及container_of宏的疑惑

最近在看 Linux 内核循环双向链表,细细看的时候有一点不是很明白,请大家帮忙看看

  1. 新的内核中 list_entry 这个宏的定义如下:
    #define list_entry(ptr, type, member) \

    container_of(ptr, type, member)

  2. 新的内核中 container_of 这个宏的定义如下:

container_of(include/linux/kernel.h)

#define container_of(ptr, type, member) ({ \

const typeof( ((type *)0)->member ) *__mptr = (ptr);    \

(type *)( (char *)__mptr - offsetof(type,member) );})
  1. 老的内核中关于这个宏的定义如下:

#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

  1. 我的疑惑是:新老内核中的这种定义的意思我是明白的,我困惑于新的内核定义方式中 container_of 宏的定义中为什么要多加一个临时变量 _mptr ,这个临时变量的意义何在?
0

1个回答

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
linux内核双向链表中的INIT_LIST_HEAD函数以及container_of宏的疑惑
最近在看 Linux 内核循环双向链表,细细看的时候有一点不是很明白,请大家帮忙看看rnrn1. 新的内核中 list_entry 这个宏的定义如下:rn#define list_entry(ptr, type, member) \rn rn container_of(ptr, type, member)rnrn2. 新的内核中 container_of 这个宏的定义如下:rnrncontainer_of(include/linux/kernel.h)rn rn#define container_of(ptr, type, member) ( \rn rn const typeof( ((type *)0)->member ) *__mptr = (ptr); \rn rn (type *)( (char *)__mptr - offsetof(type,member) );)rnrn3. 老的内核中关于这个宏的定义如下:rnrn#define list_entry(ptr, type, member) \ rn((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))rnrn4. 我的疑惑是:新老内核中的这种定义的意思我是明白的,我困惑于新的内核定义方式中 container_of 宏的定义中为什么要多加一个临时变量 _mptr ,这个临时变量的意义何在?
最详尽解释Linux内核源码中的container_of宏及其标准C版本实现
在Linux内核源码文件 include/linux/kernel.h中,定义了container_of宏,源码如下:/** * container_of - cast a member of a structure out to the containing structure * @ptr: the pointer to the member. * @type:
linux 内核中的container_of()如何使用
一、如何使用 我们先来分析一下container_of(ptr,type,member),这里面有ptr,type,member分别代表指针、类型、成员。看一个例子: struct test         {                 int i;                 int j;                 char k;         };
Linux内核中的container_of函数简要介绍
container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。container_of的定义如下: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__...
Linux字符驱动中container_of宏的作用
首先看看这个宏的原型:     container_of(ptr,type,member)    功能:根据一个结构体变量中的一个成员变量的指针来获取指向整个结构体变量的指针。     参数:          ptr:已知的结构体成员的首地址(指针);          type:要获取的结构体变量的类型          member:要获取的结构体变量中成员的名字,而不是类型
Linux内核中经典链表 list_head 常见使用方法解析
      做内核驱动开发经常会使用linux内核最经典的双向链表 list_head, 以及它的拓展接口(或者宏定义): list_add , list_add_tail, list_del , list_entry ,list_for_each , list_for_each_entry ......       每次看到这些接口,感觉都很像,并且陈老师的那本书《深入理解linux内核》(UL...
list_head的用法总结
前言:写贪吃蛇C语音代码,大多用到双向链表做蛇的数据结构体。如下: 点击(此处)折叠或打开 typedef struct node /* Snake_node structure */ { int x_pos; int y_pos; struct node *prev; struct node *next; } Snake_Node;
c++11下 container_of编译不通过
gcc main.cpp -o main -std=c++11 报错如下:   原因:需要支持gnu++11扩展 gcc main.cpp -o main -std=gnu++11   编译通过
linux内核编程之list_head
【版权声明:转载请保留出处:blog.csdn.net/gentleliu。邮箱:shallnew*163.com】 linux内核头文件 #include 中定义了一个list_head类型的结构体: struct list_head { struct list_head *next, *prev; }; 一般我们的链表节点都包含许多成员,要使用list_head结构体来构造链表的
Linux内核:container_of宏分析
我们在编写驱动程序的时候,会经常在open函数中用到container_of宏,那么这个在linux内核中这个宏的主要作用是什么呢?
Linux内核的 container_of宏的疑问?
通过一个结构的成员的地址和结构名以及成员名,获得结构的首地址。rn[code=C/C++]rn #define container_of(ptr, type, member) ( \ rn const typeof( ((type *)0)->member ) *__mptr = (ptr); \ rn (type *)( (char *)__mptr - offsetof(type,member) );) rn[/code] rnrn直接写成这样也可以啊,有什么弊端?请高手指教?rn[/code] rn#define container_of(ptr, type, member) ( \rn (type *)( (char *)ptr - offsetof(type, member));)rn[/code] rnrnrnrn顺便纠正下rn这几篇文章把该函数的功能误写成了(应该是笔误吧):获得某结构中某成员的入口地址.rnhttp://blog.chinaunix.net/u3/95743/showart_1919346.htmlrnhttp://blog.oracle.com.cn/index.php/270927/viewspace-34644
【转】Linux内核的container_of宏
Linux内核的container_of宏作用:通过一个结构的成员的地址和结构名以及成员名,获得结构的首地址。宏定义:include/linux/kernel.hC代码 /**   * container_of - cast a member of a structure out to the containing structure   * @ptr:    the pointer to the member.   * @type:   the type of the container struct t
linux内核中container_of宏的分析
linux内核中container_of宏的分析 最近在学习linux,将自己所学到的分享给大家 先看一下container_of宏,在linux目录include/linux/Kernel.h文件里,如下: #define container_of(ptr, type, member) ({ const typeof( ((type *)0)->member ) *__mptr =...
Linux内核中container_of宏的理解
linux 中container_of的源码如下: #define container_of(ptr, type, member)  ({ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (ch
老生常谈的Linux内核中常用的两个宏定义
1. 第一个宏:offsetof用于计算 TYPE 结构体中 MEMBER 成员的偏移位置 #ifndef offsetof #define offsetof(TYPE, MEMBER) ((size_t)&((TYPE*)0)->MEMBER) #endif 仔细一看,编译器到底做了什么? size_t类型就是long unsigned int类型,这句代码的意思不就是C语言里面的强制类型
深度剖析linux内核万能--双向链表,Hash链表模版
我们都知道,链表是数据结构中用得最广泛的一种数据结构,对于数据结构,有顺序存储,数组就是一种。有链式存储,链表算一种。当然还有索引式的,散列式的,各种风格的说法,叫法层出不穷,但是万变不离其中,只要知道什么场合用什么样的数据结构,那就行了。 那么,标题说的内核万能链表,其实就是内核链表,它到底和我们平常大学学的数据结构的链表有什么不同呢??内核链表,是在linux内核里的一种普遍存在的数据结构,
从一个简单的宏定义看linux内核的严谨
最近闲来无事,分析下linux kernel里面一些函数都是怎样定义使用的,它们都是怎样避免风险的,从include/linux/kernel.h中挑出一个经典的min宏进行分析一下   从我们最先认识的min函数开始看看,这个函数的作用就是求两个数中小一点的那个 #define min(x, y) ({                                \ typeof(x)
linux内核的链表的实现
在Linux内核中,绝大对数的数据结构都是通过链表来连接的,所以链表在内核中起着异常重要的作用。在Linux中链表的使用是以一个非常巧妙的,非常有意思的方式来实现的。这种使用方式和我们平时在传统数据结构课程所教导的使用有很大的差异。先看一下最终使用时的结构。 下面我先来分析一下linux内核对于链表的实现。 里面好多的操作我本人都是通过画图方式理解的。大家也可以尝试。 下面是双向链表的基...
Linux内核链表之list_head
Linux内核链表之双链表(include/linux/list.h) 1、定义以及初始化 include/linux/type.h定义的结构体struct list_head { struct list_head *next, *prev;}; 2、初始化初始化①#define LIST_HEAD_INIT(name) { &(name), &(name) } #define L...
Linux内核源码中使用宏定义的若干技巧
在C中,宏定义的概念虽然简单,但是真要用好却并不那么容易,下面从Linux源码中抽取一些宏定义的使用方法,希望能从中得到点启发: 1. 类型检查 比如module_init的宏定义: 点击(此处)折叠或打开 #define module_init(initfn)                    \     static inline in
关于linux内核container_of宏的理解
container_of的功能是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针。 container_of宏定义来自kernel.h: /**  * container_of - cast a member of a structure out to the containing structure  * @ptr: the pointer to the me
对linux内核宏container_of的理解
<br />学习linux驱动的过程中经常会遇到一个这样的宏:container_of,原定义如下<br />linux/include/linux/kernel.h中<br /> 486/**<br /> 487 * container_of - cast a member of a structure out to the containing structure<br /> 488 * @ptr:        the pointer to the member.<br /> 489 * @type:
C语言小结--offsetof和container_of宏的使用
在Linux内核中这两个宏的使用非常普遍,所以研究透彻这两个宏非常有必要。接下来详细介绍一下这两个宏的使用。 1、offsetof宏的使用 这个宏比较简单,其作用就是求一个结构体成员变量在这个结构体中的偏移量。在Linux kernel中的路径是:include/linux/stddef.h 我们先来看一下这个宏的原型: #define offsetof(TYPE, MEMBER) ((
container_of函数原理分析
/**  * container_of - cast a member of a structureout to the containing structure  * @ptr:       the pointer to the member.  * @type:      the type of the container struct this is embedded in.  *
Linux内核中container_of函数详解
在Linux 内核中,container_of 函数使用非常广,例如 Linux内核链表 list_head、工作队列work_struct中。 在Linux 内核中有一个大名鼎鼎的宏container_of(),这个宏是用来干嘛的呢?我们先来看看它在内核中是怎样定义的。
对Linux内核中container_of宏的理…
http://blog.chinaunix.net/uid-20273473-id-461360.html 原型定义: 见内核源代码的 include/linux/kernel.h 文件, 定义如下: 487 * container_of - cast a member of a structure out to the containing structure 488   * @ptr:  
Linux内核中关于宏container_of的使用
在Linux内核代码中多处使用了宏container_of,关于container_of 的宏的定义在include/linux/kernel.h /** * container_of - cast a member of a structure out to the containing structure * @ptr: the pointer to the member. * @typ...
linux内核里面几个特殊的宏定义
#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
Linux内核中的常用宏container_of其实很简单
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。     Container_of的定义如下:  [cpp] view plaincopy #define container_of(ptr, type, member) 
linux内核分析--内核中的数据结构之双链表(一)
下面直接进入正题: 在了解了基本内容看具体实现,只知道数据成员list的地址,怎样去访问自身以及其他成员呢? 在include/linux/list.h头文件中可以看到这段代码! #define list_entry(ptr,type,member) / container_of(ptr,type,member)其中container_of这个宏在/include/linu
宏内核与微内核,Linux内核与Unix内核
操作系统内核可能是微内核,也可能是单内核(后者有时称之为宏内核Macrokernel)。按照类似封装的形式,这些术语定义如下: 单内核:也称为宏内核。将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效。微内核:功能被划分成独立的过程,过程间通过IPC进行通信。模块化程度高,一个服务失效不会影响另外一
为什么宏定义总是要使用do-while语句呢?
在阅读linux内核代码的过程中,经常会发现宏定义中使用了do-while语句。有时候觉得这种do-while语句显得有点多余?干嘛非得使用它把函数块包裹起来?像下面的 #define MARCO_FUN1() do{\                                                Function();                            
Linux内核数据结构——链表
目录目录 简介 单向链表 双向链表 环形链表 Linux内核中的链表实现 offsetof container_of container_of 第一部分 container_of 第二部分 链表初始化 向链表中增加一个节点 删除节点 移动节点 判断链表是否为空 遍历链表 Demo测试 tlisth mlistc 执行结果简介最近在学习Android Binder驱动程序实现的时候,发现里面的数据结构
linux驱动开发之字符设备--私有数据和container_of
前言 驱动开发中通常为设备定义一个设备相关的设备结构体,其包含该设备的cdev 、私有数据、信号量、irq等这些信息。 驱动开发中通常将文件的私有数据private_data指向设备结构体,在read()、write()、ioctl()等函数通过 private_data 访问数据 设备结构体。 container_of() 是一个比较常用的宏,其作用为通过结构体成员的指针找到对应结构体
linux内核红黑树运用小实例
linux内核版本linux-3.10.36 结构 linux内核的rb_node结构体 struct rb_node { unsigned long __rb_parent_color; struct rb_node *rb_right; struct rb_node *rb_left; } __attribute__((aligned(sizeof(long
浅谈双向链表的逆转以及用双向链表实现malloc/free/realloc
双向链表因为在Linux内核广泛使用,且能较好地考察对指针的理解,所以它的增删、逆转,以及如何用它来实现malloc/free/realloc等问题就成了技术型公司的偏好。   本篇第一部分谈双向链表的创建、增、删,不想阅读的读者可以直接跳过,第二部分谈如何实现逆转双向链表,第三部分谈如何malloc的常用实现,以及如何用双向链表来实现 malloc函数。 一、初识双向链表
内核 current宏解析
在内核中,可以通过current宏来获得当前执行进程的task_struct指针。现在来简要分析以下:      最原始的定义如下: #define current get_current() #define get_current() (current_thread_info()->task) 可以看出,current调用了 current_thread_info函数
linux内核中container_of的理解
#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) #define offsetof(TYPE, MEMBER) ((size_t)
Linux内核中的container_of浅析
本文的主要内容: 一、container_of的作用 二、container_of的定义 三、container_of的简单实现 一、container_of的作用 一般的我们通过结构体变量的地址可以找到其成员的地址,但是反过来一般是行不通的。在linux内核中就有这样的一个宏:container_of,它可以实现根据结构体成员的地址,找到这个结构体变量的地址,从而对结构体中的其
linux内核学习笔记之——list_for_each_entry
<br />在Linux内核源码中,经常要对链表进行操作,其中一个很重要的宏是list_for_each_entry:<br />意思大体如下:<br />假设只有两个结点,则第一个member代表head,<br />list_for_each_entry的作用就是循环遍历每一个pos中的member子项。<br /><br />图1:<br />pos:                                                           pos:<br />_______
文章热词 统计学稳健估计opencv函数 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 学习java疑惑 java学习很疑惑