c - 如何在模块中包含任意内核头文件?
问题描述
情况
我正在编写一个用于学习目的的内核模块,并希望使用这里定义的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>
的评论中复制粘贴
这些都不起作用,都给了我错误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 是否与如何将内核代码中的文件导入模块相关?
解决方案
如何在我的内核模块中引用这两个符号?
您不应该在“普通”内核模块中需要它们。如果你真的这样做,请在你的模块中重新定义它们。
这些符号是否应该由标准模块直接引用?
它们不是,该特定sched.h
文件只应该由调度程序代码(中的文件kernel/sched
)使用。这就是为什么它不被导出(即不在include
目录中)。您不会在标题文件夹 ( /lib/modules/.../build
) 中找到它们。
Makefile 是否与如何将内核代码中的文件导入模块相关?
不确定这到底意味着什么......如果您想知道是否有某种方法可以配置您的 Makefile 以便可以包含该文件,那么没有。如果您正在使用内核导出的内核头文件进行构建/lib/modules
(当您使用 将控制权移交给内核的 Makefile 时,您正在执行此操作$(MAKE) -C $(KROOT)
),那么该文件根本不存在。
推荐阅读
- sql - PostgresSQL 嵌套循环 - 计划者何时决定在执行 INNER JOIN 时使用嵌套循环?
- laravel - 如何使用 laravel 在 phpword 中添加表格
- r - 求字符串序列之间的汉明距离
- java - 火花数据框/数据集上的自定义排序顺序
- c# - ASP.NET Core MVC 模型 - SqlException 无法为标识列插入显式值
- django - 注销后销毁令牌
- swagger-ui - 使用 swagger ui 从 OpenAPI 规范导出 API 路径列表
- javascript - 有没有办法将长度大于 15 的字符串转换为数字,而不进行四舍五入?
- c - 在数组中查找最小偶数和最大偶数
- java - 如何故意让 kubernetes 的工作失败?