#define module_param(name, type, perm)
module_param_named(name, name, type, perm)
name:参数的名字
type:参数类型
perm:权限---对参数的操作权限
0 文件系统不可见--只能当前模块使用该参数
0444 world-readable 所有用户可读
0644 root可写
模块传递参数类型:byte, short, ushort, int, uint, long, ulong,charp,bool,invbool
其中:charp是字符串指针类型
bool: a bool, values 0/1, y/n, Y/N
invbool: 取反 (N = true)
举例说明: int x = 20; module_parammodule_param(x,int,0664); 加载模块时传递参数 sudo insmod demo.ko x=10 ,模块运行时参数就变为了10
一. 传递 charp 和 int 型
在驱动程序中定义 char指针和int变量;然后通过 module_param 指定传递参数的变量名,类型及权限;使用 MODULE_PARM_DESC 描述这个传递的参数;
驱动程序 demo.c 文件
#include <linux/module.h> int demoint = 10; // 通过下面的宏使用时可以在加载时传递参数 char *str= "world"; static int __init demo_init(void) // 入口函数 { // 加载模块时通过内核打印传参值 printk(KERN_DEBUG " init %s---- %d --- %s ",__func__,__LINE__,str); return 0; } static void __exit demo_exit(void) // 出口函数 { // 卸载模块时通过内核打印传参改变的值 printk(KERN_INFO" exit %s --- %d %d ",__func__,__LINE__,demoint); } module_init(demo_init); // 模块入口 module_exit(demo_exit); // 模块出口 MODULE_LICENSE("GPL"); // 模块协议
module_param(demoint,int,0644); // 模块传参,指定参数,类型,权限 MODULE_PARM_DESC(demoint,"demoint for test "); // 传参介绍描述 module_param(str,charp,0644); MODULE_PARM_DESC(str,"demoint for test ");
Makefile文件: 想在开发板上运行就要配置指定用开发板上的内核源码中的Makefile 编译
# 这个路径是开发板内核源码路径,使用这个路径时可以编译到开发板上运行 # KERNELDIR=/home/linux/share/kernel-3.4.39/ # 这个路径是虚拟机中内核源码路径,只能在虚拟机上运行 KERNELDIR=/lib/modules/3.13.0-32-generic/build PWD=$(shell pwd) all: make -C $(KERNELDIR) M=$(PWD) modules clean: make -C $(KERNELDIR) M=$(PWD) clean obj-m +=demo.o
加载模块时,指定参数名及参数值
通过传参加载模块:sudo insmod demo.ko demoint=0 str="modules"
二。 传递数组 array
demo.c 驱动模块文件
#include <linux/module.h> int array[16] = {1,2,3,4,5}; // 定义数组 int len; // 定义数组的长度 static int __init demo_init(void) { int i=0; printk(KERN_DEBUG " init %s---- %d ",__func__,__LINE__); // 加载内核时打印内容 for(i=0;i<16;i++) // 内核打印数组内容 { printk("array[%d] = %d ",i,array[i]); } return 0; static void __exit demo_exit(void) { printk(KERN_INFO" exit %s --- %d ",__func__,__LINE__); } module_init(demo_init); // 模块入口 module_exit(demo_exit); // 模块出口 MODULE_LICENSE("GPL"); // 模块协议 // 导入数组参数,数组名,类型,长度,权限,其中长度设为 NULL 自动获取长度 module_param_array(array,int,&len,0644); // 指定数组名,数组类型,长度,及权限 MODULE_PARM_DESC(array, "array test "); // 描述数组
加载模块时传递数组中元素值:sudo insmod demo.ko array=6,7,8,9,0
三 。 对于模块的一些操作命令 以 demo.ko 为例
insmod demo.ko 加载模块
rmmod demo 卸载模块
lsmod 查看内核中加载的模块
modinfo demo.ko 查看这个模块的信息
dmesg 查看内核打印信息
sudo dmesg -c 清除内核的打印信息,回显清除
sudo dmesg -C 不回显清除
sudo modprobe vivi 加载带依赖的模块 vivi.ko
sudo modprobe -r vivi 卸载带依赖的模块 vivi.ko
安装摄像头调试工具xawtv: sudo apt-get install xawtv 也可以使用 cheese 摄像头调试工具