Linux核心模組間函式呼叫正確方法

2021-08-26 18:09:11 字數 2452 閱讀 7596

模組a中使用export_symbol或export_symbol_gpl將要提供給b模組的函式匯出;

模組b中用extern 宣告需要用到的a模組提供的函式。

**如下:

模組a的** – a_func.c

#include #include #include #include // print jiffies

void a_print_jiffies(void)

export_symbol(a_print_jiffies);

static int __init a_init(void)

static void __exit a_exit(void)

module_init(a_init);

module_exit(a_exit);

module_author("xu*******@macrosan");

module_description("module a");

module_version("0.1");

module_license("gpl");

模組b的** – b_func.c

#include #include #include #include extern void a_print_jiffies(void);

static int __init b_init(void)

static void __exit b_exit(void)

module_init(b_init);

module_exit(b_exit);

module_author("xu*******@macrosan");

module_description("module b!");

module_version("0.1");

module_license("gpl");

模組a的makefile

obj-m := a_func.o

kerneldir := /lib/modules/$(shell uname -r)/build

pwd := $(shell pwd)

default:

$(make) -c $(kerneldir) m=$(pwd) modules

clean:

rm -f *.o *.ko *.mod.c *.order *.symvers

模組b的makefile

obj-m := b_func.o

kerneldir := /lib/modules/$(shell uname -r)/build

pwd := $(shell pwd)

default:

$(make) -c $(kerneldir) m=$(pwd) modules

clean:

rm -f *.o *.ko *.mod.c *.order *.symvers

接下來,有3種方式使得模組b編譯及載入不出現warning或failed.

方法一:

a模組在make之後,會產生乙個module.symvers檔案,將該檔案拷貝到b模組源檔案目錄中,然後執行make
方法二:

修改b模組的makefile檔案:

新增kbuild_extra_symbols += /path_to_module_a/module.symvers

export kbuild_extra_symbols

obj-m := xhz2_func.o

kerneldir := /lib/modules/$(shell uname -r)/build

pwd := $(shell pwd)

kbuild_extra_symbols += /home/xhz/project/temp_module/module.symvers

export kbuild_extra_symbols

default:

$(make) -c $(kerneldir) m=$(pwd) modules

clean:

rm -f *.o *.ko *.mod.c *.order *.symvers

方法三:

修改linux核心原始碼樹中的module.symers檔案,將a模組編譯產生的module.symvers的內容新增在此檔案中。(注意將空格替換為tab,否則編譯b時會報錯)。
個人推薦使用第二種方法,相比方法一省去拷貝檔案的步驟。相比方法三,無須修改linux核心原始碼樹中的module.symvers.

參考 

1.2.《深入linux裝置驅動程式核心機制》–陳學松 page45

Linux核心模組間函式呼叫正確方法

模組a中使用export symbol或export symbol gpl將要提供給b模組的函式匯出 模組b中用extern 宣告需要用到的a模組提供的函式。如下 模組a的 a func.c include include include include print jiffies void a p...

Linux核心模組間函式呼叫正確方法

模組a中使用export symbol或export symbol gpl將要提供給b模組的函式匯出 模組b中用extern 宣告需要用到的a模組提供的函式。如下 模組a的 a func.c include include include include print jiffies void a p...

Linux核心模組間函式呼叫正確方法

模組a中使用export symbol或export symbol gpl將要提供給b模組的函式匯出 模組b中用extern 宣告需要用到的a模組提供的函式。如下 模組a的 a func.c include include include include print jiffies void a p...