情况
我正在编写用于学习目的的内核模块,并希望使用sched_class_highest
和for_each_class
定义在这里。
我看到,如果我想在文件/include/linux/sched.h中使用符号,我会#include <linux/sched.h>
。因此,以同样的方式,由于我现在要添加的文件位于location /kernel/sched/sched.h
,所以我尝试#include
:
<kernel/sched.h>
<kernel/sched/sched.h>
<../kernel/sched/sched.h>
-仅复制此问题中评论的粘贴内容这些都不起作用,都给了我错误:没有这样的文件或目录。
我对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
问题
如何在内核模块中引用这两个符号?
您不应该在“常规”内核模块中使用它们。如果确实需要,请在模块中重新定义它们。
这些符号是否应该由标准模块直接引用?
它们不是,该特定sched.h
文件仅应由调度程序代码使用(中的文件kernel/sched
)。这就是为什么不导出(即不在include
目录中)的原因。您不会在标题文件夹(/lib/modules/.../build
)中找到它们。
Makefile是否与我如何将内核代码文件导入模块有关?
不确定这到底意味着什么...如果您想知道是否可以通过某种方式配置Makefile,以便可以包含该文件,那么就没有了。如果您使用内核导出的内核头文件进行构建/lib/modules
(这是您通过将控制权移交给内核的Makefile时所做的事情$(MAKE) -C $(KROOT)
),则该文件根本就不存在。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句