zoukankan      html  css  js  c++  java
  • 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变量的地址

        

        可以结合下图观看:

      

        

        

  • 相关阅读:
    python不同包之间调用时提示文件模块不存在的问题
    adb shell 查看内存信息
    adb shell top 使用
    Android读取logcat信息
    父类的引用对象指向子类的对象
    我的阿里梦——淘宝前端必备技能
    我也做了一个1/4圆形菜单
    可编辑tab选项卡
    canvas 之
    canvas之----浮动小球
  • 原文地址:https://www.cnblogs.com/dakewei/p/10537095.html
Copyright © 2011-2022 走看看