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

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

实现:在一个内核模块调用另一个内核模块中的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;                               //定义参数astatic int b;                               //定义参数bmodule_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.oobj-m += file4.oKDIR = ./kernel_srcall:    make -C $(KDIR) M=`pwd` modulesclean:    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

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