96SEO 2026-02-20 01:41 16
href="https://www.cnblogs.com/ljbguanli/p/19621478"

aria-level="2">Linux内核中的container_of宏详解
xmlns="http://www.w3.org/2000/svg"> style="-webkit-tap-highlight-color: 0)">d="M5,0
rgba(0,
作者简介:
一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习
✨收录专栏:Linux,本专栏目的在于,记录学习Linux操作系统的总结
欢迎大家点赞
src="https://i-blog.csdnimg.cn/direct/70e0c4f238c14b01aabbedea163b356a.gif#pic_center">
Linux内核中的
container_of宏详解
什么是
container_of宏?1.1
基本概念
container_of是Linux内核中一个非常巧妙且常用的宏,它的作用是通过结构体成员的地址反向推导出包含该成员的结构体的地址。
id="12__16">1.2
类比理解
想象一下这样的场景:
- 你只知道一栋大楼(结构体)里某个房间(成员变量)的具体位置
- 你需要找出这栋大楼的入口地址(结构体起始地址)
container_of就是这个"导航工具"2.
为什么需要
container_of?
id="21__24">2.1
问题背景
在Linux内核编程中,经常使用链表来管理各种数据结构。
一个典型的设计模式是:
punctuation">;
问题:当我们遍历链表时,只能拿到
list_head的指针,如何获取包含它的my_struct结构体呢?2.2
对比表格:传统方法
container_of
特性 传统方法(直接访问) container_of方法 数据组织 结构体包含指针指向数据 数据包含链表节点 内存效率 需要额外指针,效率低 内存紧凑,效率高 代码复杂度 简单直观 需要宏包装,但复用性高 典型场景 普通应用编程 内核、嵌入式等系统编程 可维护性 修改时需要同步多处 结构体修改影响小
container_of的原型与实现
id="31__54">
3.1function">container_of
class="token
operator">->
memberclass="token
punctuation">)
function">container_of
class="token
punctuation">)
┌─────────┬─────────────────────────────────────────┐
├─────────┼─────────────────────────────────────────┤
ptr
└─────────┴─────────────────────────────────────────┘
4.
┌─────────────────────────────────────────────┐
struct
┌──────────────────────────────────────┐
成员1
├──────────────────────────────────────┤
成员2
├──────────────────────────────────────┤
...
├──────────────────────────────────────┤
member
├──────────────────────────────────────┤
其他成员...
└──────────────────────────────────────┘
└─────────────────────────────────────────────┘
container_of计算出的结构体起始地址
4.2
id="1offsetof_105">步骤1:计算成员偏移量(offsetof)
operator">->MEMBER
class="token
punctuation">)
工作原理:
(TYPE:将0地址强制转换为TYPE类型指针*)0
&((TYPE:获取成员在"假想"结构体中的地址*)0)->MEMBER
- 因为结构体起始地址为0,成员的地址就是它的偏移量
示例计算:
id="2_127">步骤2:反向计算结构体地址
operator">&some_person
class="token
function">container_of
class="token
punctuation">(
node_ptrclass="token
string"><stdio.h>
class="token
string"><stddef.h>
class="token
简化版offsetof和container_of
class="token
operator">->
MEMBERclass="token
punctuation">)
class="token
function">container_of
class="token
punctuation">)
class="token
operator">&
task2class="token
遍历链表:从list_head获取完整的task结构
class="token
operator">&
task1class="token
关键步骤:通过list_head找到包含它的task
class="token
function">container_of
class="token
punctuation">(
currentclass="token
punctuation">,
task_ptrclass="token
operator">->
priorityclass="token
operator">->
nextclass="token
punctuation">}
function">container_of
class="token
punctuation">;
7.
function">container_of
class="token
function">BUILD_BUG_ON
class="token
function">__same_type
class="token
operator">->
memberclass="token
function">__same_type
class="token
punctuation">)
优势总结
优势 说明 类型安全 编译时检查类型匹配 高效 编译时计算偏移,运行时只有减法操作 通用 适用于任何结构体和成员类型 内存友好 不需要为链表单独分配节点内存
id="8__272">8.
char*指针的加减法以字节为单位,而其他类型指针的加减法以类型大小为步长。
id="Q2__277">Q2:
如果正确使用是安全的,但需要确保:
Q3:
ptr确实指向type结构体中的membermember确实是type的成员可以,但需要自己实现或使用
<stddef.h>中的offsetof。
id="9__285">9.
operator">&some_outer
class="token
punctuation">.
embedclass="token
function">container_of
class="token
punctuation">(
inner_ptrclass="token
punctuation">;
class-name">complex_struct
同一个结构体可以同时存在于多个链表中
id="_314">
总结
container_of宏是Linux内核中嵌入式数据结构模式的核心工具,它体现了C语言指针运算的强大能力。通过巧妙的偏移量计算,实现了从部分到整体的逆向查找,是内核高效链表实现的基础。
核心要点记忆:
- 已知:成员地址
成员名
member)
- 结果:结构体地址
成员地址
偏移量
- 关键:所有计算都在编译时或简单的运行时完成,效率极高
这种设计模式不仅在Linux内核中广泛应用,在许多嵌入式系统、高性能服务器和底层库中都有重要应用。
class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback