Linux内核中链表的实现与应用【转】
转自:http://blog.chinaunix.net/uid-27037833-id-3237153.html
链表(循环双向链表)是Linux内核中最简单、最常用的一种数据结构。
点击(此处)折叠或打开
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/slab.h>
- #include <linux/list.h>
- MODULE_LICENCE("GPL");
- MODULE_AUTHOR("LUOTAIJIA");
- #define N 10
- struct numlist {
- int num;
- struct list_head list;
- };
- struct numlist numhead;
- static int __init doublelist_init(void)
- {
- //初始化头结点
- struct numlist * listnode; //每次申请链表结点时所用的指针
- struct list_head * pos;
- struct numlist * p;
- int i;
- printk("doublelist is starting...\n");
- INIT_LIST_HEAD(&numhead.list);
- /*
- * static inline void INIT_LIST_HEAD(struct list_head *list)
- * {
- * list->next = list;
- * list->prev = list;
- * }
- */
- //建立N个结点,依次加入到链表当中
- for (i=0; i<N; i++) {
- listnode = (struct numlist *)kmalloc(sizeof(struct numlist), GFP_KERNEL);
- //void *kmalloc(size_t size, int flages)
- //分配内存,size 要分配内存大小,flags 内存类型
- listnode->num = i+1;
- list_add_tail(&listnode->list, &numhead.list);
- printk("Node %d has added to the doublelist...\n", i+1);
- }
- //遍历链表
- i = 1;
- list_for_each(pos, &numhead.list) {
- p = list_entry(pos, struct numlist, list);
- printk("Node %d's data: %d\n", i, p->num);
- i++;
- }
- return 0;
- }
- static void __exit doublelist_exit(void)
- {
- struct list_head *pos, *n;
- struct numlist *p;
- int i;
- //依次删除N个结点
- i = 1;
- list_for_each_safe(pos, n, &numhead.list) {
- //为了安全删除结点而进行的遍历
- list_del(pos); //从链表中删除当前结点
- p = list_entry(pos, struct numlist, llist);
- //得到当前数据结点的首地址,即指针
- kfree(p); //释放该数据结点所占空间
- printk("Node %d has removed from the doublelist...\n", i++);
- }
- printk("doublelist is exiting...\n");
- }
- module_init(doublelist_init);
- module_exit(doublelist_exit);
Linux内核中链表的实现与应用【转】的更多相关文章
- linux内核中链表代码分析---list.h头文件分析(一)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...
- linux内核中链表代码分析---list.h头文件分析(二)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...
- Linux内核中链表实现
关于双链表实现,一般教科书上定义一个双向链表节点的方法如下: struct list_node{ stuct list_node *pre; stuct list_node *next; ElemTy ...
- Linux内核中链表的学习
一.自己学习链表 数组的缺点:(1)数据类型一致:(2)数组的长度事先定好,不能灵活更改. 从而引入了链表来解决数组的这些缺点:(1)结构体解决多数据类型(2)链表的组合使得链表的长度可以灵活设置. ...
- Linux内核【链表】整理笔记(1)
我们都知道Linux内核里的双向链表和学校里教给我们的那种数据结构还是些不一样.Linux采用了一种更通用的设计,将链表以及其相关操作函数从数据本身进行剥离,这样我们在使用链表的时候就不用自己去实现诸 ...
- Linux内核中双向链表的经典实现
概要 前面一章"介绍双向链表并给出了C/C++/Java三种实现",本章继续对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法.其中,也会涉及到Linux内核 ...
- Linux内核中的GPIO系统之(3):pin controller driver代码分析
一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...
- Linux内核中流量控制
linux内核中提供了流量控制的相关处理功能,相关代码在net/sched目录下:而应用层上的控制是通过iproute2软件包中的tc来实现, tc和sched的关系就好象iptables和netfi ...
- Linux内核中SPI/I2c子系统剖析
Linux内核中,SPI和I2C两个子系统的软件架构是一致的,且Linux内核的驱动模型都以bus,driver,device三种抽象对象为基本元素构建起来.下文的分析将主要用这三种抽象对象的创建过程 ...
随机推荐
- Abp的AspNetZero5.0版本无法使用ctrl+f5调式
AspNetZero是基于Abp框架开发的商业程序,最近从Abp交流群中得知5.0版本开始加入了防盗版的功能,在vs中也无法使用ctrl+f5进行调试.经过两天的摸索,我发现不能进行调试的原因也是因为 ...
- 第三方框架-纯代码布局:Masonry的简单使用
Masonry是一个对系统NSLayoutConstraint进行封装的第三方自动布局框架,采用链式编程的方式提供给开发者API.系统AutoLayout支持的操作,Masonry都支持,相比系统AP ...
- IO模式
二 IO模式 刚才说了,对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间.所以说,当一个read操作发生时,它会经历两 ...
- Android 4.0源码结构
Android 4.0 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等 ...
- [洛谷P2408]不同子串个数
题目大意:给你一个字符串,求其中本质不同的字串的个数 题解:同[洛谷P4070][SDOI2016]生成魔咒,只要最后再输出就行了 卡点:无 C++ Code: #include <cstdio ...
- BZOJ3076 & 洛谷3081:[USACO2013 MAR]Hill Walk 山走——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3076 https://www.luogu.org/problemnew/show/P3081#sub ...
- BZOJ4896 [Thu Summer Camp2016]补退选 【trie树】
题目链接 BZOJ4896 题解 \(thu\)怎么那么喜欢出\(trie\)树的题... 我们当然可以按题意模拟建\(trie\) 询问的时候,由于存在删除操作,不满足单调性,不能直接二分答案 我们 ...
- nowcoder OI 周赛 最后的晚餐(dinner) 解题报告
最后的晚餐(dinner) 链接: https://www.nowcoder.com/acm/contest/219/B 来源:牛客网 题目描述 \(\tt{**YZ}\)(已被和谐)的食堂实在是太挤 ...
- ywy_c_asm题
未知出处 题意: 定义一个无穷长的数列,满足以下性质:$1.X_{2n}=-{X_{n}}$ $2.X_{2n}=(-1)^{(n+1)}*X_{n}$ $3.X_{2n-1}=(-1)^{(n+1) ...
- String类的用法
练习如何创建一个类. package create; public class Newstring { String aa; public Newstring() { // TODO Auto-gen ...