10、内核链表的学习

首先是创建内核模块。

按照上面的那张图,我们知道,我们创建链是使用INIT_LIST_HEAD这个函数。现在我们来使用source insight查看该函数的结构。

该函数是对我们的链表头进行初始化的。我们把链表头做一个参数传进来之后。我们分别用next和prev指针同时指向他本身。

可以看到,该函数是个内联函数。该函数只有一个参数,是struct list_head类型的指针,他就是我们要初始化的链表头。

所以我们得来创建这个链表头结构。Struct list_head list score_head;

添加节点函数结构:

第一个参数是插入节点的指针域,第二个参数是链表头指针。

上面看到list_for_each是一个宏。

List_entry调用container_of()函数:

首先看到ptr,实际就是list_head的地址。上面的offset就是我们下图的10.偏移地址。

从上面的图和函数知道,我们取指针的起始地址为0,那么他的offset的偏移就是他的地址。就是member的地址。Member是我们调用list_entry的时候,我们要把我们的list_head在score结构中的成员list传进去。

List_add;

他实际上是调用了一个__list_add()函数。

Mylist.c的代码:

Makefile的代码:

接下来make,把生成的.ko驱动文件拷贝到开发板.

Insmod mylist.ko出现的错误:

这说是版本不对,就是我使用的是210的内核。

换成6410的出现下面问题:

加上了之后,插入出现这问题:

这是系统自身有这驱动,因为我是第一次插入驱动。然后,改了名字,重新编译烧写。插入成功。

然后使用dmesg | tail -n 1查看输出的第一行信息。

上面的输出可以判断我们创建内核链表和实现内核链表成功。

这套内核链表都是c实现的。

重点。自己实现一套内核链表。就是把内核里的这套聊表拷贝出来。

时间: 2024-11-20 10:04:09

10、内核链表的学习的相关文章

Linux内核中链表的学习

一.自己学习链表 数组的缺点:(1)数据类型一致:(2)数组的长度事先定好,不能灵活更改. 从而引入了链表来解决数组的这些缺点:(1)结构体解决多数据类型(2)链表的组合使得链表的长度可以灵活设置. 基本概念: 头结点: 这个节点是为了便于管理链表的节点,这个节点并不保存数据:虽然和其他节点一样,但是这个头结点是指向首节点的节点. 首节点: 第一个保存有效数据的节. 尾节点: 最后一个保存有效数据的节点 头指针: 头指针是指向头节点的指针. 单链表: 链表节点的数据结构定义: typedef s

Linux内核链表深度分析【转】

本文转载自:http://blog.csdn.net/coding__madman/article/details/51325646 链表简介: 链表是一种常用的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或者删除数据.链表的开销主要是访问的顺序性和组织链的空间损失. 内核链表的好主要体现为两点,1是可扩展性,2是封装.可扩展性肯定是必须的,内核一直都是在发展中的,所

第十八天:双向链表与内核链表

对于双向链表就是在单向链表的基础上加了一个向前的结构体指针.对于一些操作的思想更加的简单.麻烦的事情就是要判断的内容更多了.因为内核链表中运用到的都是双向链表.所以要学习内核链表.就先要会对双向链表进行基本的操作.比如新增和显示. 内核链表中的实现思想类似与面向对象的思想,成员和方法分开写.比如下面这个简单的代码: 1 #include<stdio.h> 2 3 struct boy; 4 struct file_operations; 5 6 struct boy{ 7 int age;//

内核编译安装学习笔记

前提:查看本地硬件信息常用工具 查看CPU信息: #cat /proc/cpuinfo #x86info #lscpu 查看PCI: #lspci 查看USB: #lsusb 查看块设备: #lsblk 查看综合的设备详细信息: #hal-device 编译:交叉编译 cross-compiling用于在宿主机上编译,应用于别的机器上架构迥异的内核. 编译内核的步骤:(安装好开发环境:Development Tools,Server Platform Development,ncurses-de

Linux 内核链表使用举例

链表数据结构的定义很简洁: struct list_head { struct list_head *next, *prev; }; list_head结构包含两个指向list_head结构的指针prev和next,该内核链表具备双链表功能,通常它都组织成双循环链表,这里的list_head没有数据域.在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表节点.下面是一个简单的内核模块的例子,包含了对链表进行插入.删除.遍历的一些函数: list.c: #include <l

linux内核链表使用

原文链接:http://blog.csdn.net/xnwyd/article/details/7359373 Linux内核链表的核心思想是:在用户自定义的结构A中声明list_head类型的成员p,这样每个结构类型为A的变量a中,都拥有同样的成员p,如下: struct A{ int property; struct list_head p; } 其中,list_head结构类型定义如下: struct list_head { struct list_head *next,*prev; };

内核链表的应用

本文构建了一个双向循环的内核链表,然后对链表进行遍历并打印了数据,最后释放了链表节点.使用到的数据结构和链表操作函数如下: struct list_head                    内核提供的双向循环链表节点的结构体 LIST_HEAD(name)             该宏定义并初始化一个名为name的struct list_head类型节点 INIT_LIST_HEAD(name)    该宏初始化一个由name指向的 struct list_head类型节点,事先需要定义好

linux内核启动过程学习总结

下面是学习linux内核启动过程的记录 平台是:powerpc mpc8548 + linux2.6.23 内核 通用寄存器的作用r0 :在函数开始时使用r1 :存放堆栈指针,相当于ia32架构中的esp寄存器r2 :存放当前进程的描述符的地址r3 :存放第一个参数和返回地址r4-r10 :存放函数的参数r11 :用在指针的调用和当前一些语言的环境指针r12 :用于存放异常处理r13 :保留做为系统线程IDr14-r31 :作为本地变量,具有非易失性 Linux启动过程描述 第一步:使用Boot

内核链表设计

1.编写一个内核模块,在模块中完成内核链表的创建.插入.删除.遍历等操作. 背景知识 1.内核链表实例分析 内核链表最大的特点是它的通用性,不必因为结构体中数据域的不同而单独为操作链表设计一套方法. Linux内核在linux/lish.h文件中定义了内核通用链表list_head类型基本结构: struct list_head {struct list_head *next,*prev;} 内核链表的常用用途是将某一个数据结构本身串成链表,或将某些链表与一个数据结构联系起来,下面通过实例来说明