我是靠谱客的博主 迷路寒风,最近开发中收集的这篇文章主要介绍内核模块中函数的导出和使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 -$(KERNELDIR) M=$(PWD) modules
else
obj-:=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>" "%dn",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 -$(KERNELDIR) M=$(PWD) modules
else
obj-:=hello.o
endif


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

提醒: 1.hello.c中要先声明要使用的函数.比如我的: int plus(int a,int b);
     2.这里要保证两个模块在同一个目录下,(和上次我的猜想不一致),后经过验证,不在同一个目录下
会不认识最初导出的那个函数符号。有点想不通,既然不能在同一个目录下,却还不能写多个makefile。郁闷中。不知道有没高手帮我解决下。

最后

以上就是迷路寒风为你收集整理的内核模块中函数的导出和使用的全部内容,希望文章能够帮你解决内核模块中函数的导出和使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部