helloworld——加强版
这篇文章相比上一篇文章主要是增加了一个模块参数
运行环境:TQ2440开发板,内核版本2.6.30.4
开发环境:Window下的Source Insight以及PC机上的红帽企版5虚拟机
实验环境前提条件:拥有一个制作好的NFS文件系统
/**********************************hellop.c*************************************/
#include<linux/init.h>
#include<linux/module.h>
#include<linux/moduleparam.h>
static char *who="world";
static int howmany=1;
module_param(who, charp, S_IRUGO);
module_param(howmany,int,S_IRUGO);
static int __init hello_init(void)
{
int i;
for(i=0;i<howmany;i++)
{
printk(KERN_WARNING "(%d) hello,%s\n",i,who);
}
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_WARNING "goodbye world\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("lwj");
MODULE_DESCRIPTION("Just a simple module for hello world");
正如你所见,相比上一篇文章仅多了红色部分。模块参数拥有非常大的价值,日后你将会发现的啦,这里简单介绍一下怎么使用模块参数。
1、我们可以使用下面的命令来装载该模块
insmod hellop howmany=10 who="lwj"
2、在insmod改变模块参数之前,模块必须让这些参数对insmod命令可见,所以我们使用了module_param宏来声明,这个宏在moduleparam.h中定义,module_param需要三个参数,如:module_param(who, charp, S_IRUGO);
第一参数是变量的名称、第二个参数是变量的类型、第三个是访问权限,S_IRUGO是任何人均可读,但不能修改。
3、内核支持的模块参数类型有bool、invbool、charp(字符指针)、int、long、short、uint、ulong、ushort
4、模块装载器还支持数组参数,但是比较特殊,需要用下面这个宏来声明
module_param_array(name,type,num,perm);
其中,name是数组的名称,type是数组元素的类型,num是一个整数变量,而perm是常见的访问权限
Makefile编写与上一篇文章基本相同,只需修改obj-m :=hello.o改为obj-m :=hellop.o即可。
实验操作步骤:
一、虚拟机上的操作
1、建立一个单独的文件夹用于存放hellop模块以及Makefile(方便开发)
2、编译模块,拷贝模块到制作好的NFS文件系统。
二、开发板上的操作
[\u@\h \W]# insmod hellop.ko howmany=10 who="lwj"
(0) hello,lwj
(1) hello,lwj
(2) hello,lwj
(3) hello,lwj
(4) hello,lwj
(5) hello,lwj
(6) hello,lwj
(7) hello,lwj
(8) hello,lwj
(9) hello,lwj
[\u@\h \W]# rmmod hellop
goodbye world
结束语:
在这里先给大家说明点,这二节都比较简单,陆续的文章将会呈现难度逐渐增加的驱动分析。只要大家坚持下来,一定能学会驱动,最后,祝大家学习愉快。