繁体   English   中英

如何在模块中包含任意内核头文件?

[英]How to include an arbitrary kernel header file in a module?

情况

我正在编写一个用于学习目的的内核模块,并希望使用此处定义的sched_class_highestfor_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

问题

  1. 我如何在我的内核模块中引用这 2 个符号?
  2. 这些符号是否应该由标准模块直接引用? 如果是这样,这样做的标准方法是什么?
  3. Makefile 是否与我如何将内核代码中的文件导入到我的模块中有关?

我如何在我的内核模块中引用这 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM