链表简介

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

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

Linux内核链表是双向循环链表,提供一套统一的链表和操作函数。内核链表的节点由数据和指针两部分组成,不同的是指针不指向下一个节点的数据部分,而是指向下一个节点的指针部分。

内核链表的结构

struct list_head{

struct list_head *next, *prev;

};

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

内核链表的函数

头文件<linux/list.h>

INIT_LIST_HEAD:创建链表

list_add:在链表头插入节点

list_ad_tail:在链表尾插入节点

list_del:删除节点

list_entry:取出节点

list_for_each:遍历链表

list_entry(ptr, type, member)

ptr:链表结点指针

type:链表结点

member:链表结点的指针名

实现方法是通过链表结点(type)减去链表结点的指针名(member)算出结点头部距离结点指针的偏移,然后让链表结点指针(ptr)指针指向链表结点头部。

list.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/list.h> //类型定义
typedef struct student{
int numb; //学生学号
int engl; //英语成绩
int math; //数学成绩
struct list_head node; //链表结点
}STUDENT; //加载函数
static int list_init(){
//创建链表
struct list_head student_head; INIT_LIST_HEAD(&student_head); //添加结点
STUDENT stu1, stu2, stu3; stu1.numb = ;
stu1.engl = ;
stu1.math = ;
list_add_tail(&(stu1.node), &student_head); stu2.numb = ;
stu2.engl = ;
stu2.math = ;
list_add_tail(&(stu2.node), &student_head); stu3.numb = ;
stu3.engl = ;
stu3.math = ;
list_add_tail(&(stu3.node), &student_head); //遍历结点
struct list_head *pos;
STUDENT *temp; list_for_each(pos, &student_head){
temp = list_entry(pos, STUDENT, node);
printk("No.%d, English is %d, Math is %d\n", temp->numb, temp->engl, temp->math);
} //删除结点
list_del(&(stu1.node));
list_del(&(stu2.node));
list_del(&(stu3.node)); return ;
} //卸载函数
static void list_exit(){ } //模块信息声明
MODULE_LICENSE("GPL");
MODULE_AUTHOR("D");
MODULE_DESCRIPTION("list");
MODULE_VERSION("v1.0"); //模块函数声明
module_init(list_init);
module_exit(list_exit);

Makefile

obj-m := list.o
KDIR := /space/work/guoqian/liunxkernel//kernel/linux-mini2440 all :
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux- clean :
@rm -f *.o *.ko *.mod.* *.order *.symvers

内核链表代码不涉及到任何内核调用,可以直接移植到应用程序中使用。

[国嵌攻略][108][Linux内核链表]的更多相关文章

  1. [国嵌攻略][098][Linux内核简介]

    Linux系统架构 1.用户空间:应用程序.C函数库 2.内核空间:系统调用接口.内核.体系结构相关代码 Linux系统利用处理器不同的工作模式,使用其中的两个级别分别来运行Linux内核与应用程序, ...

  2. [国嵌攻略][099][Linux内核配置与编译]

    为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make m ...

  3. [国嵌攻略][107][Linux进程管理子系统]

    进程与程序 1.程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体. 2.进程:是一个执行中的程序,它是一个动态的实体. 进程四要素 1.有一段程序供其执行.这段程序不一定是某个进程所 ...

  4. [国嵌攻略][103][Linux内核模块基础]

    什么是内核模块 Linux内核的整体结构非常庞大,其中包含的组件也非常多,如何使用这些组件.一种方式是把所有的组件都编译进内核文件,即zImage或bzImage,但这样会导致一个问题,占用内存过多. ...

  5. [国嵌攻略][119][Linux中断处理程序设计]

    裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的 ...

  6. [国嵌攻略][106][Linux内存管理子系统]

    内存管理子系统 1.虚拟地址与物理地址的映射 2.物理内存的分配 Linux虚拟地址空间分布 设备最后访问的一定是物理地址,但Linux系统中使用的都是虚拟地址.虚拟地址简单的来说就是程序中使用的地址 ...

  7. [国嵌攻略][104][Linux内核模块设计]

    内核模块示例 #inlcude <linux/init.h> #inlcude <linux/module.h> static int hello_init(){ printk ...

  8. [国嵌攻略][070-095][Linux编程函数手册]

    第1类 时间编程类 1.1 获取日历时间 1.1.1 函数名 time 1.1.2 函数原形 time_t time(time_t *t) 1.1.3 函数功能 返回日历时间 1.1.4 所属头文件 ...

  9. [国嵌攻略][109][Linux系统调用]

    系统调用 函数实现体在内核空间,提供给应用程序来使用,就是一个系统调用. 工作流程 1.通过软中断(swi)从用户空间切换到内核空间.entry-common.S中的ENTRY(vector_swi) ...

随机推荐

  1. UWP Windows历史上最漂亮的UWP框架出炉!!!

    UWP Windows历史上最漂亮的UWP框架出炉!!! 本框架基于微软的开源项目WTS开发,并在其基础上增加了FDS(流畅设计元素,高光.亚克力等).多语言系统.沉浸式体验(扩展内容到标题栏) 同时 ...

  2. 安装MySQL容易出现的问题

    mysql 安装到最后一步时,start service 为失败状态. 解决方法: 方 式1  MySQL安装是出现could not start the service mysql error:0 ...

  3. 例子:韩顺平JavaScript----JS乌龟抓小鸡游戏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. android之monkey测试

    本文同时发表于本人个人网站 www.yaoxiaowen.com monkey测试算是android自动化测试当中最简单的一种工具了.虽然简单,不过对于测试app的稳定健壮,减少崩溃还是比较有用的.所 ...

  5. 判断python对象是否可调用的三种方式及其区别

    查找资料,基本上判断python对象是否为可调用的函数,有三种方法 使用内置的callable函数 callable(func) 用于检查对象是否可调用,返回True也可能调用失败,但是返回False ...

  6. 小白的Python之路 day5 time,datatime模块详解

    一.模块的分类 可以分成三大类: 1.标准库 2.开源模块 3.自定义模块 二.标准库模块详解 1.time与datetime 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时 ...

  7. MySQL事务-ROLLBACK,COMMIT用法详解

    使用ROLLBACK 既然我们已经知道了什么是事务处理,下面讨论事务处理的管理中所涉及的问题. 管理事务处理的关键在于将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退. MySQ ...

  8. Standard PHP Library(SPL)中的数据结构

    SPL提供了一组标准数据结构. SplDoublyLinkedList Class:双向链表(DLL)是在两个方向上相互链接的节点列表.当底层结构是dll时,迭代器的操作.对两端的访问.节点的添加或删 ...

  9. [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等

    本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...

  10. Mac 安装python ,anaconda。彻底卸载anaconda的方法

    To uninstall Anaconda open a terminal window and remove the entire anaconda install directory: rm -r ...