Linux内核驱动学习(六)----内核链表
来源:互联网 发布:prisma 离线 知乎 编辑:程序博客网 时间:2024/04/30 02:26
Linux内核驱动学习(六)----内核链表
http://blog.csdn.net/u011467781/article/details/44106229
回顾链表的概念
Linux内核链表:双向循环链表。
内核链表的设计思想:实现尽可能的代码重用可以使大量的链表设计为单个链表。
内核链表的结构
(代码位于include/linux/list.h中):
list_head 结构包含两个指向list_head结构的指针 prev 和 next,由此可见内核的链表具有双链表的功能,实际上,通常它都组织成双向循环链表,这样其能达到的效率最高。
注:
1>以上链表不含数据域,可以嵌入到任何结构中--->这样可以不考虑包含list_head指针的对象结构,进而不需要重写链表的基本操作函数
2>一个结构体中可以含有多个list域--->这样就可以将一个链表挂载到多个不同链表中,例:Linux内核会将进程数据结构(task_struct)同时挂载到任务链表、优先级链表上去。范例:
如何构造内核链表?
在特定对象的的结构中定义一个list_head(只含指针域的结构),通过这个成员将特定的对象连接起来,形成列表,然后通过通用链表函数对其进行插入、删除等操作。。
操作内核链表的函数:
1、INIT_LIST_HEAD:创建/初始化链表---在Linux内核中查找其原型
2、list_add: 在链表头插入节点。
3、list_add_tail : 链表尾插入节点
4、list_del:删除节点
5、list_entry:取出节点
6、list_for_each: 遍历链表
在/linux/list.h查找以下函数,分析其如何实现?
1、INIT_LIST_HEAD:创建/初始化链表---在Linux内核中查找其原型
使list_head链表的前驱和后继都指向其自身。进而初始化
2、list_add: 在链表头插入节点。
追踪 __list_add(new, head, head->next);
3、list_add_tail : 链表尾插入节点
4、list_del:删除节点
list_del()函数将删除后的prev\next指针分别设为LIST_POISON1、LIST_POISON2
两个特殊值,是为了保证不在链表中的节点项不可访问,对以上两值的访问将引起页面故障
5、list_entry:取出节点,返回指向包含指针域的外部结构的指针
6、liast_for_each: 遍历链表---利用source insight 查找其相关用法
可以看做是一个for循环,游标从由head指向的表头节点开始,直到pos到达节点指针head结束。
参考用法。
主要方法为参考Linux内核代码,学习对应函数的用法,以实现整个链表。
部分参考博客:http://blog.csdn.net/houxn22/article/details/30223441
部分参考博客:http://blog.csdn.net/tigerjibo/article/details/8299599#t22
0 0
- Linux内核驱动学习(六)----内核链表
- Linux内核驱动学习(六)----内核链表
- linux驱动内核学习
- Linux内核驱动学习
- Linux内核与驱动开发学习总结:原子操作实现(六)
- Linux内核驱动模块(转载学习)
- Linux驱动学习——内核链表
- 嵌入式学习-驱动开发前奏-lesson3-linux内核链表
- Linux内核,驱动学习博客
- linux内核学习:内核链表
- 内核驱动开发第四天linux内核链表
- Linux内核分析(六)
- Linux内核分析(六)
- (六)Linux内核分析
- 《Linux内核设计与实现》读书笔记(六)- 内核数据结构之链表与队列
- linux驱动开发--内核链表
- linux驱动开发--内核链表
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】详解Linux内核之双向循环链表
- 基于HALCON的模板匹配方法总结
- 在Mac进行Java开发的环境准备
- PHP 正则(2)
- 解决 Linux 安装 Mysql 出现的 configure: error: No curses/termcap library found
- Python datetime 格式化字符串:strftime()
- Linux内核驱动学习(六)----内核链表
- 【C++学习】成员函数重载
- Linux下x86_64进程地址空间布局
- IOS-UITextField功能方法详解
- 如何写好软文标题的经验
- 爱他撒大声的的撒打人大飒
- Linux内核驱动学习(五)----进程管理子系统
- 啊是的范德萨发士大夫身份萨达萨达
- 产品经理之路——被窝里的思考