模块的初始化和关闭,注册和注销

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刻录设备。

当一个新的、不常见的应检出现时,在研究如何管理的时候可以使用用户空间的驱动,一旦成熟了以后还是改到内核模块比较好。

 

posted @ 2013-12-25 20:51  tony7373  阅读(445)  评论(0编辑  收藏  举报