Linux内核内建链表(linux 创建链接)

Linux内核实现了自己的链表数据结构,它的设计与传统的方式不同,非常巧妙也很通用。

我们先看一下传统的定义

struct xxx{
    void * p;
    struct xxx * next,* prev;
}

这种方式将数据和链表指针定义在一起,整个链表也是通过整个结构体连接起来的。这种链表不具有通用性,换一个不同的结构体需要重新定义。

内核使用了不同的方式,它把链表的指针抽象出来,独立定义。

struct list_head{
     struct list_head *next, *prev;
};

使用的时候嵌入到结构体中即可。

这种方式将数据和链表剥离开来,去除了链表和数据的耦合,这样就可以定义统一的接口,使得链表的管理和操作变得非常简洁。

内核在<linux/list.h>中提供了操作链表的各种方法,感兴趣的小伙伴可以看看源码。linux内核链表是一个双向循环链表,这样能够提供最大的灵活性。

大家发现一个问题没有,我们如何获得链表所在结构体其他数据呢?

内核使用container_of()函数实现,这个函数能够通过结构体内部成员的地址找到结构体本身的地址,这样就可以通过链表的地址得到数据结构体的地址,然后就可以获得其他数据了。这些在链表的操作方法中都已经实现了。

链表在内核中非常重要,比如所有进程就是通过链表管理,进程的子进程、兄弟进程也是链表管理,这些在进程描述符中都可以看到。

一个结构中可以包含多个不同的链表节点,分别从属于不同的链表,构成一个错综复杂的网络结构。

小结:

原文链接:,转发请注明来源!