[英]How to include an arbitrary kernel header file in a module?
情况
我正在编写一个用于学习目的的内核模块,并希望使用此处定义的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>
- 只是从这个问题的评论中复制粘贴这些都没有工作,都给了我错误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
问题
我如何在我的内核模块中引用这 2 个符号?
您不应该在“普通”内核模块中需要它们。 如果您真的这样做了,请在您的模块中重新定义它们。
这些符号是否应该由标准模块直接引用?
他们不是,那个特定的sched.h
文件只应该由调度程序代码( kernel/sched
文件)使用。 这就是为什么它没有被导出(即不在include
目录中)。 您不会在标头文件夹 ( /lib/modules/.../build
) 中找到它们。
Makefile 是否与我如何将内核代码中的文件导入到我的模块中有关?
不确定这到底意味着什么……如果您想知道是否有某种方法可以配置 Makefile 以便可以包含该文件,那么就没有。 如果您使用内核在/lib/modules
导出的内核头文件进行构建(这就是您使用$(MAKE) -C $(KROOT)
控制权移交给内核的 Makefile 时$(MAKE) -C $(KROOT)
),那么该文件就是不在那里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.