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

原创 2016年05月31日 09:50:20

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

linux驱动学习2——scull0模块

#include #include #include #include #include #include #include #define SCULL_NAME "scull_de...

MCP3428基于I2C linux驱动模块程序

  • 2017年11月25日 11:37
  • 7KB
  • 下载

linux驱动学习笔记(三) -- bus,device,device_driver之间的关系

linux驱动模型 -- bus,device,device_driver之间的关系 说明:内核2.6.28与参考博客有一定的不同做相应的修改,并添加一些结构体代码 参考文章:http://blog...

linux驱动学习-----添加加一个模块hello

参考各个网站的教程编写一个HELLO MODULE,添加到menuconfig中。 主要是两个文件:Makefile和Kconfig。 首先进入驱动中lichee/linux-3.4/driver...

Linux驱动学习(一)——简单的hello模块

大概看了一遍LDD,从今天开始动手实践,下面给出linux内核模块开发入门的代码,helloworld。 hello.c   #include #include MODULE_LICEN...

linux驱动学习笔记(2.3) scull模块 init_MUTEX被废除

一、今天在编译ldd3上的scullc的时候,出现如下错误: 刚开始我以为没有包含头文件,然后我就去查2.6.39.1的源代码,结果在所有的符号中都没有发现init_MUTEX,后面在网站上发现...

linux驱动学习(二)——内核模块

因为linux内核的整体结构非常庞大,包含的组件非常多,如何使用需要的组件呢?有一种方法是把所有的组件都编译进内核文件(zImage或bzImage),但是这样会产生两个问题:一是生成的内核文件过大;...

Linux驱动学习(模块1)

驱动学习第一篇 hello worldhello.c/*************************************************************************...

linux驱动学习第三天(linux内核模块)

一、linux内核模块简介         静态编译,把所需要的功能都编译到linux内核,会导致生成的内核会很大,如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。         ...

linux驱动基础开发2——linux 驱动开发前奏(模块编程)

一、linux内核模块简介      linux内核整体结构非常庞大,其包含的组件也非常多。我们怎么把需要的部分都包含在内核中呢?      一种办法是把所有的需要的功能都编译到内核中。这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux驱动学习(2-模块之间调用)
举报原因:
原因补充:

(最多只允许输入30个字)