很多情况下,我们期望通过参数来控制我们的驱动的行为,比如由于系统的不同,而为了保证我们驱动有较好的移植性,我们有时候期望通过传递参数来控制我们驱动的行为,这样不同的系统中,驱动可能有不同的行为控制。
为了满足这种需求,内核允许对驱动程序指定参数,而这些参数可在加载驱动的过程中动态的改变
参数的来源主要有两个
使用insmod/modprobe ./xxx.ko时候在命令行后直接给出参数;
modprobe命令装载模块时可以从它的配置文件/etc/modprobe.conf文件中读取参数值
这个宏必须放在任何函数之外,通常实在源文件的头部
模块参数传递的方式
对于如何向模块传递参数,Linux kernel 提供了一个简单的框架。其允许驱动程序声明参数,并且用户在系统启动或模块装载时为参数指定相应值,在驱动程序里,参数的用法如同全局变量。
使用下面的宏时需要包含头文件<linux/moduleparam.h>
宏
module_param(name, type, perm)module_param_array(name, type, num_point, perm)module_param_named(name_out, name_in, type, perm)module_param_string(name, string, len, perm)MODULE_PARM_DESC(name, describe)
你问的是什么意思,不太明白!linux中内核的东西都是模块形式的,如驱动啊!你如果用到那个驱动,它的从在方式就是module,你如果需要那个,就可以把这个module添加到内核,就可以用了!在编写linux内核模块的时候,有时候我们需要调用一只内核模块里面的函数,然而如果是在不同目录下面编译生成的内核模块,此时A模块去调用B模块的函数时候会出现函数未定义,无法调用的情况。那么以前我是在同一个目录下面,先后写两个makefile,然后编译生成两个不同的内核模块,这种方式可以正常实现A模块调用B模块里面的函数,不过非常麻烦。本博文将会针对这种情况提出一种可以同时生成多个内核模块,不要再次编译的方面,下面贴出源码:内核模块cal.ko:
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL")
int add(int a, int b) {
return a+b
}
int sub(int a, int b) {
return a-b
}
static int sym_init() {
return 0
}
static int sym_exit() {
return 0
}
module_init(sym_init)
module_exit(sym_exit)
EXPORT_SYMBOL(add)
EXPORT_SYMBOL(sub)
内核模块hello.ko
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL")
MODULE_AUTHOR("David Xie")
MODULE_DESCRIPTION("Hello World Module")
MODULE_ALIAS("a simplest module")
static int age = 10
module_param(age, int, S_IRUGO)//allow all user to use this param
int add(int a, int b)
int sub(int a, int b)
static int hello_init(void)
{
printk("<0>"" Hello World! age = %d\n", add(10, 20))//调用内核模块cal.ko里面的add函数
return 0
}
static void hello_exit(void)
{
printk("<0>""hello exit %d\n", sub(30,10))//调用内核模块cal.ko里面的sub函数
}
module_init(hello_init)
module_exit(hello_exit)
可以生成多个内核模块的makefile
ifneq ($(KERNELRELEASE),)
obj-m := cal.o hello.o
cal-objs := operator.o
hello-objs := main.o
else
KDIR := /lib/modules/2.6.32-21-generic/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order
endif
此时在当前目录执行make就会产生cal.ko和hello.ko两个内核模块
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)