我可以帮您翻译成中文:我能在内核代码之外使用 Linux 内核链表吗?

5
我想在使用内核代码的某些部分之前,先玩一下内核链表。但是,如果我只包含 list.h,由于依赖关系,它无法正常工作。
如何在一个 single.c 文件(例如 test.c)中编写使用链表的代码,以便我可以通过编译 test.c 来测试我的代码?期待尽快收到您的回复。
此外,如何使用嵌套链表?
2个回答

6
你可以从http://www.mcs.anl.gov/~kazutomo/list/list.h获取一个用户空间端口。
它的意思是:

这里有一个为用户空间程序准备的list.h文件制作方法:

  1. 从linux/include/list.h复制list.h文件。
  2. 删除
    • #ifdef KERNE和它的# endif
    • 所有的#include行
    • prefetch()和与rcu相关的函数
  3. 添加宏offsetof()和container_of

4

这个列表不是为用户空间设计的,因为它是为内核使用而制作的,并且有几个内核类型等依赖项。您可以通过正确的包含路径编译代码来查看此信息:

gcc -I path-to-kernel-src/include/ test.c

当test.c文件包含以下代码时:
#include <stdio.h>
#include <stdlib.h>

#include <linux/list.h>

int main(int argc, char **argv) { }

由于list.h中包含与用户空间include(stdlib.h)冲突的内容,因此编译失败。

然而,像list这样的数据结构的依赖性非常小。您需要对它们进行排序,以便从其他内核中断开list.h的依赖关系。在短暂的测试中,我删除了list.h中的includes,并添加了数据类型struct list_head / hlist_head和hlist_node。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接