[国嵌攻略][108][Linux内核链表]
链表简介
链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据。链表的开销主要是访问的顺序性和组织链的空间损失。
传统链表与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内核链表]的更多相关文章
- [国嵌攻略][098][Linux内核简介]
Linux系统架构 1.用户空间:应用程序.C函数库 2.内核空间:系统调用接口.内核.体系结构相关代码 Linux系统利用处理器不同的工作模式,使用其中的两个级别分别来运行Linux内核与应用程序, ...
- [国嵌攻略][099][Linux内核配置与编译]
为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make m ...
- [国嵌攻略][107][Linux进程管理子系统]
进程与程序 1.程序:存放在磁盘上的一系列代码和数据的可执行映像,是一个静止的实体. 2.进程:是一个执行中的程序,它是一个动态的实体. 进程四要素 1.有一段程序供其执行.这段程序不一定是某个进程所 ...
- [国嵌攻略][103][Linux内核模块基础]
什么是内核模块 Linux内核的整体结构非常庞大,其中包含的组件也非常多,如何使用这些组件.一种方式是把所有的组件都编译进内核文件,即zImage或bzImage,但这样会导致一个问题,占用内存过多. ...
- [国嵌攻略][119][Linux中断处理程序设计]
裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的 ...
- [国嵌攻略][106][Linux内存管理子系统]
内存管理子系统 1.虚拟地址与物理地址的映射 2.物理内存的分配 Linux虚拟地址空间分布 设备最后访问的一定是物理地址,但Linux系统中使用的都是虚拟地址.虚拟地址简单的来说就是程序中使用的地址 ...
- [国嵌攻略][104][Linux内核模块设计]
内核模块示例 #inlcude <linux/init.h> #inlcude <linux/module.h> static int hello_init(){ printk ...
- [国嵌攻略][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 所属头文件 ...
- [国嵌攻略][109][Linux系统调用]
系统调用 函数实现体在内核空间,提供给应用程序来使用,就是一个系统调用. 工作流程 1.通过软中断(swi)从用户空间切换到内核空间.entry-common.S中的ENTRY(vector_swi) ...
随机推荐
- c#访问oracle数据库
想在c#中访问oracle数据库,毕竟是开发,想要轻量级访问oracle,客户机上无需安装oracle环境就能正常运行程序. 在网上找了相关资料,只需要引用一个dll即可实现. 访问代码(需引用dll ...
- Android基础夯实--你了解Handler有多少?
概述 对于刚入门的同学来说,往往都会对Handler比较迷茫,到底Handler是个什么样的东西.当然,可能对于一些有工作经验的工程师来说,他们也不一定能很准确地描述,我们来看下API的介绍. Han ...
- thinkphp3.2.3使用ajax 的一些坑——使用AjaxReturn()后,直接返回null,模板文件不起作用
从接触thinkphp到今天,填完此坑,必有其他的坑有会冒出来.哎!这个填坑之路我想是没有尽头的了. 最近,需要使用ajax完成一些操作,一开始想Ajax简单啊,不过是一种提交数据的方式,不过是害苦了 ...
- (转)mysql 无法设置外键的原因总结
在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1. 两个字段的类型或者大小不严格匹配.例如,如果一个 ...
- 正则表达过滤表单隐藏元素,组装post数据
<form name="form1" action="'.$serverUrl.'" method="post" > <i ...
- NOI 2008 假面舞会
题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号 ...
- Python学习_02_数字和运算
python具有强大的科学运算功能,python由于支持更加强大的面向对象和动态特性,相比R语言.matlab.mathmatic等传统的科学计算工具具有非常大的优势. Python的数字 pytho ...
- Java Web高级编程(四)
WebSocket 一.WebSocket的产生 用户希望Web页面可以进行交互,用于解决这个问题的技术是JavaScript,现在Web上有许多的可用的JavaScript框架,在使用极少的Java ...
- SQL SERVER 审核
USE master CREATE SERVER AUDIT audit1 TO FILE (FILEPATH='E:\SQLAudit') USE TEST CREATE DATABASE AUD ...
- angular4.0配置同时使用localhost和本机IP访问项目
之前写过<angular4.0配置本机IP访问项目>的文章,今天再次更新一个,谢谢大家的指正. 今天的目的是:使用本机IP地址,或者localhost都可以访问项目. 第一步:找到此文件& ...