【问题标题】:How to include an arbitrary kernel header file in a module?如何在模块中包含任意内核头文件?
【发布时间】:2020-10-27 13:44:05
【问题描述】:

情况

我正在编写一个用于学习目的的内核模块,并希望使用here 定义的sched_class_highest 和for_each_class。

我看到如果我想在文件/include/linux/sched.h 中使用符号,我会#include <linux/sched.h>。所以以同样的方式,由于我现在要添加的文件位于位置/kernel/sched/sched.h,所以我尝试:#include:

  • 第一次尝试:<kernel/sched.h>
  • 第二次尝试:<kernel/sched/sched.h>
  • 第三次尝试:<../kernel/sched/sched.h> - 只是从this question 的评论中复制粘贴

这些都不起作用,都给了我错误没有这样的文件或目录。

我对 C 不是很熟悉,只是想学习内核和学习 C。

这是我的 Makefile。我知道有关 Makefile 目标的基础知识,但不了解编译过程或它需要哪些文件来提供它...

MODULE_FILENAME=my-schedule

obj-m +=  $(MODULE_FILENAME).o
KO_FILE=$(MODULE_FILENAME).ko

export KROOT=/lib/modules/$(shell uname -r)/build

modules:
        @$(MAKE) -C $(KROOT) M=$(PWD) modules

modules_install:
        @$(MAKE) -C $(KROOT) M=$(PWD) modules_install

clean: 
        @$(MAKE) -C $(KROOT) M=$(PWD) clean
        rm -rf   Module.symvers modules.order

insert: modules
        sudo insmod $(KO_FILE)
        sudo dmesg -c

remove:
        sudo rmmod $(MODULE_FILENAME)
        sudo dmesg -c

printlog:
        sudo dmesg -c 
        sudo insmod $(KO_FILE)
        dmesg

问题

  1. 如何在内核模块中引用这 2 个符号?
  2. 这些符号是否应该由标准模块直接引用?如果有,标准的做法是什么?
  3. Makefile 是否与如何将内核代码中的文件导入模块有关?

【问题讨论】:

  • 你应该提到你需要 linux 模块,而不是 bsd 一个
  • @АлексейНеудачин 它被标记为 linux-kernel 是有原因的。

标签: c linux makefile linux-kernel


【解决方案1】:

如何在我的内核模块中引用这两个符号?

您不应该在“普通”内核模块中需要它们。如果你真的这样做,请在你的模块中重新定义它们。

这些符号是否应该被标准模块直接引用?

他们不是,那个特定的sched.h 文件应该只被调度程序代码使用(kernel/sched 中的文件)。这就是它不被导出的原因(即不在include 目录中)。你不会在你的 headers 文件夹中找到它们 (/lib/modules/.../build)。

Makefile 是否与如何将内核代码中的文件导入模块有关?

不确定这究竟意味着什么...如果您想知道是否有某种方法可以配置您的 Makefile 以便可以包含该文件,那么没有。如果您使用/lib/modules 中的内核导出的内核头文件进行构建(当您使用$(MAKE) -C $(KROOT) 将控制权交给内核的Makefile 时,您正在执行此操作),那么该文件根本不存在。

【讨论】:

  • 谢谢。你能帮我解决后续问题吗:1)我不确定你重新定义它们是什么意思。您是否建议我自己提供这些功能的逻辑?我真的不想这样做,因为我正在研究内核必须提供的功能。本质上,我想查看每个 sched 类并查看其任务列表。但是,我对如何重写for_each_class 使其提供与内核版本相同的功能感兴趣。 2) 那我可以在我的模块中直接包含哪些内核代码文件?是否仅限于 /include 目录中的那些?
  • 3) Unsure what this means really... if you want to know if there is some way to configure your Makefile... 我想知道是否有任何方法可以编写一个允许我包含这些文件的 Makefile。
  • 1) 重新定义如下:直接将它们复制粘贴到您的模块中,这就是您“重写”这些的方式 2) 您只能包含 include 目录下的那些 3) 没有没办法,正如我所说,文件根本不存在。内核不会将其导出以供模块使用。
  • 有很多,一个经典的例子是/arch/<SOMEARCH>/include,这是include 具有特定架构头文件的目录。尽管如此,#include 可以直接使用其中的所有文件,因为内核 Makefile 专门告诉编译器使用 -I<path> 选项查看所有这些目录,因此您通常不必担心。跨度>
  • @TranTriet 是的,没错。 Here's an example。当然,对于arch 下的文件,您将只能#include 那些与您正在编译的架构相匹配的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2023-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多