Chinaunix首页 | 论坛 | 博客
  • 博客访问: 999604
  • 博文数量: 442
  • 博客积分: 1146
  • 博客等级: 少尉
  • 技术积分: 1604
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-04 12:52
个人简介

123

文章分类

全部博文(442)

文章存档

2017年(3)

2016年(15)

2015年(132)

2014年(52)

2013年(101)

2012年(110)

2011年(29)

分类:

2012-05-03 13:34:36

如何将指向list_head的指针p转化为指向宿主的指针?
#include
struct list_head {
        struct list_head *prev;
        struct list_head *next;
};
struct mm_struct {
        int a;
        int b;
        double c;
        struct list_head mmlist;
        unsigned int d;
};
struct mm_struct init_mm = { 19999 };
int main()
{
        struct mm_struct *pm = (struct mm_struct*)0;//calculator offset
        int offset = &(pm->mmlist);
        printf("offset of c: %d\n",&(pm->mmlist));
        struct list_head *pl = &init_mm.mmlist;
        struct mm_struct *pm1 = (struct mm_struct*)((int)pl - offset);//convert
        printf("pm1->a:%d\n",pm1->a);
}

[root@localhost study]# ./a.out
offset of c: 16
pm1->a:19999

代码还是很简单的,内核中也实现了相应功能的宏。如下:
  1. 433 #define list_entry(ptr, type, member) \
  2.  434 container_of(ptr, type, member)
  1. 399 #define container_of(ptr, type, member) ({ \
  2.  400 const typeof( ((type *)0)->member ) *__mptr = (ptr); \
  3.  401 (type *)( (char *)__mptr - offsetof(type,member) );})
  1. 24 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
你还费解吗?
阅读(1392) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~