《Linux设备驱动程序》前两章 设备驱动程序 即构造和运行模块:读书笔记

来源:互联网 发布:b站的优质up主 知乎 编辑:程序博客网 时间:2024/06/14 10:19

这本书和《Linux内核分析》一起对于Linux的讲解比较透彻。《Linux内核分析》侧重有讲源代码,《Linux设备驱动程序》侧重于锻炼一个Linux黑客,理解与实现Linux驱动程序的开发。
     理解Linux的内核模块的作用,之所以将其分为模块,是可以将其更高效地执行,模块可以在需要的时候载入内核(内存中),可以在不需要的时候从内核中删除rmmod,从而达到内存空间的充分利用。在涉及内核模块载入时,insmod可以直接载入模块;但是当该模块涉及到其他模块的一些内核符号(在内核符号表中)时,应该使用modprobe工具,它会考虑要装入的模块是否引用了一些当前内核不存在的符号,如果有这类引用,则会在当前模块搜索路径中查找定义了这些符号的其他模块。 r

    机制与策略。机制是“要实现什么功能”,策略是“怎么实现这个功能”。驱动程序关注的是机制,而不是策略。 
     驱动程序分为内核态和用户态,但一般是内核驱动程序,当然也有用户态驱动程序。用户态驱动程序有一个非常优越的优点:就是非常适合于开发使用,这样不会在驱动程序崩溃时搞死系统。

     内核符号的导出到内核符号表中:EXPORT_SYMBOL(symbol)
      module_init(init_function);  //insmod 执行的函数
      module_exit(exit_function); //rmmod 执行的函数
      module_param(variable,type,perm); //perm 是访问许可值在<linux/stat.h>
      module_param_array(name,type,num,perm);//传递的数组参数。num是数组内部数据的个数
      内核维持struct task_struct *current;结构指针,指向当前的进程。

      _ _init 函数类型修饰符 说明 这个函数只是在初始化过程中使用,如果初始化函数执行完毕则释放该函数用到的所有空间。但是如果初始化函数的一些变量在初始化完成后还需要使用,那么不能用_ _init修饰。
     在注册失败后,需要释放之前已经注册成功的内容(应该逆序将已经注册好的 unregistere)。 
     int _ _int my_init_function(void)
     {
            int err;
            err= register_this(ptr1,”skull”);
            if(err) goto fail_this;
            err=register_that(ptr2,”skull”);
           if(err) goto fail_that;
           err= register_those(ptr3,”skull”);
           if(err) goto fail_those;

           return 0;
    fail_those:unregister_that(ptr2,”skull”);
   fail_that: unregister_this(ptr1,”skull”);
   fail_this:return err;

     }

原创粉丝点击