Linux驱动学习(2-模块之间调用)

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); 修饰,否则其他模块无法调用。
谢谢

猜你喜欢

转载自blog.csdn.net/Devil_box/article/details/51543310