Linux系统container of()函数内核编程的详细说明,linux内核编程container of()函数介绍,为有字节对齐要求,所以该结构体大小为4bytes * 3 =12 bytes. 而&((struct test *)0)->k 的作用就是求 k到结构体temp起始地址的字节数大小(就是我们的size) 。在这里0被强制转化为struct test *型, 它的作用就是作为指向该结构体起始地址的指针,就是作为指向该结构体起始地址的指针,就是作为指向该结构体起始地址的指针, 而&((struct test *)0)->k 的作用便是求k到该起始指针的字节数 。。。其实是求相对地址,起始地址为0,则&k的值便是size大小(注:打印时因为需要整型,所以有个int强转)所以我们便可以求我们需要的 size 了 。好吧,一不小心把 offsetof() 函数的功能给讲完了前言在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 但是当你通过追踪源码时,像我们这样的一般人就会绝望了(这一堆都是什么呀? 函数还可以这样定义??? 怎么还有0呢??? 哎,算了,还是放弃吧 。。。) 。这就是内核大佬们厉害的地方,随便两行代码就让我们怀疑人生,凡是都需要一个过程,慢慢来吧 。
其实,原理很简单: 已知结构体type的成员member的地址ptr,求解结构体type的起始地址 。
type的起始地址 = ptr - size (这里需要都转换为char *,因为它为单位字节) 。
到此,该函数已经讲完,是不是很简单??? 其实也不是,这里并没有提到size如何计算,而令我们头晕的正是这里 。
好吧,先上container of函数原型:
#define container_of(ptr, type, member) ({\const typeof( ((type *)0)->member ) *__mptr = (ptr);\(type *)( (char *)__mptr - offsetof(type,member) );}) 其次为 offserof 函数原型:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 怎么样,是不是很炫? 好吧,下面开始揭开面纱:
(一)0 指针的使用 (自己给的名字,不知有木问题)【Linux系统container of函数内核编程的详细说明,linux内核编程container of()函数介绍】 让事实说话:
#include<stdio.h> struct test{ char i ; int j; char k;}; int main(){ struct test temp; printf("&temp = %p\n",&temp);printf("&temp.k = %p\n",&temp.k); printf("&((struct test *)0)->k = %d\n",((int)&((struct test *)0)->k)); } 编译运行,可以得到如下结果:
&temp = 0xbf9815b4什么意思看到了吧,自定义的结构体有三个变量:i,j,k 。因为有字节对齐要求,所以该结构体大小为4bytes * 3 =12 bytes. 而&((struct test *)0)->k 的作用就是求 k到结构体temp起始地址的字节数大小(就是我们的size) 。在这里0被强制转化为struct test *型, 它的作用就是作为指向该结构体起始地址的指针,就是作为指向该结构体起始地址的指针,就是作为指向该结构体起始地址的指针, 而&((struct test *)0)->k 的作用便是求k到该起始指针的字节数 。。。其实是求相对地址,起始地址为0,则&k的值便是size大小(注:打印时因为需要整型,所以有个int强转)所以我们便可以求我们需要的 size 了 。好吧,一不小心把 offsetof() 函数的功能给讲完了:::
&temp.k = 0xbf9815bc
&((struct test *)0)->k = 8
推荐阅读
- Linux系统下DHCP获取IP服务的安装教程,超详细讲解Linux DHCP服务
- Linux操作系统内CPU占用率居高不下的解决办法,linux下cpu飙高原因排查过程详解
- Linux系统下LVM阵列增加硬盘扩容的操作教程方法,Linux里LVM磁盘扩容详细步骤
- 华为c8813刷什么系统最好??
- 夏普sh8118u为什么叫做点心操作系统?有什么特点?
- 我的系统程序自动消失了这是怎么回
- 小米2a哪个系统版本占内存最低,占多少
- 苹果手机如何在本机上更新系统
- 奥迪q3车身稳定系统怎么开启 奥迪q3汽车稳定系统怎么用
- miui10系统官网下载专区,miui10下载官网手机版