container_of注意事项

系统其它 专栏收录该内容
29 篇文章 0 订阅

已知一个变量的地址时,使用container_of获取此变量所在的结构体的首指针。其定义如下:

#define container_of(ptr, type, member) ({              \
    void *__mptr = (void *)(ptr);                   \
    BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) &&   \
             !__same_type(*(ptr), void),            \
             "pointer type mismatch in container_of()");    \
    ((type *)(__mptr - offsetof(type, member))); })


看一个例子,在中断下半部处理中,process_backlog函数根据napi指针地址,获取到其所在的softnet_data结构体的地址。一定要注意的是第三个参数(member)成员变量backlog,在结构体softnet_data中为变量,而不是指针,意思就是说backlog的地址一定是在为softnet_data分配空间的时候一起分配的,才能保证由backlog的地址(参数一:napi)推导出softnet_data的地址。

struct softnet_data {
    struct sk_buff_head process_queue;
    struct sk_buff_head input_pkt_queue;
    struct napi_struct  backlog;       //这里一定是变量,而非指针。
};
static int process_backlog(struct napi_struct *napi, int quota)
{   
    struct softnet_data *sd = container_of(napi, struct softnet_data, backlog);
}

如果backlog是一个指针,会出现什么情况?如下,假设成员backlog为指针,其初始化为全局变量ns_g的地址。此时的container_of拿ns_g的地址去做偏移,显然会得到一个非法的越界指针。

struct softnet_data {
    struct napi_struct  *backlog;       //错误情况
} sd_test;

struct napi_struct ns_g;
sd_test.backlog = &ns_g;

其实此种情况下,也是可以得到正确的softnet_data的地址的,只不过需要用backlog指针的地址去做偏移。

 

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值