一:模块参数
#include<linux/module.h>
//#include<linux/moduleparam.h>
//#include<linux/stat.h>
#define CNT 1
static int cnt = CNT;
static char *hi = "Hi,Linux\n";
static int arr[] = {1,2,3,4,5,6};
static int nums = sizeof(arr)/sizeof(int);
/*类型支持布尔(bool invbool)*/
module_param(cnt, int, S_IRUGO);
/*字符指针(charp)*/
module_param(hi, charp, S_IRUGO);
/*整形(int long short uint ulong ushort)*/
module_param_array(arr, int, &nums, S_IRUGO); //赋值不能超过数组大小,否则报错
/*S_IRUGO是权限的意思,文件只有读权限
*/
static void prt(void)
{
printk(KERN_INFO "this is hello module\n");
}
static int __init hello_init(void)
{
int i;
printk(KERN_INFO "HELLO LINUX MODULE\n");
for(i = 0; i < cnt; i++)
{
printk(KERN_INFO "i = %d\n",i);
}
printk(KERN_INFO "hi = %s\n",hi);
for(i = 0; i < 6; i++)
{
printk(KERN_INFO "%d\n",arr[i]);
}
printk(KERN_INFO "nums:%d\n",nums);
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "GOODBYE LINUX\n");
}
module_init(hello_init);
module_exit(hello_exit);
/*符号导出*/
EXPORT_SYMBOL(hi);
EXPORT_SYMBOL(prt);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("xxx");
MODULE_VERSION("V1.0");
移除模块以后重新插入:
在相关目录下可以看到,这三个参数,
二:符号导出
我们在上面的代码当中通过
EXPORT_SYMBOL(hi);
EXPORT_SYMBOL(prt);
导出了两个符号,我们需要在另一个模块当中使用他们。
#include<linux/module.h>
extern char * hi;
extern void prt(void);
static int __init printp_init(void)
{
printk(KERN_INFO "printp:%s",hi);
prt();
return 0;
}
static void __exit printp_exit(void)
{
printk(KERN_INFO "printp_exit\n");
}
module_init(printp_init);
module_exit(printp_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("xxx");
MODULE_VERSION("V1.0");
这里需要注意模块的插入顺序和移除顺序,不然会报错。
可以通过查看相关文件,看导出的符号,如果没有符号导出,这个文件应该是什么也没有的。
makefile:
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
obj-m :=hello.o printp.o
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.mod *.order *.symvers