Linux设备驱动工程师之路——内核链表的使用【转】
本文转载自:http://blog.csdn.net/forever_key/article/details/6798685
Linux设备驱动工程师之路——内核链表的使用
K-Style
转载请注明来自于衡阳师范学院08电2 K-Style http://blog.csdn.net/ayangke,QQ:843308498 邮箱:yangkeemail@qq.com
一、重要知识点
1.内核链表和普通链表的区别
内核链表是一个双向链表,但是与普通的双向链表又有所区别。内核链表中的链表元素不与特定类型相关,具有通用性。
我们先来看一幅图

kernel list展示的是内核链表的结构,normallist展示的是普通链表的结构。head是链表头,p1,p2,p3是链表节点。从图中可以看出普通链表的p1的next指针是指向的结构体p2的地址,p2的pre指针指向p1结构体的地址。而内核链表的p1的next指向的是p2结构体中包含pre和next部分的地址,的p2的pre指向的是p1结构体中包含pre和next部分的地址。依此类推,这就是区别。内核结构元素不与特定类型结构相关,任何结构体都可通过内核的添加成为链表中的节点。
2.内核链表的具体操作
链表数据结构的定义
structlist_head
{
struct list_head *next, *prev;
}
初始化链表头
INIT_LIST_HEAD(list_head*head)
插入节点
list_add(structlist_head *new, struct list_head *head)
list_add_tail(structlist_head *new, sturct list_head *head)
第一个函数在head后面插入一个节点
第二个函数在链表尾部插入一个节点
删除节点:
list_del(structlist_head *entry)
提取数据结构:
list_entry(ptr,type, member)
ptr为已知节点指针ptr,type为节点结构体类型,member为节点指针的type结构体中的名字。返回type结构体的指针。
遍历:
list for each(structlist_head *ops, struct list_head *head)
从head开始遍历每个节点,节点指针保存在ops里面。
二、实例
- #include <linux/kernel.h>
 - #include <linux/module.h>
 - #include <linux/init.h>
 - #include <linux/slab.h>
 - #include <linux/list.h>
 - MODULE_LICENSE("GPL");
 - MODULE_AUTHOR("David Xie");
 - MODULE_DESCRIPTION("ListModule");
 - MODULE_ALIAS("List module");
 - struct student
 - {
 - char name[100];
 - int num;
 - struct list_head list;
 - };
 - struct student *pstudent;
 - struct student *tmp_student;
 - struct list_head student_list;
 - struct list_head *pos;
 - int mylist_init()
 - {
 - inti = 0;
 - INIT_LIST_HEAD(&student_list);
 - pstudent= kmalloc(sizeof(struct student)*5,GFP_KERNEL);
 - memset(pstudent,0,sizeof(structstudent)*5);
 - for(i=0;i<5;i++)
 - {
 - sprintf(pstudent[i].name,"Student%d",i+1);
 - pstudent[i].num= i+1;
 - list_add(&(pstudent[i].list), &student_list);
 - }
 - list_for_each(pos,&student_list)
 - {
 - tmp_student= list_entry(pos,struct student,list);
 - printk("<0>student%d name: %s\n",tmp_student->num,tmp_student->name);
 - }
 - return0;
 - }
 - void mylist_exit()
 - {
 - inti ;
 - for(i=0;i<5;i++)
 - {
 - list_del(&(pstudent[i].list));
 - }
 - kfree(pstudent);
 - }
 - module_init(mylist_init);
 - module_exit(mylist_exit);
 
Linux设备驱动工程师之路——内核链表的使用【转】的更多相关文章
- linux设备驱动归纳总结(一)内核的相关基础概念【转】
		
本文转载自:http://blog.chinaunix.net/uid-25014876-id-59413.html linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxx ...
 - 转:Linux设备驱动开发(1):内核基础概念
		
一.linux设备驱动的作用 内核:用于管理软硬件资源,并提供运行环境.如分配4G虚拟空间等. linux设备驱动:是连接硬件和内核之间的桥梁. linux系统按个人理解可按下划分: 应用层:包括PO ...
 - 【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念
		
linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
 - 《Linux设备驱动开发具体解释(第3版)》(即《Linux设备驱动开发具体解释:基于最新的Linux 4.0内核》)网购链接
		
<Linux设备驱动开发具体解释:基于最新的Linux 4.0内核> china-pub spm=a1z10.3-b.w4011-10017777404.30.kvceXB&i ...
 - linux设备驱动归纳总结(七):1.时间管理与内核延时【转】
		
本文转载自:http://blog.chinaunix.net/uid-25014876-id-100005.html linux设备驱动归纳总结(七):1.时间管理与内核延时 xxxxxxxxxxx ...
 - (转载)小白的linux设备驱动归纳总结(一):内核的相关基础概念---学习总结
		
1. 学习总结 小白的博客讲的linux内核驱动这一块的东西比较基础,因此想通过学习他的博客,搭配着看书的方式来学习linux内核和驱动.我会依次更新在学习小白的博客的过程的感悟和体会. 2.1 内核 ...
 - 【Linux开发】linux设备驱动归纳总结(七):1.时间管理与内核延时
		
linux设备驱动归纳总结(七):1.时间管理与内核延时 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
 - 【Linux开发】linux设备驱动归纳总结(七):2.内核定时器
		
linux设备驱动归纳总结(七):2.内核定时器 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
 - linux 设备驱动概述
		
linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer): 主要利用C库函数和 ...
 
随机推荐
- TortoiseGit使用与操作
			
使用 Git命令有时候确实不怎么方便,特别是每次都要输入密码,如果配置 SSH 的方式,又实在是很麻烦.(当然,必须使用 Windows 神器才有方便友好的客户端图形界面啦!!!) 1.克隆项目 打开 ...
 - NSUserDefaults的小封装
			
//保存 -(void)saveToUserDefaults:(NSString*)tosaveedString withKey:(NSString *)tosaveedKey { NSUserDe ...
 - placeholder兼容
			
<!------------placeholder兼容-------------><script type="text/javascript"> $( ...
 - oracle视图V$BH && X$BH的使用列子
			
1创建一个测试表,test,并且插入10000行数据: SQL> create table test (id int); SQL> begin 2 for i in 1 ...
 - Hand 3D Pose Estimation
			
https://cvarlab.icg.tugraz.at/projects/hand_detection/
 - window.open被浏览器拦截的解决方案
			
现象 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,搞得人无比郁闷啊,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截.何况当出现拦截时,很多小白根 ...
 - C# ZedGraph 控件各属性以及示例
			
ZedGraph属性\方法介绍 Copy(Boolean) ->> 将图像复制到剪贴板.DoPageSetup()() ->> 打开打印设置对话框. DoPrint()() - ...
 - 2、JavaScript常用互动方法
			
一.输出内容(document.write) document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用“”括起,直接输出" ...
 - linux的5个查找命令_转
			
转自:http://www.ruanyifeng.com/blog/2009/10/5_ways_to_search_for_files_using_the_terminal.html 在Linux中 ...
 - 第十篇 SQL Server安全行级安全
			
本篇文章是SQL Server安全系列的第十篇,详细内容请参考原文. 不像一些其他industrial-strength数据库服务,SQL Server缺乏一个内置保护个别数据记录的机制,称为行级安全 ...