内核模块化编程:单模块传参、多模块、多模块合成一个模块
程序员文章站
2022-07-14 16:30:28
...
首先进入到当天的文件夹
single里放的是单模块编程,multi放的是多模块编程,all_for_one放的是将多模块合成一个模块的编程。
1、single目录中存放了一个.c和一个Makefile文件
aaa@qq.com:/driver/rootfs/module/single# ls
first_module.c Makefile
first_moudle.c的代码如下:
#include <linux/kernel.h>
#include <linux/module.h>
int num=4;
module_param(num,int,0644);
static int __init first_module_hello_init(void)
{
int i=0;
printk("hello ! this is first_module_hello_init !\t%d\t%s\t%s\n",__LINE__,__FUNCTION__,__FILE__);
for(i=0;i<=num;i++)
{
printk("i=%d\n",i);
}
return 0;
}
static void __exit first_module_bye_exit(void)
{
printk("bye ! first_module_bye_exit !\t%d\t%s\t%s\n",__LINE__,__FUNCTION__,__FILE__);
}
module_init(first_module_hello_init);
module_exit(first_module_bye_exit);
MODULE_LICENSE("GPL");
Makefile文件代码如下:
obj-m += first_module.o
KERDIR=/qudong/0703kernel/linux-3.5/
all:
make -C $(KERDIR) M=$(PWD)
clean:
make -C $(KERDIR) M=$(PWD) clean
经过make指令生成first_moudle.ko文件,在超级终端上使用insmod指令将模块加载到内核,该模块使用了主函数传参的形式,加载效果如下所示,使用完毕后使用指令rmmo卸载模块
2、multi目录中存放的有两个.c和一个Makefile文件
aaa@qq.com:/driver/rootfs/module/multi# ls
first_module.c Makefile second_module.c
first_module.c代码如下:
#include <linux/kernel.h>
#include <linux/module.h>
void hello(void)
{
printk("%s\t%s() is called !\n",__FILE__,__FUNCTION__);
}
void bye(void)
{
printk("%s\t%s() is called !\n",__FILE__,__FUNCTION__);
}
EXPORT_SYMBOL(hello);
EXPORT_SYMBOL(bye);
static int __init first_module_hello_init(void)
{
printk("hello ! this is first_module_hello_init !\t%d\t%s\t%s\n",__LINE__,__FUNCTION__,__FILE__);
return 0;
}
static void __exit first_module_bye_exit(void)
{
printk("bye ! first_module_bye_exit !\t%d\t%s\t%s\n",__LINE__,__FUNCTION__,__FILE__);
}
module_init(first_module_hello_init);
module_exit(first_module_bye_exit);
MODULE_LICENSE("GPL");
second_module.c代码如下:
#include <linux/kernel.h>
#include <linux/module.h>
extern void hello(void);
extern void bye(void);
static int __init second_module_hello_init(void)
{
printk("hello ! this is second_module_hello_init !\t%d\t%s\t%s\n",__LINE__,__FUNCTION__,__FILE__);
hello();
return 0;
}
static void __exit second_module_bye_exit(void)
{
printk("bye ! second_module_bye_exit !\t%d\t%s\t%s\n",__LINE__,__FUNCTION__,__FILE__);
bye();
}
module_init(second_module_hello_init);
module_exit(second_module_bye_exit);
MODULE_LICENSE("GPL");
Makefile文件代码如下:
obj-m += first_module.o second_module.o
KERDIR=/qudong/0703kernel/linux-3.5/
all:
make -C $(KERDIR) M=$(PWD)
clean:
make -C $(KERDIR) M=$(PWD) clean
两个.c在make之后生成两个.ko文件,在超级终端上先insmod加载被调用者first_module.ko,之后加载调用者second_module.ko,两个顺序不能错,卸载的时候顺序相反,先卸载second_module.ko,之后卸载first_module.ko
3、all_for_one目录如下,有两个.c和一个Makefile文件
aaa@qq.com:/driver/rootfs/module/all_for_one# ls
first_module.c Makefile second_module.c
first_module.c代码如下:
#include <linux/kernel.h>
#include <linux/module.h>
void hello(void)
{
printk("%s\t%s() is called !\n",__FILE__,__FUNCTION__);
}
void bye(void)
{
printk("%s\t%s() is called !\n",__FILE__,__FUNCTION__);
}
EXPORT_SYMBOL(hello);
EXPORT_SYMBOL(bye);
second_module.c代码如下:
#include <linux/kernel.h>
#include <linux/module.h>
extern void hello(void);
extern void bye(void);
static int __init second_module_hello_init(void)
{
printk("hello ! this is second_module_hello_init !\t%d\t%s\t%s\n",__LINE__,__FUNCTION__,__FILE__);
hello();
return 0;
}
static void __exit second_module_bye_exit(void)
{
printk("bye ! second_module_bye_exit !\t%d\t%s\t%s\n",__LINE__,__FUNCTION__,__FILE__);
bye();
}
module_init(second_module_hello_init);
module_exit(second_module_bye_exit);
MODULE_LICENSE("GPL");
Makefile文件代码如下:
obj-m += one.o
one-objs = first_module.o second_module.o
KERDIR=/qudong/0703kernel/linux-3.5/
all:
make -C $(KERDIR) M=$(PWD)
clean:
make -C $(KERDIR) M=$(PWD) clean
最终经过make会生成一个one.ko文件
上一篇: Erlang和LLVM