linux 内核链表移植笔记
1、从网上现在 linux kernel 代码
- linux 内核版本有两种:稳定版(次版本为偶数) 和开发版(次版本为奇数)
版本号:主版本.次版本.释出版本-修改版本
内核下载连接网站:https://www.kernel.org/
下载内核版本:4.19.144 大小:98.64MB
内核代码查看使用软件:Source Insight 4.0
Winddow软件平台:VS2019
2、关键文件
要进行移植的文件路径:/linux-4.19.144/include/list.h
list.h 文件里面定义了几个头文件,虽然这些定义的文件于 list.h 什么关系还不清楚,但可以一个一个清除跟他们之间的关系。换句话说,要从这些定义头文件里面复制相关代码出来,并加以修改。
#include <linux/types.h>
#include <linux/stddef.h>
#include <linux/poison.h>
#include <linux/const.h>
#include <linux/kernel.h>
3、修改 list.h 头文件
【1】/include/linux/types.h 文件中找到有关链表的相关定义,代码拷贝下来
struct list_head {
struct list_head* next, * prev;
};
struct hlist_head {
struct hlist_node* first;
};
struct hlist_node {
struct hlist_node* next, ** pprev;
};
【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
#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 |
主要还是复制过来的代码出现问题,慢慢分解这个代码修改前:
#define WRITE_ONCE(var, val) \
(*((volatile typeof(val) *)(&(var))) = (val))
#define READ_ONCE(var) (*((volatile typeof(var) *)(&(var))))
C++ 不支持typeof() 这个东西,没办法获取自变量类型,改用 delctype() 来获取就可以了。
代码修改后:
#define WRITE_ONCE(var, val) \
(*((volatile decltype(val) *)(&(var))) = (val))
#define READ_ONCE(var) (*((volatile decltype(var) *)(&(var))))
【7】C++ 编译器不支持 ({}) 形式 ,这个要修改 , 然后为防止重复 offsetof 重复用宏定义,offsetof 改为 offsetof2;
代码修改后:
#define offsetof2(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) \
(type *)( (char *)(ptr) - offsetof2(type,member))
4、移植代码文件
按照上面进行操作的话,一般也能完成移植。
文件名称:linux 内核移植链表头文件. h
链接:https://download.csdn.net/download/qq_36883460/12308680
5、移植完成后应用测试代码验证
#include "list.h"
#include <iostream>
using namespace std;
struct student
{
char name[60];
int id;
struct list_head list;
};
int main(void)
{
struct student *q;
struct student *p;
struct student A = { "Jack" ,1, LIST_HEAD_INIT(A.list) };
struct student B = { "Pink" ,2, LIST_HEAD_INIT(B.list) };
list_add(&B.list, &A.list);
q = container_of(&A.list, struct student , list);
p = container_of(q->list.next, struct student , list);
cout<<"name: "<<p->name<<endl;
cout <<"id :"<< p->id << endl;
p = container_of(q->list.next->next, struct student, list);
cout << "name: " << p->name << endl;
cout << "id :" << p->id << endl;
p = container_of(q->list.next->next->next, struct student, list);
cout << "name: " << p->name << endl;
cout << "id :" << p->id << endl;
return 0;
}
上面代码运行效果如下图所示。