container_of ( )

0> 思路:

              通过实例学习container_of( ), 分步解决2个问题:

                      1>>求结构体某成员到此结构体起始地址的[绝对距离].

                      2>>求结构体起始地址.


struct node_st {
          int id;
          int math;
          int phy;
   };


struct node_st  node1 = {
                  .id = 1,
                  .math = 99,
                  .phy = 88,

};


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

1> 解决第<1>个问题:

 

已知: 结构体类型为 struct node_st, 求phy成员到结构体node1地址的绝对距离??

linux内核解决方法:

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

理解: (unsigned long) &((struct node_st *)0)->phy;

成员地址
phy

0x8
math

0x4
id

0x0

这样得到绝对距离为8, 巧妙之处:借用0地址.(0地址巧用还有个NULL)

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

2> 解决第<2>个问题:


已知:结构体类型为 struct node_st, phy成员及phy成员的地址, 求node1的地址???


内核解决方法:

 #define container_of(ptr, type, member) ({                    \
                           const typeof(((type *)0) ->member)*__mptr = (ptr);    \    /*疑问?这句多余吗*/  
                           (type *)((char *)__mptr -offsetof(type, member)); })

理解: container_of(&node1.phy,  struct node_st, phy)
          (struct node_st *) (char *)ptr - 8;


就是:用phy的实际地址(&node1.phy)减去绝对距离(8), 得到node1的地址;


NOTE:

          1>>   ({   }) 这种风格, 最后一句<;>就是结果.

          2>>    char *强转目的:按1个字节偏移


?疑问:

          这是内核的严谨, 可以判断&member的类型和ptr的类型是否一致!

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

总结:

          container_of(ptr, type, member) :

          输入3样:

                   <1>结构体类型type, <2>某一成员member, <3>member成员地址, 

         输出出结构体地址.   功能强大!!


         学习总结内核的代码技巧有益身心健康!!

                 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值