第四季-专题7-Linux内核链表

专题7-Linux内核链表

1.链表简介

链表是一种常用的数据结构,它通过指针将一系列数据节点连接成一条数据链。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据。链表的开销主要是访问的顺序性和组织链的空间损失。

传统链表与Linux内核链表的区别:

以前我们学习的链表主要有,单项链表、双向链表、双向循环链表。我们用的Linux内核链表示双向循环链表。Linux内核链表创建的目的就是,使用链表是统一操作和统一的函数。内核链表同样有节点、

2.内核链表-结构

struct list_head

{

struct list_head *next, *prev;

};

list_head结构包含两个指向list_head结构的指针prev和next,由此可见,内核的链表具备双链表功能,实际上,通常它都组织成双向循环链表。

(1)INIT_LIST_HEAD:创建链表

(2)list_add:在链表头插入节点

(3)list_add_tail:在链表尾插入节点

(4)list_del:删除节点

(5)list_entry:取出节点

(6)list_for_each:遍历链表

例子:

我们要做的是在我们创建的内核模块中加入链表的内容。

创建新的makefile文件:

boj-m := mylist.o

KDIR := /home/free/part3/linux-TQ210

all:

make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm

创建新的mylist.c文件:

#include<linux/module.h>

#include<linux/init.h>

#include<linux/list.h>

struct score

{

int num;

int english;

int math;

struct list_head list;

};

struct list_head score_head;

struct score stu1,stu2,stu3;

struct list_head *pos;

struct score *tmp;

int mylist_init()

{

INIT_LIST_HEAD(&score_head);

stu1.num = 1;

stu1.english = 91;

stu1.math = 97;

list_add_tail(&(stu1,list),&score_head);

stu2.num = 2;

stu2.english = 92;

stu2.math = 98;

list_add_tail(&(stu2,list),&score_head);

stu3.num = 2;

stu3.english = 93;

stu3.math = 99;

list_add_tail(&(stu3,list),&score_head);

list_for_each(pos,&score_head)

{

tmp = list_entry(pos,struct score,list);

printk("num %d,english is %d,math is %d\n",tmp_num,tmp-english,tmp-math);

/*list_head指向节点的指针域,并不包含节点中的内容,为了使,指针指向结点的开头,

我们使用函数list_entry,这样我们就能够通过pos指针查看,节点中的内容。*/

}

return 0;

}

void mylist_exit()

{

//在退出的时候,我们可以从节点中删除结点。

list_del(&(stu1,list));

list_del(&(stu2,list));

list_del(&(stu3,list));

}

module_init(mylist_init);

module_exit(mylist_exit);

运行:

    把编译好的mylist.ko文件导入开发板中,安装,这时就会显示每个学生的学号以及各科成绩。

3.分析
4.  在应用程序中移植内核链表

原文地址:https://www.cnblogs.com/free-1122/p/10902186.html

时间: 2024-10-12 19:11:04

第四季-专题7-Linux内核链表的相关文章

Linux 内核链表

一 . Linux内核链表 1 . 内核链表函数 1.INIT_LIST_HEAD:创建链表 2.list_add:在链表头插入节点 3.list_add_tail:在链表尾插入节点 4.list_del:删除节点 5.list_entry:取出节点 6.list_for_each:遍历链表 2.程序代码

例说Linux内核链表(二)

链表使用 我认为熟悉内核链表功能最好的方法就是看一些简单的实例,实例是一个非常好的素材去更好的理解链表. 下面是一个例子,包含创建,添加,删除和遍历链表. <span style="font-size:14px;"><span style="color:#330099;">#include <stdio.h> #include <stdlib.h> #include "list.h" struct

Linux 内核 链表 的简单模拟(2)

接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop cursor. * @head: the head for your list. */ #define list_for_each(pos, head) for (pos = (head)->next; pos != (head);

例说Linux内核链表(一)

介绍 众所周知,Linux内核大部分是使用GNU C语言写的.C不同于其他的语言,它不具备一个好的数据结构对象或者标准对象库的支持.所以可以借用Linux内核源码树的循环双链表是一件很值得让人高兴的事. 在include/linux/list.h文件中用C实现了一个好用的循环链表.它是有效而且易于操作的,否则它也不会被内核使用(译者注:在kernel中大量的使用了循环双链表结构,比如在在进程描述符实体中我们就可以看到很多struct list_head的身影).不管何时,依靠这种结构,在内核中都

例说Linux内核链表(三)

经常使用的linux内核双向链表API介绍 linux link list结构图例如以下: 内核双向链表的在linux内核中的位置:/include/linux/list.h 使用双向链表的过程,主要过程包括创建包括struct link_head结构的结构体(item),建立链表头.向链表中加入item(自己定义数据结构.双向链表数据单元).删除链表节点.遍历链表,判空等. 1.建立自己定义链表数据结构 struct kool_list{ int to; struct list_head li

linux内核链表的使用

linux内核链表:链表通常包括两个域:数据域和指针域.struct list_head{struct list_head *next,*prev;};include/linux/list.h中实现了一套精彩的链表数据结构.传统的链表指针指向下一个节点的头部.linux链表指针指向下一个指针list_head结构(*next),双向循环.不会随着外部数据的变化而变化,使它具有通用性.? -------------------------------------------------------

linux内核链表的移植与使用

一.  Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲.由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用. /*********************************** 文件名:kernel link list of linux.h 作者:Bumble Bee 日期:2015-1-31 功能:移植linux内核链表 ************************************/ /*链表结点数据结构*/ struct lis

Linux 内核链表使用举例

链表数据结构的定义很简洁: struct list_head { struct list_head *next, *prev; }; list_head结构包含两个指向list_head结构的指针prev和next,该内核链表具备双链表功能,通常它都组织成双循环链表,这里的list_head没有数据域.在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表节点.下面是一个简单的内核模块的例子,包含了对链表进行插入.删除.遍历的一些函数: list.c: #include <l

链表的艺术——Linux内核链表分析

引言: 链表是数据结构中的重要成员之中的一个.因为其结构简单且动态插入.删除节点用时少的长处,链表在开发中的应用场景许多.仅次于数组(越简单应用越广). 可是.正如其长处一样,链表的缺点也是显而易见的.这里当然不是指随机存取那些东西,而是因为链表的构造方法(在一个结构体中套入其同类型指针)使得链表本身的逻辑操作(如添加结点,删除结点,查询结点等),往往与其应用场景中的业务数据相互混杂.这导致我们每次使用链表都要进行手工打造,做过链表的人肯定对此深有了解. 是否能将链表从变换莫測的业务数据中抽象出

linux内核链表使用

原文链接:http://blog.csdn.net/xnwyd/article/details/7359373 Linux内核链表的核心思想是:在用户自定义的结构A中声明list_head类型的成员p,这样每个结构类型为A的变量a中,都拥有同样的成员p,如下: struct A{ int property; struct list_head p; } 其中,list_head结构类型定义如下: struct list_head { struct list_head *next,*prev; };