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

时间:2020-10-27 13:44:05

标签: c linux makefile linux-kernel

情况

我正在编写用于学习目的的内核模块,并希望使用here定义的sched_class_highestfor_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. 这些符号是否应该由标准模块直接引用?如果是的话,标准的做法是什么?
  3. Makefile是否与如何将内核代码文件导入模块有关?

1 个答案:

答案 0 :(得分:1)

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

您不应该在“常规”内核模块中使用它们。如果确实需要,请在您的模块中重新定义它们。

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

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

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

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