• linux内核中宏container_of是干什么的?


    Linux Kernel Version 4.14

    1. container_of是干什么的?

      已知一个结构体中某个成员的首指针,那么就可以通过宏container_of来获得此结构体的首指针

    2 先看看container_of是如何定义的吧

    #define container_of(ptr, type, member) 
        (type *)((char *)(ptr) - (char *) &((type *)0)->member)

      解析一下各参数:

      ptr: 结构体成员的指针

      type: 结构体的类型

      member: 结构体成员的名字

    2. 举一个例子

      2.1 有两个结构体如下:

        struct element1 {

          struct element2 struct_element2;

          int element3;

        }

        struct element2 {

          int element4;

        }

      2.2 定义一个struct element1变量element

        struct element1 element

      2.3 已知结构体变量element中成员element3的地址为0x2d,通过结构体struct element1中的成员element3来获取结构体变量element的地址

        container_of(element3_ptr,struct element1,element3)

      2.4 拆开

        (struct element1 *)((char *)(&element3) - (char *) &((struct element1 *)0)->element3)

        从已知可得:

        &element3=0x2d;

        (char *)(&element3)=0x2d;

        (struct element1 *)0=地址为0x0,指向的内容为一个struct element1结构体;

        ((struct element1 *)0)->element3=结构体中element3的内容;

        &((struct element1 *)0)->element3=取结构体中element3的地址,这是偏移地址,为0x04;

        (char *)&((struct element1 *)0)->element3=0x04;

        最终:

        ((char *)(&element3) - (char *) &((struct element1 *)0)->element3)=0x2d - 0x04) = 0x29

        (struct element1 *)0x29 = 0x29,0x29这个地址指向的是一个结构体struct element1,那么这就是element变量的地址

        

        可以结合下图观看:

      

        

        

  • 相关阅读:
    JavaScript 随机产生十个整数,放入数组中,对这个数组进行降序排序,并获取到这个数组的最大值和最小值
    JavaScript输出换行
    JavaScript超时调用、间歇调用
    JavaScript内置对象
    JavaScript事件列表
    JavaScript 中 for-in和 for-of 的区别
    JavaScript break指定标签打破多层循环示例
    初识JavaScript
    HTML + CSS CSS设置背景图片后图片没有铺满屏幕等
    设计模式之工厂模式
  • 原文地址:https://www.cnblogs.com/dakewei/p/10537095.html
Copyright © 2020-2023  润新知