Linux内核驱动开发会经常用到Linux内核中经典的双向链表list_head,以及它的拓展接口和宏定义:list_add、list_add_tail、list_del、list_entry、list_for_each等。 在内核源码中,list_head结构体的定义在文件source_code/include/linux/types.h文件中,结构体定义如下: structlist_head{structlist_head*next,*prev;}...
Linux内核驱动开发会经常用到Linux内核中经典的双向链表list_head,以及它的拓展接口和宏定义:list_add、list_add_tail、list_del、list_entry、list_for_each等。 在内核源码中,list_head结构体的定义在文件source_code/include/linux/types.h文件中,结构体定义如下: structlist_head {structlist_head *next, *pr...
使用container_of()宏,我们定义一个简单的函数便可返回包含list_head的父类型结构体 依靠list_entry()方法,内核提供了创建、操作以及其他链表管理的各种例程——所有这些方法都不需要知道list_head所嵌入对象的数据结构 以下代码来自于Linux 2.6.22/include/linux/list.h /** * list_entry - get ...
就是将pos指针往前移动offset位置,即是本来pos是struct list_head类型,它即是list。即是把 pos指针往struct person结构的头地址位置移动过去,如上图的pos和虚箭头。 当pos移到struct person结构头后就转 成(struct person *)指针,这样就可以得到struct person *变量了。
其中,prev和next分别指向前一个和后一个元素的list_head结构体。通过这样的链表结构,可以轻松地在链表中插入、删除、遍历元素,实现各种数据结构和算法。在红帽公司的Linux发行版中,struct list_head被广泛应用于各种场景,如进程管理、网络协议栈、文件系统等方面。
由于struct list_head是一个通用的数据结构,因此在Linux内核中,其可以被用来实现各种不同的链表结构,而不需要重新定义一个新的链表结构。这样不仅方便了内核的扩展,也提高了代码的可读性和可维护性。 结语 在Linux内核中,struct list_head是一个非常重要的数据结构,它不仅实现了双向链表,而且提高了内核效率,方便了内...
xxxx xxx;//结构体变量 struct list* ptr;//指向同类型指针 } list_head有两个指针next和prev,所以是一个双向链表.list_head除了两个指向自身类型的指针外,是不包含其他字段的.list_head结构只是为了服务于其他内核的结构而设计,将其作为一个字段放在其他结构体中,如:struct task{ char a;struct ...
一个进程的虚拟地址空间主要由两个数据结构进行描述,一个是mm_struct,另一个是vm_area_struct。mm_struct描述的是虚拟地址的整体空间,vm_area_struct描述的是虚拟地址空间的一个区间(子集)。可以说,mm_struct结构是对整个用户空间的描述。 在进程的task_struct结构体中包含一个指向mm_struct结构的指针,mm_struct...
structlist_headanon_vma_chain;/* Serialized by mmap_sem & * page_table_lock 由mmap_sem和* page_table_lock序列化*/ structanon_vma*anon_vma;/* Serialized by page_table_lock 由page_table_lock序列化*/ /* 用于处理此结构体的函数指针 */ ...
使用hlist_head结构体的步骤如下: 1.声明一个hlist_head结构体变量,作为哈希链表的头结点。 2.使用INIT_HLIST_HEAD宏初始化hlist_head结构体变量,将其first成员置空。 示例代码如下: ``` #include <stdio.h> #include <stdlib.h> #include <linux/types.h> #include <linux/list.h> struct student { ...