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

C++中搭建Lua脚本系统开发框架,并实现OpenGL调用

1.如何编译lua 2.C++ 中调用lua函数 3.lua中如何调用C++函数 4.深入的介绍lua栈(lua的灵魂) 5.lua闭包和上值的使用 6.lua元表的使用(lua的精髓) 7.实现导出C++类给lua 8.实现自动化导出类给lua 9.导出OpenGL函数库给lua 10.游戏循环中调用lua,实现OpenGL绘制.
  • 2017年03月20日 22:41

Linux 驱动模块及模块之前的通信(模块函数的相互调用)

1.3.2 模块机制 insmod :安装module rmmod :卸载module #include #include #include int __init x...
  • u013420428
  • u013420428
  • 2017-05-18 16:48:08
  • 312

浅析Linux从API调用到底层驱动的过程

Linux调用过程
  • u014294166
  • u014294166
  • 2016-08-08 21:51:57
  • 2590

Linux内核模块间函数调用正确方法

转载注明出处 : http://blog.csdn.net/xhz1234/article/details/44257293 Copyright 徐洪志(MacroSAN). All rights r...
  • xhz1234
  • xhz1234
  • 2015-03-15 16:39:39
  • 10077

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

Linux驱动学习 -- 模块之间调用
  • Devil_box
  • Devil_box
  • 2016-05-31 09:50:20
  • 315

<em>linux</em> 应用程序中的open 操作与硬件<em>驱动</em>之间的联系浅析

第一节 open 函数的系统操作过程,在fs/open.c 文件中 read、write 函数的系统操作过程,在fs/read_write.c 文件中对于<em>linux</em> 下所有的系统<em>调用</em>函数,均可找到与其...
  • 2018年04月17日 00:00

linux上层app调用驱动底层的过程详解

APP应用程序->应用框架层->硬件抽象层-> 硬件驱动程序 一、硬件驱动层             进入kernel/drivers文件夹中,创建一文件夹,放入驱动程序。包括头文件,C文件,Ma...
  • sdkdlwk
  • sdkdlwk
  • 2017-05-27 14:43:55
  • 1036

Linux下usb驱动调用流程

http://blog.csdn.net/qianguozheng/article/details/6700274 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...
  • sunqianwan_
  • sunqianwan_
  • 2016-03-09 16:41:10
  • 627

linux驱动调用(运行/执行)应用程序

概述: linux驱动程序调用(运行/执行)应用程序,即驱动调用用户空间的应用程序。本文主要是从系统API的使用角度讲述。 API声明的位置: 声明在include/linux/kmod.h...
  • eZiMu
  • eZiMu
  • 2018-01-24 23:29:32
  • 259

Linux内核驱动加载过程

Linux内核驱动加载过程 驱动加载分为两种情况:静态加载和动态加载。 1. 静态加载 静态加载的方法是把驱动程序直接编译进内核,然后内核在启动过程中由do_initcall()函数加载。 d...
  • yanlinembed
  • yanlinembed
  • 2016-01-29 11:30:48
  • 2671
收藏助手
不良信息举报
您举报文章:Linux驱动学习(2-模块之间调用)
举报原因:
原因补充:

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