关于内核中hlist结构的疑问
我们知道,内核list的结构大致如下
struct list_head {
struct list_head *prev, *next;
};
这样一个小巧简单的链表,可以直接嵌入在其他自定义结构中,并且通过一个container_of(basetype, ptr)这样的宏,能找回所在的结构地址(通过ptr本身的大小和它的偏移量)。节点都是双头的,操作提来很方便。
而我觉得奇怪的是,为什么hlist的双头会是另外一个样子的。hlist的定义大致如下:
struct hlist_head {
struct hlist_node *first;
};
上面这个链表头用于指向一个下面这样的链表节点:
struct hlist_node {
struct hlist_node *next;
struct hlist_node **pprev;
};
对于hlist_node,除了正常的next指针以外,只有一个指向 "上一个节点->next" 的指针,以此来操作上一个节点的next指针--- 对于这一点,我的疑问是,为什么不直接使用 struct hlist_node *prev 来指向上一个节点? 这样的话,使用 prev->next 也能达到 **pprev 的效果啊?