欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

内核模块化编程:单模块传参、多模块、多模块合成一个模块

程序员文章站 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文件