模块的初始化和关闭,注册和注销
1、初始化
static int __init initialization_function(void) {......};
module_init(initialization_function);
static的声明是为了说明这种函数在特定文件外没有其他的意义。该函数仅在初始化期间使用,在模块被装载后,模块装载器就会把初始化函数扔掉。
用来描述新设备的数据结构指针被传递到内核注册函数的参数中,而数据结构通常指向模块函数的指针,因此模块体中的函数就会在恰当时候被内核的函数调用。
2、注册设备包括:串口、杂项设备、sysfs入口、/proc文件、可执行域、线路规程等。
3、清除函数
static void __exit cleanup_fuction(void)
module_exit(cleanup_function)
4、初始化时候的错误处理。使用goto语句。
5、在用来某个设备的所有内部初始化完成之前,不要注册任何设备。因为在注册完成之后,设备的某些部分就会有可能被立即使用,也就是说,如果初始化还没有完成而已经注册了设备,那么内核就可能调用我们的模块。
6、不同的系统,模块驱动程序的参数需求会不一样。这些参数可以在insmod和modprobe命令装载模块时赋值。
参数必须用module_param宏来声明,在moduleparam.h中定义,它需要三个参数:变量名称、类型、sysfs入口项的访问许可掩码。
7、模块装载器支持数组参数,module_param_array(name,type,num.perm); perm是常见的访问许可值,在<linux/stat.h>中定义,用来控制谁能访问sysfs中对模块参数的表述。设置为S_IRUGO,表示不能修改,S_IRUGO|S_IWUSR只允许被root用户修改。
在用户空间编写程序的缺点:
1、响应慢
2、中断在用户空间不可用。
3、只用mmap映射/dev/mem才能访问内存
比较好的应用:SCSI少扫描设备、CD刻录设备。
当一个新的、不常见的应检出现时,在研究如何管理的时候可以使用用户空间的驱动,一旦成熟了以后还是改到内核模块比较好。