10、内核链表的学习

10、内核链表的学习

10、内核链表的学习

10、内核链表的学习

10、内核链表的学习

 

10、内核链表的学习

首先是创建内核模块。

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

10、内核链表的学习

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

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

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

添加节点函数结构:

10、内核链表的学习

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

10、内核链表的学习

上面看到list_for_each是一个宏。

10、内核链表的学习

List_entry调用container_of()函数:

10、内核链表的学习

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

10、内核链表的学习

 

10、内核链表的学习

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

10、内核链表的学习

 

10、内核链表的学习

 

10、内核链表的学习

List_add;

10、内核链表的学习

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

10、内核链表的学习

 

 

Mylist.c的代码:

10、内核链表的学习

10、内核链表的学习

Makefile的代码:

10、内核链表的学习

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

10、内核链表的学习

Insmod mylist.ko出现的错误:

10、内核链表的学习

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

换成6410的出现下面问题:

10、内核链表的学习

10、内核链表的学习

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

10、内核链表的学习

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

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

10、内核链表的学习

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

10、内核链表的学习

 

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

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

 

 

相关文章:

  • 2022-12-23
  • 2021-11-16
  • 2021-09-30
  • 2022-12-23
  • 2022-02-12
  • 2022-01-18
  • 2021-09-17
猜你喜欢
  • 2022-12-23
  • 2022-03-06
  • 2021-10-08
  • 2022-01-02
  • 2021-11-17
  • 2021-09-12
  • 2021-12-10
相关资源
相似解决方案