`
love19820823
  • 浏览: 935765 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

这本书和《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;

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics