当前位置: 首页 > news >正文

linux 内核 container_of 宏的原理

一:概述

        container_of 宏是 Linux 内核中一个非常经典、非常强大的 “结构体逆推”技巧,用于从某个结构体成员的指针,反推出这个成员所在的结构体指针。  

#define container_of(ptr, type, member) \((type *)((char *)(ptr) - offsetof(type, member)))

二:它做了什么? 

        container_of 的核心思想就是:  结构体中的某个成员的地址 - 成员在结构体中的偏移量 = 整个结构体的起始地址!

 三:举个例子      

#include <stdio.h>
#include <stddef.h>  // 提供 offsetofstruct my_container {int id;char name[20];struct inner {int x;int y;} point;
};// 模拟 container_of
#define container_of(ptr, type, member) \((type *)((char *)(ptr) - offsetof(type, member)))int main() {struct my_container c = { .id = 42, .point = { .x = 1, .y = 2 } };// 已知 point 的地址struct inner *p = &c.point;// 逆推出 my_container 指针struct my_container *orig = container_of(p, struct my_container, point);printf("original id = %d\n", orig->id);  // 输出 42
}

四:总结 

        内核中的很多子系统(如 device、list、ttm)都使用一个通用结构(比如 struct list_headstruct device), 然后通过 container_of 在需要时把它转换为“更具体”的结构体。 

        所有结构体“嵌套”在一起,方便管理;用 container_of 能轻松回到“容器结构体”。

相关文章:

  • 批量上传OpenStack镜像
  • python中参数前**的含义
  • 数据结构-前缀树
  • 【Vue 2中的emits声明与Vue 3的defineModel宏函数详解】
  • 蓝牙网关的功能与应用场景
  • Doris的向量化执行如何支撑分布式架构和复杂查询
  • 深度剖析:生成式人工智能备案和登记的关键差异
  • 【HFP】深入解析蓝牙 HFP 协议中呼叫转移、呼叫建立及保持呼叫状态的机制
  • 【强内核论】(6) 核心竞争力:价格不是决定成交的主要因素 | 决定对方买单的是人设 | 老陈头 | 数字游牧社
  • 采用若依vue 快速开发系统功能模块
  • 安全测试的全面知识体系及实现路径
  • visual studio 2022更改项目名称,灾难性故障(异常来自HRESULT)
  • [dp16_两个数组] 通配符匹配 | 交错字符串 | 两个字符串的最小ASCII删除和
  • Linux中NFS服务设置
  • 3.学习笔记--Spring-AOP总结(p39)-Spring事务简介(P40)-Spring事务角色(P41)-Spring事务属性(P42)
  • vue MarkdownIt标签多出了<p>标签导致高度变丑
  • 【实战篇】导入dbc文件
  • 路由过滤实验
  • 【从零实现高并发内存池】thread cache、central cache 和 page cache 回收策略详解
  • 硅基光子学微环谐振器(MRR)技术进展与前沿热点
  • 海口市政协党组成员、秘书长、机关党组书记汪娟被查
  • 工业富联一季度净利增长25%,云计算业务营收增长超50%
  • 牛市早报|今年第二批810亿元超长期特别国债资金下达,支持消费品以旧换新
  • 准80后湖北省财政厅副厅长徐晶华已调任襄阳市副市长
  • 黄仁勋访华期间表示希望继续与中国合作,贸促会回应
  • 国家发改委答澎湃:力争6月底前下达2025年两重建设和中央预算内投资全部项目清单