一个内核模块例子(实现调用其他模块中的方法,传递参数等)

实现:在一个内核模块调用另一个内核模块中的a+b函数,并通过命令行给参数a,参数b赋值。

file3.c

#include<linux/module.h>
void add_num_func(int a,int b)
{
    printk("file1 a+b = %d \n",a+b);
}

EXPORT_SYMBOL(add_num_func);      //表示该函数可以被外部调用
MODULE_LICENSE("GPL");

    

查看内核符号表使用该命令:#cat /proc/kallsyms

file4.c

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

static int a;                               //定义参数a
static int b;                               //定义参数b

module_param(a,int,S_IRUSR);    //声明该变量作为module的参数,S_IRUSR 文件所有者的读权限
module_param(b,int,S_IRUSR);

extern void add_num_func(int a,int b);

static int __init add_module_init(void)
{
    printk("add_module_init");
    add_num_func(a,b);    
    return 0;
}
static void __exit add_module_exit(void)
{
    printk("add_module_exit");
}

module_init(add_module_init);
module_exit(add_module_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Achilles");
MODULE_DESCRIPTION("A simple module for linux : a+b");
MODULE_VERSION("V1.0");

MODULE_PARM_DESC(a,"parm A");           //说明参数的功能
MODULE_PARM_DESC(b,"parm B");
                            

Makefile:

obj-m += file3.o
obj-m += file4.o

KDIR = ./kernel_src

all:
    make -C $(KDIR) M=`pwd` modules
clean:
    make -C $(KDIR) M=`pwd` clean

Makefile中的kernel_src是软连接,链接向内核源码顶级目录。

效果:

[root@(none) /modules]# insmod file3.ko
[root@(none) /modules]# insmod file4.ko a=1 b=3
add_module_initfile1 a+b = 4

 

注意:需要先安装file3.ko模块,然后安装file4.ko模块,否则报错,找不到符号。

[root@(none) /modules]# insmod file4.ko

[14905.833510] file4: Unknown symbol add_num_func (err 0)
insmod: can't insert 'file4.ko': unknown symbol in module, or unknown parameter

posted @ 2014-10-21 17:08  Achille·Swn  阅读(992)  评论(0编辑  收藏  举报