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


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

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

  • 相关阅读:
    输出宽字符数组 C++
    python并发编程之多线程2------------死锁与递归锁,信号量等
    python并发编程之多线程1
    初始线程(相关理论)
    python并发编程之多进程2-------------数据共享及进程池和回调函数
    python并发编程之多进程1-----------互斥锁与进程间的通信
    Cpython支持的进程与线程
    进程理论基础
    函数嵌套复习
    python中if __name__ == '__main__'的说明
  • 原文地址:https://www.cnblogs.com/hxu7373/p/3491352.html
Copyright © 2020-2023  润新知