您的位置:首页 > 其它

内核模块中函数的导出和使用

2014-11-27 15:23 465 查看
http://blog.chinaunix.net/uid-22556372-id-1773420.html

首先一个模块:内容不多,plus.c和Makefile

plus.c

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

MODULE_LICENSE("GPL");

static int plus_init(void)
{

        printk("<0>" "\nplus_init success!\n");

        return 0;
}

static void plus_exit(void)
{

        printk("<0>" "\nplus_exit success!\n");
}

int plus(int a, int b)
{

        return (a+b);
}

module_init(plus_init);

module_exit(plus_exit);

EXPORT_SYMBOL(plus);
Makefile:

ifeq ($(KERNELRELEASE),)

KERNELDIR := /lib/modules/$(shell
uname -r)/build

PWD := $(shell
pwd)

default:

    make -C $(KERNELDIR) M=$(PWD) modules
else

obj-m :=plus.o

endif
然后make一下,在下面的模块使用这个导出函数之前记得insmod,前提是你加载这个模块,
导出plus函数到符号表当中.下面就是使用这个导出函数的模块

hello.c

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

MODULE_LICENSE("GPL");
int plus(int a,int b);
//这里记得要声明一下

static int hello_init(void)
{

        printk("<0>" "\nhello_init success!\n");

        printk("<0>" "%d\n",plus(10,20));

        return 0;
}

static void hello_exit(void)
{

        printk("<0>" "\nhello_exit success!\n");
}

module_init(hello_init);

module_exit(hello_exit);
Makefile:

ifeq ($(KERNELRELEASE),)

KERNELDIR := /lib/modules/$(shell
uname -r)/build

PWD := $(shell
pwd)

default:

    make -C $(KERNELDIR) M=$(PWD) modules
else

obj-m :=hello.o

endif
然后再make这个模块,insmod后就可以dmesg查看结果了.

提醒: 1.hello.c中要先声明要使用的函数.比如我的:int plus(int a,int b);
     2.这里要保证两个模块在同一个目录下,(和上次我的猜想不一致),后经过验证,不在同一个目录下
会不认识最初导出的那个函数符号。有点想不通,既然不能在同一个目录下,却还不能写多个makefile。郁闷中。不知道有没高手帮我解决下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ko 导出