链表结构解析-Linux源码

2014-11-24 10:09:26 · 作者: · 浏览: 0

在Linux内核代码中,经常会使用到链表结构,其中分为普通链表和哈希表。普通链表在文件list.h中,定义的格式如下:


struct list_head {


struct list_head *next, *prev;


};


其中比较难理解的地方有两点:


1、如何通过在数据结构中添加list_head成员变量实现链表;


2、如何通过list_head成员变量访问宿主数据;


关于第二点,本文稍作解释。


list_head成员可以放置在宿主的任意位置,不需要放置在第一个变量的位置。当需要访问宿主的结构时,首先通过使用list_head成员变量的地址减去相对于结构的偏移量,从而获取结构的地址,进而可以访问结构的其他成员。使用公式表示如下:


Address(struct data)=Address(list_head)-offset(list_head)


如下图所示:


struct data


------------------_______


| length | |


| ... | 偏移量


| list_head |__|____


| ... |


| |


------------------