Amodule.c
#include <linux/module.h>
#include <linux/kernel.h>
#include "mbase.h"
MODULE_LICENSE("GPL");
//extern int base_func(int a,int b);
static int __init Amodule_init(void)
{
printk("Hello the A module was installed!\n");
printk("input 34 and 56 to basefunc = %d!\n",base_func(34,56));
return 0;
}
static void __exit Amodule_exit(void)
{
printk("Hello A base module was removed!\n");
}
module_init(Amodule_init);
module_exit(Amodule_exit);
mbase.h
#ifndef __MBASE_H__
#define __MBASE_H__
int base_func(int a, int b);
#endif
mbase.c
include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
static int base_func(int a,int b)
{
return a+b;
}
EXPORT_SYMBOL_GPL(base_func); //地址可见
static int __init bmodule_init(void)
{
printk("Hello the base module was installed!\n");
return 0;
}
static void __exit bmodule_exit(void)
{
printk("Hello the base module was removed!\n");
}
module_init(bmodule_init);
module_exit(bmodule_exit);
Makefile
#To display info during Ccompiling
$(warning KERNELRELEASE=$(KERNELRELEASE))
#To check the KERNELRELEASE enviroment value
ifeq ($(KERNELRELEASE),)
#It's NULL, so to set the enviroment value
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*
.PHONY: modules modules_install clean
#To create obj file
else
# obj-m := mbase.o Amodule.o
#或者分行写成下面模式
obj-m := mbase.o
obj-m += Amodule.o
endif
整体代码大概就是这样,看Makefile可以知道,执行make之后,会将Amodule和mbase编译成两个ko文件,也就是两个模块,其中Amodule模块调用了mbase模块内部的base_func函数来执行加法操作。
make编译来生成模块文件
可以看出来生成了Amodule.ko文件和mbase.ko文件。
将模块文件加载进内核,这里注意加载的顺序,先加载mbase模块再加载Amodule模块。
insmod mbase.ko
insmod Amodule.ko
查看内核,两个模块是否已经挂载上去 lsmod
可以看出来mbase模块Used by Amodule,说明mbase模块被其他模块使用了一次,使用者是Amodule模块。
查看Amodule模块是否调用mbase模块函数成功 dmesg
调用成功。
这里注意mbase模块内部base_func函数,使用EXPORT_SYMBOL_GPL(base_func); 修饰,否则其他模块无法调用。
谢谢