簡體   English   中英

Linux中相互依賴的樹外內核可加載模塊

[英]Inter-dependent out-of-tree kernel loadable modules in Linux

我有兩個我是用樹構建的內核可加載模塊的設計。 這些模塊可以獨立運行,也可以在加載時一起工作(使用彼此的服務)。

所以我有帶有funcA和funcB的module1.ko。 我也有帶有funcC和funcD的module2.ko。 單獨加載module1.ko時,它僅使用funcA和funcB。 但是,如果還加載了module2.ko,則我希望這樣做,以便module1.ko可以使用funcC。

module1.ko如何檢測是否已加載module2.ko,以便知道funcC是否可供使用?

另外,由於我正在Linux內核之外構建這兩個模塊,因此如何在構建時更新我的​​Makefile以添加此條件依賴項?

我的Makefile當前看起來與此類似:

MODULE_NAME=module1
SOURCE_FILES=module1_driver.c
CROSS_COMPILER=powerpc-timesys-linux-gnu-
ARCH=powerpc

ifneq ($(KERNELRELEASE),)

    obj-m := $(MODULE_NAME).o
    $(MODULE_NAME)-objs := $(SOURCE_FILES:.c=.o)
    ccflags-y := -I$(src)/../common
    sinclude $(TOPDIR)/Rules.make

else

    KERNELDIR ?= ../../linux/2.6-xlnx-rt
    PWD := $(shell pwd)

default:
    $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILER) -C $(KERNELDIR) M=$(PWD) modules

clean:
    $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILER) -C $(KERNELDIR) M=$(PWD) clean
    rm -rf ../common/*.o module1_test

endif

一個簡單的解決方案是使用第三個模塊。

第三個woulf始終會被加載,並將包含一個導出的函數指針。
module2將設置指針,module1將使用它(如果已設置)。

按照ugoren的回答,您只需在機器文件中添加一些鈎子即可。

static void (*funcA_ptr)();
void register_funcA(void(*)() fnc)
{
  funcA_ptr = fnc;
}
EXPORT_SYMBOL(register_funcA);
void funcA_proxy()
{
  if(funcA_ptr)
       funcA_ptr();
}
EXPORT_SYMBOL(funcA_proxy);

該開銷非常小,因此無需將其作為模塊。

另一種機制是瀏覽module.h 功能,

  1. int register_module_notifier(struct notifier_block * nb);
  2. int unregister_module_notifier(struct notifier_block * nb);

每當加載任何模塊時,均可用於獲取通知 通知程序函數通過enum module_state和指向模塊結構的指針傳遞。 您可以使用它來遍歷導出的符號並修補模塊中包含的功能指針。

第一個解決方案似乎最適合的功能數量有限,如果您預計許多功能最終可能會像下面這樣添加的第二似乎不錯。 第二種解決方案支持模塊移除,但是您也可以使用register_funcA(NULL); module_exit()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM