簡體   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