如何在模块中包含任意内核头文件?
How to include an arbitrary kernel header file in a module?
情况
我正在编写一个用于学习目的的内核模块,并希望使用 sched_class_highest
和 for_each_class
定义的 here。
我看到如果我想在文件 /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 中的评论复制粘贴
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
问题
- 如何在我的内核模块中引用这两个符号?
- 这些符号应该被标准模块直接引用吗?如果是这样,标准的做法是什么?
- 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 时所做的事情),那么该文件就是没有。
情况
我正在编写一个用于学习目的的内核模块,并希望使用 sched_class_highest
和 for_each_class
定义的 here。
我看到如果我想在文件 /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 中的评论复制粘贴
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
问题
- 如何在我的内核模块中引用这两个符号?
- 这些符号应该被标准模块直接引用吗?如果是这样,标准的做法是什么?
- 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 时所做的事情),那么该文件就是没有。