有关linux内核模块的开发

1、在开发内核驱动模块开发的时候,我们要编写的源文件一般有.cmake文件

如:

hello.c

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

MODULE_LICENSE("GPL");
MODULE_AUTHOR("lanyzh");
MODULE_DESCRIPTION("Hello world module");

static int __init hello_init(void)
{
	printk(KERN_EMERG” Hello enter!"”);
	
	return 0;
}
static void __exit hello_exit(void)
{
	printk(KERN_EMERG "hello exit!\n");
}

module_init(hello_init);//声明入口函数
module_exit(hello_exit);//声明出口函数


 

Makefile

ifneq ($(KERNELRELEASE),)

obj-m := hello.o 

else
	
KDIR := /lib/modules/2.6.29/build  #指定使用的内核版本
all:
	make -C $(KDIR) M=$(PWD) modules
clean:
	rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif


 

有了以上的文件我们就可以开始编译我们的内核模块了,直接敲入“make

生产有:“hello.ko”文件和其他的文件。有了“hello.ko”,我们就可以直接加载模块了“insmod hello.ko”,卸载“rmmod hello”。

 

 

2、内核模块有多个源文件构成,那Makefile文件的编写如下:

如:

hello.c

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

MODULE_LICENSE("GPL");
MODULE_AUTHOR("lanyzh");
MODULE_DESCRIPTION("Hello world module");

extern int add(int x,int y);

static int __init hello_init(void)
{
	printk(KERN_EMERG” Hello enter!"”);
	add(1,2);
	return 0;
}
static void __exit hello_exit(void)
{
	printk(KERN_EMERG "hello exit!\n");
}

module_init(hello_init);//声明入口函数
module_exit(hello_exit);//声明出口函数


 

add.c

void add(int x,inty)
{
	return (x + y);
}

Makefile

ifneq ($(KERNELRELEASE),)

obj-m := hello.o 
hello.-objs := hello.o add.o

else
	
KDIR := /lib/modules/2.6.29/build  #指定使用的内核版本
all:
	make -C $(KDIR) M=$(PWD) modules
clean:
	rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif


 

3、模块参数

hello.c

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

MODULE_LICENSE("GPL");
MODULE_AUTHOR("lanyzh");
MODULE_DESCRIPTION("Hello world module");

static int age = 26;
static char *name ="lanyzh";
extern int add(int x,int y);

module_param(age,int,S_IRUGO);
module_param(name,charp,S_IRUGO);

static int __init hello_init(void)
{
	printk(KERN_EMERG "Name:%s\n",name);
	printk(KERN_EMERG "age:%d\n",age);
	return 0;
}
static void __exit hello_exit(void)
{
	printk(KERN_EMERG "hello exit!\n");
}

module_init(hello_init);//声明入口函数
module_exit(hello_exit);//声明出口函数

编译通过,加载模块时使用“insmod hello.ko age= 10 name=xiaolan”即可!

在声明模块参数时使用:module_paramParam,Type,Perm

Param:我们要指定声明的参数

Type:  参数的类型(常见的类型:int,bool,charp

Perm: 模块参数的访问权限

S_IRUGO:任何用户都对/sys/module中出现的该参数具有读权限

S_IWUSR:允许root用户修改/sys/module中出现的该参数

 

4、内核符号导出

假如模块A,用到了模块B中的一些导出函数,那么我们要怎么实现呢?我们可以像这样来说实现:

hello.c

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

MODULE_LICENSE("GPL");

extern int add_integar(int a,int b); 
extern int sub_integar(int a,int b);

static int __init hello_init(void)
{
	int res=add_integar(1,2);
	printk(KERN_EMERG"hello init , res=%d\n",res);
	return 0;
}
static void __exit hello_exit()
{
	int res=sub_integar(2,1);
	printk(KERN_EMERG"hello exit,res=%d\n",res);
}

module_init(hello_init);
module_exit(hello_exit);


calculate.c

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

MODULE_LICENSE("GPL");

int add_integar(int a,int b)
{
	return a+b;
}
int sub_integar(int a,int b)
{
	return a-b;
}
static int __init sym_init()
{
	return 0;
}
static void __exit sym_exit()
{
}
module_init(sym_init);
module_exit(sym_exit);
EXPORT_SYMBOL(add_integar);
EXPORT_SYMBOL(sub_integar);


我们可以用“EXPORT_SYMBOL”来将模块中的函数导出给其他模块使用,注意在使用时,应该先将导出函数的模块加载,加载其他的模块!


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值