linux 内核链表移植笔记

1、从网上现在 linux kernel 代码

  • linux 内核版本有两种:稳定版(次版本为偶数) 和开发版(次版本为奇数)
  1. 版本号:主版本.次版本.释出版本-修改版本
  2. 内核下载连接网站:https://www.kernel.org/
  3. 下载内核版本:4.19.144 大小:98.64MB
  4. 内核代码查看使用软件:Source Insight 4.0
  5. Winddow软件平台:VS2019

2、关键文件

要进行移植的文件路径:/linux-4.19.144/include/list.h
list.h 文件里面定义了几个头文件,虽然这些定义的文件于 list.h 什么关系还不清楚,但可以一个一个清除跟他们之间的关系。换句话说,要从这些定义头文件里面复制相关代码出来,并加以修改。

  1. #include <linux/types.h>
  2. #include <linux/stddef.h>
  3. #include <linux/poison.h>
  4. #include <linux/const.h>
  5. #include <linux/kernel.h>

3、修改 list.h 头文件

【1】/include/linux/types.h 文件中找到有关链表的相关定义,代码拷贝下来

  1. struct list_head {
  2. struct list_head* next, * prev;
  3. };
  4. struct hlist_head {
  5. struct hlist_node* first;
  6. };
  7. struct hlist_node {
  8. struct hlist_node* next, ** pprev;
  9. };

【2】list.h 中不需要调试链表,所以删除了预编译定义 #ifdef CONFIG_DEBUG_LIST#else 里面相关代码,只保留了 #else#endif 里面代码。
【3】如果用 C++ 语言编写,new 会成为关键字,修改成 newStruct
【4】list.h 中的宏定义 WRITE_ONCE 它的定义路径在
/tool/virtio/linux/compiler.h
【5】进行第一次编译。。。发生了未定义 NULL,在此出引用 Windows.h 头文件,用这个头文件的原因是我在 Windows10 平台下写的代码,应当遵循这个平台下的文件代码(有兼容作用)。
它里面是这样定义,当然也可以自己手动这样定义 NULL

  1. #define NULL 0

【6】第二次编译还是出现了大量的报错问题,一共三种报错,如下。

严重性 代码 说明 项目 文件 禁止显示状态
错误 C3861 “typeof”: 找不到标识符 list E:\VS\list\list.h 53
警告 C4197 “volatile int”: 忽略强制转换中的顶级 volatile 变量 list E:\VS\list\list.h 53
错误 (活动) E0260 缺少显式类型 (假定 “int”) list E:\VS\list\list.h 53

主要还是复制过来的代码出现问题,慢慢分解这个代码修改前

  1. #define WRITE_ONCE(var, val) \
  2. (*((volatile typeof(val) *)(&(var))) = (val))
  3. #define READ_ONCE(var) (*((volatile typeof(var) *)(&(var))))

C++ 不支持typeof() 这个东西,没办法获取自变量类型,改用 delctype() 来获取就可以了。

代码修改后

  1. #define WRITE_ONCE(var, val) \
  2. (*((volatile decltype(val) *)(&(var))) = (val))
  3. #define READ_ONCE(var) (*((volatile decltype(var) *)(&(var))))

【7】C++ 编译器不支持 ({}) 形式 ,这个要修改 , 然后为防止重复 offsetof 重复用宏定义,offsetof 改为 offsetof2;
代码修改后:

  1. #define offsetof2(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
  2. #define container_of(ptr, type, member) \
  3. (type *)( (char *)(ptr) - offsetof2(type,member))

4、移植代码文件

按照上面进行操作的话,一般也能完成移植。

文件名称:linux 内核移植链表头文件. h
链接:https://download.csdn.net/download/qq_36883460/12308680

5、移植完成后应用测试代码验证

  1. #include "list.h"
  2. #include <iostream>
  3. using namespace std;
  4. struct student
  5. {
  6. char name[60];
  7. int id;
  8. struct list_head list;
  9. };
  10. int main(void)
  11. {
  12. struct student *q;
  13. struct student *p;
  14. struct student A = { "Jack" ,1, LIST_HEAD_INIT(A.list) };
  15. struct student B = { "Pink" ,2, LIST_HEAD_INIT(B.list) };
  16. list_add(&B.list, &A.list);
  17. q = container_of(&A.list, struct student , list);
  18. p = container_of(q->list.next, struct student , list);
  19. cout<<"name: "<<p->name<<endl;
  20. cout <<"id :"<< p->id << endl;
  21. p = container_of(q->list.next->next, struct student, list);
  22. cout << "name: " << p->name << endl;
  23. cout << "id :" << p->id << endl;
  24. p = container_of(q->list.next->next->next, struct student, list);
  25. cout << "name: " << p->name << endl;
  26. cout << "id :" << p->id << endl;
  27. return 0;
  28. }

上面代码运行效果如下图所示。
linux内核链表移植到windows c++笔记 - 图1

其他应用函数查查百度才知道怎么用。
https://blog.csdn.net/qq_36883460/article/details/105330799?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-1-105330799-blog-122267086.pc_relevant_multi_platform_whitelistv3&spm=1001.2101.3001.4242.2&utm_relevant_index=4