linux 内核模块函数调用

在编写linux内核模块的时候,有时候我们需要调用一只内核模块里面的函数,然而如果是在不同目录下面编译生成的内核模块,此时A模块去调用B模块的函数时候会出现函数未定义,无法调用的情况。那么以前我是在同一个目录下面,先后写两个makefile,然后编译生成两个不同的内核模块,这种方式可以正常实现A模块调用B模块里面的函数,不过非常麻烦。本博文将会针对这种情况提出一种可以同时生成多个内核模块,不要再次编译的方面,下面贴出源码:

内核模块cal.ko:

#include <linux/module.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");

int add(int a, int b) {
     return a+b;
}

int sub(int a, int b) {
    return a-b;
}

static int  sym_init() {
    return 0;
}

static int  sym_exit() {
    return 0;
}

module_init(sym_init);
module_exit(sym_exit);

EXPORT_SYMBOL(add);
EXPORT_SYMBOL(sub);

内核模块hello.ko

#include <linux/module.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("David Xie");
MODULE_DESCRIPTION("Hello World Module");
MODULE_ALIAS("a simplest module");

static int age = 10;
module_param(age, int, S_IRUGO);//allow all user to use this param

int add(int a, int b);
int sub(int a, int b);

static int hello_init(void)
{
    printk("<0>"" Hello World! age = %d\n", add(10, 20));//调用内核模块cal.ko里面的add函数
    return 0;
}

static void  hello_exit(void)
{
    printk("<0>""hello exit %d\n", sub(30,10));//调用内核模块cal.ko里面的sub函数

}

module_init(hello_init);
module_exit(hello_exit);


可以生成多个内核模块的makefile

ifneq ($(KERNELRELEASE),)

obj-m := cal.o  hello.o
cal-objs := operator.o
hello-objs := main.o
else

KDIR := /lib/modules/2.6.32-21-generic/build
all:
    make -C $(KDIR) M=$(PWD) modules
clean:
    rm -f *.ko *.o *.mod.o *.mod.c *.symvers  *.order

endif

此时在当前目录执行make就会产生cal.ko和hello.ko两个内核模块

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。