首页 > 解决方案 > 如何在模块中包含任意内核头文件?

问题描述

情况

我正在编写一个用于学习目的的内核模块,并希望使用这里定义的sched_class_highest和。for_each_class

我看到如果我想在文件 /include/linux/sched.h 中使用符号,我将#include <linux/sched.h>. 所以以同样的方式,由于我现在要添加的文件位于 location /kernel/sched/sched.h,我尝试#include

这些都不起作用,都给了我错误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. 这些符号是否应该由标准模块直接引用?如果是这样,这样做的标准方法是什么?
  3. Makefile 是否与如何将内核代码中的文件导入模块相关?

标签: clinuxmakefilelinux-kernel

解决方案


如何在我的内核模块中引用这两个符号?

您不应该在“普通”内核模块中需要它们。如果你真的这样做,请在你的模块中重新定义它们。

这些符号是否应该由标准模块直接引用?

它们不是,该特定sched.h文件只应该由调度程序代码(中的文件kernel/sched)使用。这就是为什么它不被导出(即不在include目录中)。您不会在标题文件夹 ( /lib/modules/.../build) 中找到它们。

Makefile 是否与如何将内核代码中的文件导入模块相关?

不确定这到底意味着什么......如果您想知道是否有某种方法可以配置您的 Makefile 以便可以包含该文件,那么没有。如果您正在使用内核导出的内核头文件进行构建/lib/modules(当您使用 将控制权移交给内核的 Makefile 时,您正在执行此操作$(MAKE) -C $(KROOT)),那么该文件根本不存在。


推荐阅读