如何在模块中包含任意内核头文件?

How to include an arbitrary kernel header file in a module?

情况

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

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

None 这些都有效并且都给了我错误 No such file or directory.

我对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. 这些符号应该被标准模块直接引用吗?如果是这样,标准的做法是什么?
  3. Makefile 是否与我如何将内核代码中的文件导入我的模块有关?

How do I reference those 2 symbols in my kernel module?

在“普通”内核模块中您不应该需要这些。如果你真的这样做了,re-define 他们在你的模块中。

Are those symbols supposed to be referenced directly by a standard module?

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

Is the Makefile related to how I can import a file in kernel code into my module?

不确定这到底意味着什么...如果您想知道是否有某种方法可以配置您的 Makefile 以便可以包含该文件,那么没有。如果您正在使用 /lib/modules 中内核导出的内核 headers 进行构建(这就是您使用 $(MAKE) -C $(KROOT) 将控制权移交给内核的 Makefile 时所做的事情),那么该文件就是没有。