【问题标题】:Can I use Linux kernel linked list outside kernel code?我可以在内核代码之外使用 Linux 内核链表吗?
【发布时间】:2017-01-17 04:03:42
【问题描述】:

我想在内核代码的某些部分使用内核链表之前先使用它。但是如果我只包含list.h,由于依赖关系,它不起作用。

如何使用single.c 文件中的列表编写代码,例如test.c 这样我就可以通过编译test.c来测试我的代码?期待很快收到您的来信。

另外,如何使用嵌套链表?

【问题讨论】:

    标签: linux list kernel


    【解决方案1】:

    您可以从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

    【讨论】:

      【解决方案2】:

      它并不打算在用户空间中使用列表,因为它是为内核内部使用而设计的,并且具有内核类型等的多个依赖项。您可以通过使用正确的包含路径编译代码来看到这一点:

      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 中有包含与用户空间包含 (stdlib.h) 冲突的包含,因此无法编译。

      然而,像列表这样的数据结构的依赖关系非常小。您需要对它们进行排序以打破 list.h 与其他内核的依赖关系。在一个简短的测试中,我从 list.h 中删除了包含,并添加了数据类型 struct list_head/hlist_head 和 hlist_node。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多