1、编写一个内核模块,在模块中完成内核链表的创建、插入、删除、遍历等操作。 背景知识 1、内核链表实例分析 内核链表最大的特点是它的通用性,不必因为结构体中数据域的不同而单独为操作链表设计一套方法。 Linux内核在linux/lish.h文件中定义了内核通用链表list_head类型基本结构: s ...
分类:
其他好文 时间:
2016-05-25 15:01:32
阅读次数:
138
链表简介:
链表是哟中常用的数据结构,它通过指针将一系列数据节点连接成一条数据链。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或者删除数据。链表的开销主要是访问的顺序性和组织链的空间损失。
1. 链表对比
传统链表和内核链表
传统链表:一般指的是单向链表
struct List
{
struct li...
分类:
系统相关 时间:
2016-05-13 04:04:47
阅读次数:
308
linux内核链表的定义(定义了双向链表,不含数据域) 定义在 /linux-source-3.13.0/include/linux/types.h 头文件中. 1 struct list_head { 2 struct list_head *next, *prev; 3 }; 我们可以利用这个数据 ...
分类:
系统相关 时间:
2016-03-28 11:58:29
阅读次数:
281
#include<stdlib.h>#include<stdio.h>#include<malloc.h>#include<kernel_list.h>typedef struct node{ int data; struct list_head list;}listnode,*linklist;
分类:
其他好文 时间:
2016-02-21 17:02:13
阅读次数:
131
首先是创建内核模块。 按照上面的那张图,我们知道,我们创建链是使用INIT_LIST_HEAD这个函数。现在我们来使用source insight查看该函数的结构。 该函数是对我们的链表头进行初始化的。我们把链表头做一个参数传进来之后。我们分别用next和prev指针同时指向他本身。 可以看到,该函
分类:
其他好文 时间:
2016-02-14 00:31:34
阅读次数:
193
之前在剖析内核链表的文章中就有说到这个 container_of宏展开后的应用技巧。
//offset(struct list , list);----->展开后((size_t) & (struct list *)0 -> list) //写清楚一点时这样: //struct list *p = NULL ; &p->list ; 即是求p这个结构体指针的成员list的地址,只不过p...
分类:
编程语言 时间:
2016-02-04 19:09:53
阅读次数:
394
一 。 Linux内核链表 1 . 内核链表函数 1.INIT_LIST_HEAD:创建链表 2.list_add:在链表头插入节点 3.list_add_tail:在链表尾插入节点 4.list_del:删除节点 5.list_entry:取出节点 ...
分类:
系统相关 时间:
2015-12-05 21:06:23
阅读次数:
206
能不能一种链表中链接不同的类型呢,相应这种号召,内核链表诞生了。内核链表之所以能够链接不同的类型的数据,是因为它和普通链表不一样,它链接的不是数据结构的起始地址,而是链接的该数据结构中的的list_head属性。 下面是比较重要的函数: 其他的都很简单,专门介绍一下list_entry函数: 函数最...
分类:
其他好文 时间:
2015-11-25 00:26:01
阅读次数:
177
#include #include #define container_of(ptr, type, mem)(type *)((unsigned long)ptr -(unsigned long)&((type *)NULL)->mem) struct person { struct pers...
分类:
编程语言 时间:
2015-08-19 19:57:57
阅读次数:
156
linux内核链表:链表通常包括两个域:数据域和指针域。struct list_head{struct list_head *next,*prev;};include/linux/list.h中实现了一套精彩的链表数据结构。传统的链表指针指向下一个节点的头部。linux链表指针指向下一个指针list...
分类:
系统相关 时间:
2015-08-13 21:52:17
阅读次数:
142