#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");// 是用来告知内核, 该模块带有一个自由的许可证; 没有这样的说明, 在模块加载时内核会抱怨.
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");//printk 函数在 Linux 内核中定义并且对模块可用
// 在 insmod 加载了它之后, 模块被连接到内核并且可存取内核的公用符号
//字串 KERN_ALERT 是消息的优先级
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);//特别的内核宏来指出这两个函数的角色,
//一个在模块加载到内核时被调用( hello_init )以及一个在模块被去除时被调用( hello_exit )
module_exit(hello_exit);
最后 你可以用 insmod 和 rmmod 工具来测试这个模块. 注意只有超级用户可以加载和卸载模块.
EXPORT_SYMBOL(name);
EXPORT_SYMBOL_GPL(name);
上面宏定义的任一个使得给定的符号在模块外可用. _GPL 版本的宏定义只能使符号对 GPL 许可的模块可用.
可以在模块中包含的其他描述性定义有
MODULE_AUTHOR ( 声明谁编写了模块 ),
MODULE_DESCRIPION( 一个人可读的关于模块做什么的声明 ),
MODULE_VERSION ( 一个代码修订版本号; 看 <linux/module.h> 的注释以便知道创建版本字串使用的惯例),
MODULE_ALIAS ( 模块为人所知的另一个名子 ), 以及
MODULE_DEVICE_TABLE ( 来告知用户空间, 模块支持那些设备 ).
#include <linux/moduleparam.h>
module_param(variable, type, perm);要想在 sysfs下可见(可以在模块加载时修改的参数),必须通过宏 module_param 来显式声明,该宏有三个参数,第一个为参数名,即已经定义的变量名,第二个参数则为变量类型,可用的类型有 byte, short, ushort, int, uint, long, ulong, charp 和 bool 或 invbool,分别对应于 c 类型 char, short, unsigned short, int, unsigned int, long, unsigned long, char * 和 int,用户也可以自定义类型 XXX(如果用户自己定义了 param_get_XXX,param_set_XXX 和 param_check_XXX)。该宏的第三个参数用于指定访问权限,如果为 0,该参数将不出现在 sysfs 文件系统中,允许的访问权限为 S_IRUSR, S_IWUSR,S_IRGRP,S_IWGRP,S_IROTH 和 S_IWOTH 的组合,它们分别对应于用户读,用户写,用户组读,用户组写,其他用户读和其他用户写,因此用文件的访问权限设置是一致的。 module_param(my_invisible_int, int, 0);//第三个参数设置为0,参数不可见
MODULE_PARM_DESC(my_invisible_int, "An invisible int under sysfs");//仅仅是个描述语句。
module_param(my_visible_int, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
MODULE_PARM_DESC(my_visible_int, "An visible int under sysfs");
module_param(mystring, charp, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
MODULE_PARM_DESC(mystring, "An visible string under sysfs");假设一个模块内部定义如上,那么可以用下面的命令来修改模块内部的可见参数。
$ insmod ./module-param-exam.ko my_invisible_int=10 my_visible_int=20 mystring="Hello,World"//插入模块时设置参数my_invisible_int = 10my_visible_int = 20mystring = 'Hello,World'$ ls /sys/module/module_param_exam/parameters/ //显示可见的参数mystring my_visible_int$ cat /sys/module/module_param_exam/parameters/mystring //显示参数的值Hello,World$ cat /sys/module/module_param_exam/parameters/my_visible_int20$ echo 2000 > /sys/module/module_param_exam/parameters/my_visible_int //通过管道给参数传值$ cat /sys/module/module_param_exam/parameters/my_visible_int //显示传值之后的结果2000$ echo "abc" > /sys/module/module_param_exam/parameters/mystring$ cat /sys/module/module_param_exam/parameters/mystringabc$ rmmod module_param_exam //退出模块my_invisible_int = 10my_visible_int = 2000mystring = 'abc'