0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux内核中container_of应用

麦辣鸡腿堡 来源:嵌入式Linux充电站 作者:Vincent 2023-10-04 15:23 次阅读

Linux内核中经常可见container_of的身影,它在实际驱动的编写中也是广泛应用。

container_of原理

作用 :通过结构体的某个成员变量地址找到该 结构体的首地址

定义如下:

/**
 * 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 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) );})
  • ptr:结构体成员变量的指针
  • type:结构体类型
  • member:结构体成员变量的名字

换句话说,叫: 已知结构体type的成员member的地址ptr,求解结构体type的起始地址

计算公式为:type的起始地址 = ptr -size(size为member的大小)

以一幅图说明ptrtypemember的关系:

图片

  • 原理简述:

container_of的妙处就在于 0作为成员变量member的基址

其中定义了一个中间变量__mptr,"__"代表内部使用,“m”代表middle

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

typeof( ((type *)0)->member )是获取member的类型,__mptr = (ptr)判断ptrmember是否为同一类型,offsetof计算成员member的大小size

驱动中的实际例子

例如内核的pwm驱动,通过成员变量chip,找到结构体bcm2835_pwm

struct bcm2835_pwm {
 struct pwm_chip chip;
 struct device *dev;
 void __iomem *base;
 struct clk *clk;
};

static inline struct bcm2835_pwm *to_bcm2835_pwm(struct pwm_chip *chip_ptr)
{
 return container_of(chip_ptr, struct bcm2835_pwm, chip);
}

使用container_of通常都会定义一个函数,并且命名为to_xxx或者to_find_xxx,代表要找xxx这个结构体,传参则传入成员变量指针,另外函数也会声明为inline

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1309

    浏览量

    39846
  • Linux
    +关注

    关注

    87

    文章

    10991

    浏览量

    206735
  • 变量
    +关注

    关注

    0

    文章

    595

    浏览量

    28112
收藏 人收藏

    评论

    相关推荐

    Linux内核container_of原理详解

    Linux内核中经常可见container_of的身影,它在实际驱动的编写中也是广泛应用。
    发表于 07-14 15:19 149次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>中<b class='flag-5'>container_of</b>原理详解

    详细聊聊container_of这个宏定义

    大家周末好,我是bug菌~ 今天主要是跟大家详细聊聊container_of这个宏定义,非常经典的宏,只是一直没有抽时间细细品味,今天就跟大家一起来看看有何神奇之处。
    的头像 发表于 11-13 09:45 330次阅读

    Linux内核笔记

    fox *f;f = list_entry(p, struct fox, list);也就是根据list_head的地址得到大的结构体的起始地址。在container_of的定义:第二行的意思是将
    发表于 11-30 23:25

    揭开linux内核container_of的神秘面纱

    linux 内核中有一个大名鼎鼎的宏container_of(),这个宏是用来干嘛的呢?我们先来看看它在内核是怎样定义的。呵呵,乍一看不
    发表于 11-11 10:02

    发烧友周报:盘点一周最热、最值得阅读的新闻与技术文章(第三期)

    /jishu_1095463_1_1.html  揭开linux内核container_of的神秘面纱https://bbs.elecfans.com/jishu_1095459_1
    发表于 11-14 15:00

    Linux内核的链表操作

    /linux/kernel.h]:#define container_of(ptr, type, member) ({\const typeof( ((type *)0)->member
    发表于 08-29 11:13

    offsetof宏与container_of宏详解

    :知道一个结构体某个元素的指针,反推这个结构体变量的指针。有了container_of宏,我们可以从一个元素的指针得到整个结构体变量的指针,继而得到结构体其它元素的指针。 (2)typeof关键字
    发表于 10-13 16:35

    Linux内核的C语言语法扩展

    收集一些感觉比较好的博客链接,方便以后再看Linux 内核的 C 语言语法扩展Linux 内核驱动
    发表于 12-15 06:04

    请教一下大神内核源码的containerof该怎样去实现呢

    内核源码是这样的#define container_of(ptr, type, member) ({\ const typeof( ((type *)0)->member ) *__mptr
    发表于 05-07 11:00

    Linux内核教程

    本章学习目标掌握LINUX内核版本的含义理解并掌握进程的概念掌握管道的概念及实现了解内核的数据结构了解LINUX内核的算法掌握
    发表于 04-10 16:59 0次下载

    Linux内核基础-container_of

    TYPE是某struct的类型,0是一个假想TYPE类型struct,MEMBER是该struct中的一个成员。 由于该struct的基地址为0, MEMBER的地址就是该成员相对与struct头地址的偏移量。
    发表于 05-14 14:26 779次阅读

    linux内核是什么_linux内核学习路线

    Linux内核是一个操作系统(OS)内核,本质上定义为类Unix。它用于不同的操作系统,主要是以不同的Linux发行版的形式。Linux
    发表于 09-16 15:49 2385次阅读

    linux内核参数设置_linux内核的功能有哪些

    本文主要阐述了linux内核参数设置及linux内核的功能。
    发表于 09-17 14:40 1220次阅读
    <b class='flag-5'>linux</b><b class='flag-5'>内核</b>参数设置_<b class='flag-5'>linux</b><b class='flag-5'>内核</b>的功能有哪些

    Linux内核】从小小的宏定义窥探Linux内核的精妙设计

    Linux内核】从小小的宏定义窥探Linux内核的精妙设计
    的头像 发表于 08-31 13:30 1640次阅读

    Linux内核中的宏/container_of分析

    今天在看平台设备实现的时候,看到to_xxx开头的“函数”。包括在内核中也有很多此类的“函数”,其实他们都是container_of的宏。因为内核是链表和结构体的世界,因此内核中有大量
    发表于 06-23 14:26 218次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>中的宏/<b class='flag-5'>container_of</b>分析