linux系统函数container_of浅析

container of()函数简介       在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 但是当你通过追踪源码时,像我们这样的一般人就会绝望了(这一堆都是什么呀? 函数还可以这样定义??? 怎么还有0呢???  哎,算了,还是放弃吧。。。)。 这就是内核大佬们厉害的地方,随便两行代码就让我们怀疑人生,凡是都需要一个过程,慢慢来吧。        其实,原理很简单:  ... 阅读详情

Container_of是linux内核中常用到的一个宏macro,他的主要功能是根据包含在某个结构体中变量的指针来获取该结构体本身的指针,通俗讲就是根据结构体中成员变量中某个成员的首地址来获取该结构体的首地址

/**

*container_of - cast a member of a structure out to thecontaining structure

*@ptr: the pointer to the member.

*@type: the type of the containerstruct this is embeddedin.

*@member: the name of the member within thestruct.

*

*/

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

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

(type*)( (char *)__mptr - offsetof(type,member) );})

其中 ptr是指向type结构体成员变量中正被使用的某个成员变量的指针(即首地址);type是包含ptr指向的成员变量的结构体;member是type结构体中的成员,类型与ptr指向的变量类型一样。
功能是根据ptr的指针,来获取包含ptr所指类型的type结构体的指针
该宏的实现思路:计算type结构体成员member在结构体中的偏移量,然后ptr的地址减去这个偏移量,就得出type结构变量的首地址。

写一个简单的小例子字符驱动

Struct hello_android_dev {

int val;

struct semaphore sem;

struct cdev dev;

};

cdev *pcdev= &idev; (这里是我随便赋值的,前提是idev是struct cdev类型,且已经存在的)

Struct hello_android_dev* hello_dev =container_of(pcdev,struct hello_android_dev,dev);(一目了然了吧)

 

(ZOS-API)Matlab控制ZEMAX软件调整光学系统某镜面位姿 所用软件的版本:MatlabR2022a, Zemax OpticStudio2024R1交互扩展功能,Zemax和可以同时打开,操作会比较方便在ZEMAX软件中,调整次镜位置通常有两种方法:1.在次镜前后各添加一个坐标间断面,并修改其“偏心X”“偏心Y”等参数来调整次镜的位姿;2.或者直接在次镜属性选项中设置相关数值。这两种方法对Zernike系数的采集结果无显著影响。 阅读详情

相关推荐

cordic算法的FPGA实现

cordic 算法的MATLAB仿真及verilog实现

qq_38360574的博客 1676

container_of()宏

  最近学习为Android添加编写内核驱动,遇到的第一个问题就是linux中大名鼎鼎的container_of()宏。   container_of()是Linux内核中一个非常重要的宏,主要功能就是:根据结构体中一个域成员的地址获取整个结构体的地址。   container_of()定义如下: 1 /** 2 * container_of - cast a member of...

weixin_30337251的博客 107

Java Swing之多文档界面设计-JDesktopPane、JInternalFrame类简单应用示例

Java MDI多文档界面是一种用户界面风格,允许在一个主窗口中包含多个子窗口(文档窗口),每个子窗口可以显示不同的内容或功能模块,从而可以满足用户打开不同窗口完成不同功能的需求。开发多文档程序,一般需要JDesktopPane(桌面面板类)和JInternalFrame(内部窗体类)两个类。以下简单介绍,最后通过一个实例介绍实现逻辑。

编程语言教学工作者的博客 2209

container_of函数详解

可以说是内核中使用最为频繁的一个函数了,简单来说,它的主要作用就是根据我们结构体中的已知的成员变量的地址,来寻求该结构体的首地址,直接看图,更容易理解。了解完内部完整的实现手法之后,我们也可以手码一个。函数内部涉及的相关知识了然于胸,下面我们再来看。,该如何理解这个表达式呢?,下面我们一一拆解来看。函数中,主要用来断言判断。

u011029104的专栏 5501

Tube-based MPC完全指南:RCI集合构造与Matlab实现

模型预测控制(MPC)在实际工程中常因模型失配和外部扰动导致硬约束被突破,而鲁棒控制中的Tube-based MPC通过将单条预测轨迹扩展为“管道”集合,为不确定性提供了严格的安全边界。其核心在于利用鲁棒控制不变集(RCI)离线构造安全域,再结合在线标称MPC与反馈校正实现约束的硬保证。针对非线性系统,利普希茨条件为等效扰动的放大和RCI的构造提供了理论基础,使得算法既能保留非线性描述,又不牺牲在线计算效率。该方法适用于带扰动和参数漂移的机械系统、过程控制及嵌入式控制场景。本文以摩擦力非线性系统为例,从RC

weixin_32642109的博客 216

编程_三大编程思想:POP、OOP、AOP

简单介绍POP、OOP、AOP三大编程思想的区别和优缺点~

mikimo的博客 3896

理解 linux contain_of() 宏

linux contain_of() 宏 container_of()函数 1.该宏定义在include/linux/kernel.h中 439/** 440 * container_of - cast a member of a structure out to the containing structure 441 * @ptr:      

jacob的专栏 8058

K-L展开 (Karhunen-Loeve expansion)

K-L变换

susan_wang1的博客 2万+

Linux内核中的container_of

container_of 是 Linux 内核里非常常用的宏,作用是:已知某个结构体成员的地址,通过偏移量反推结构体的起始地址。核心公式就是:结构体地址 = 成员地址 − offsetof(type, member)。常用于内核链表,因为链表遍历时拿到的是 list_head,需要通过 container_of 还原成外层结构体,比如 struct student。本质就是指针算术,完全零开销,非常高效。

God_Cluodi的博客 1028

Labview调用C++ dll之字符串数组传递

做项目的时候碰到了一个需求,有一个复杂的运算,用labview实现非常的麻烦,但是如果用C++实现,就会灵活很多。尝试着采用Labview调用C++编写的动态链接库方式解决,兼顾Labview的便利和C++的灵活性。 运算好说,主要难点是Labview与C++之间的数据对应关系,因为我最后的结果是既有字符串又有数字,对于单纯的数字来说,直接通过调用数组的方式就能解决,这里主要记录一下字符串数组...

bgbgx的博客 6809

万字详解 PostgreSQL 的详细安装方式(Linux、Windows、macOS、Docker 全平台覆盖)

本文详细介绍了PostgreSQL在四大主流环境下的安装方法: Linux系统:针对Ubuntu/Debian和CentOS/RHEL系,分别提供APT/YUM仓库安装步骤,包括初始化配置和服务管理 Windows系统:通过图形化安装程序指导完成安装,包含组件选择、密码设置和pgAdmin配置 macOS系统:推荐使用Homebrew一键安装,支持Apple Silicon和Intel芯片 Docker容器:提供容器化部署方案(文中未展开) 文章强调安装前的版本选择、权限管理和存储规划,并针对各平台给出验证

数据知道的博客 4501

Linux container_of用法(五)

container_of(ptr, type, member) 作用:通过成员变量的地址得到它所在结构体的首地址 参数含义: ptr -- member类型定义的指针变量 type -- 需要操作的数据类型,通常为结构体 member -- type结构的成员名称 栗子:main.c #include <stdio.h> #include <string.h> #...

Android系统攻城狮 1069

建设银行核心系统建设历程全网最详细记录

中国建设银行核心系统数字化转型之路 摘要:中国建设银行自1954年成立以来,其核心系统经历了从分散到集中、再到分布式架构的演进历程。2002-2005年完成的数据大集中工程(DCC)实现了全行业务统一管理,2010年启动的"新一代核心系统"构建了企业级架构,率先实现"一次研发,全行共享"。2020年起全面推进主机下移战略,通过分布式架构改造,攻克八大关键技术难题,于2024年7月完成境内外全量核心业务下移,日均同步数据8亿条,实现金融核心系统完全自主可控。这一转型不仅

银行信息系统应用架构详解 4872

Linux container_of() 函数详解

container_of(ptr, type, member) 是一个宏函数,其作用是通过结构体成员的地址找到结构体的地址。该宏函数常在 linux 内核链表遍历之后使用,以此来获取虚节点所寄生的宿主结构体,详情可以参考这篇文章。参数简介:container_of(ptr, type, member) 中,ptr 为结构体成员地址,type 为结构体的类型,member 为结构体成员在结构体里的名字。

BigElt的博客 2708

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

linux驱动开发中常用函数--container_of的用法及分析

container_of的用法及分析

xi_xix_i的博客 4203

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Linux内核中的container_of浅析

本文的主要内容: 一、container_of的作用 二、container_of的定义 三、container_of的简单实现 一、container_of的作用 一般的我们通过结构体变量的地址可以找到其成员的地址,但是反过来一般是行不通的。在linux内核中就有这样的一个宏:container_of,它可以实现根据结构体成员的地址,找到这个结构体变量的地址,从而对结构体中的其

TECH_PRO的博客 923

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Linux 内核 container_of 宏详解

Linux 内核 container_of 宏实现原理分析

m0_37383484的博客 6213

Linux 中的 container_of 原理

这个宏函数在Linux 内核中使用的频率还是很多的。网上关于 container_of 使用的优秀文章也很多,之所以笔者也写一篇,一是想更新下最新代码中的使用,二是融入些自己的鄙见,方便自己回头查看,也希望能有助于后来读者。

私房菜 1755

Linux 宏定义container_of详解

再写Linux驱动的过程中经常是一个结构体套一层结构体,而在某些函数中传入的参数是子结构体指针,但是我们又需要获取的其外层结构体的数据,Linux为我们提供了container_of宏定义来为我们解决这个问题。 container_of宏定义就是用来通过内层结构体的指针获取外层结构体指针,宏定义很巧妙,我等凡人想不出来。下面就详细分析其实现原理吧。 container_of宏定义需要用到offse...

zhaoyun_zzz的专栏 1931

container_of函数

转自:https://blog.youkuaiyun.com/tigerjibo/article/details/8299589 1.container_of宏 1> Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。 2>接口: container_of(ptr, ...

qq_39937242的博客 3149

container_of的函数用法总结

首先看看函数的原型: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) )...

Change 915

linux——内核中container_of宏

前言 在查看linux内核中,经常会看到container_of这个宏定义,第一眼看到这个宏定义中括号一层又一层,晕了。下面本文就来好好分析这个宏的具体实现。 内核版本:linux-2.6.34 container_of宏详解 container_of宏的源码定义在kernel.h文件中,具体如下: /** * container_of - cast a member of a...

夜风的博客 2049

Linux内核中container_of函数详解

container_of(ptr, type,member)函数的实现包括两部分:1. 判断ptr 与 member 是否为同意类型2. 计算size大小,结构体的起始地址 = (type *)((char *)ptr - size) (注:强转为该结构体指针)现在我们知道container_of()的作用就是通过一个结构变量中一个成员的地址找到这个结构体变量的首地址。container_of(ptr,type,member),这里面有ptr,type,member分别代表指针、类型、成员。1。

u011029104的专栏 359

【Linux API 揭秘】container_of函数详解

container_of可以说是内核中使用最为频繁的一个函数了,简单来说,它的主要作用就是根据我们结构体中的已知的成员变量的地址,来寻求该结构体的首地址,直接看图,更容易理解。下面我们看看linux是如何实现的吧linux(type *)0offsetof。了解完内部完整的实现手法之后,我们也可以手码一个了 😃欢迎关注 公号&星球【嵌入式艺术】,董哥原创!

Donge's Blog 491

【Linux 内核】container_of宏浅析

1、container_of宏作用 一般的我们通过结构体变量的地址可以找到其成员的地址,但是反过来一般是行不通的。在linux内核中就有这样的一个宏:container_of,它可以实现根据结构体成员的地址,找到这个结构体变量的地址,从而对结构体中的其他成员进行访问。 2、container_of宏的内核定义 container_of宏在Linux内核的tools\perf\util\inc...

hello__的博客 337
上一篇: ARM常用汇编指令
下一篇: 解决u-boot 2016.11 ”ERROR: Makefile:1385: recipe for target 'checkarmreloc' failed”
LinuxWorking
博客等级 码龄10年 24粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值