情况
我正在编写用于学习目的的内核模块,并希望使用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
问题
答案 0 :(得分:1)
如何在内核模块中引用这两个符号?
您不应该在“常规”内核模块中使用它们。如果确实需要,请在您的模块中重新定义它们。
那些符号是否应该由标准模块直接引用?
不是,该特定sched.h
文件仅应由调度程序代码使用(kernel/sched
中的文件)。这就是为什么不导出(即不在include
目录中)的原因。您不会在标题文件夹(/lib/modules/.../build
)中找到它们。
Makefile是否与如何将内核代码文件导入模块有关?
不确定这到底意味着什么...如果您想知道是否可以通过某种方式配置Makefile,以便可以包含该文件,则没有。如果要使用/lib/modules
中内核导出的内核头文件进行构建(这是您在通过$(MAKE) -C $(KROOT)
将控制权移交给内核的Makefile时所做的事情),则文件根本就不存在。 / p>