![](/img/trans.png)
[英]How to build an out-of-tree linux module with an additional include path (includes external header files, librairies like yaml, boost…)
[英]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 。 功能,
int register_module_notifier(struct notifier_block * nb);
int unregister_module_notifier(struct notifier_block * nb);
每當加載任何模塊時,均可用於獲取通知 。 通知程序函數通過enum module_state
和指向模塊結構的指針傳遞。 您可以使用它來遍歷導出的符號並修補模塊中包含的功能指針。
第一個解決方案似乎最適合的功能數量有限,如果您預計許多功能最終可能會像下面這樣添加的第二似乎不錯。 第二種解決方案支持模塊移除,但是您也可以使用register_funcA(NULL);
在module_exit()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.