读完《深入嵌入式Linux驱动编写》,自己写完中断、tasklet、工作队列、异步通知、等待事件等等以后,会觉得驱动的东西很简单,无非就是架构好框架,调用几个系统函数,没什么技术含量,这次读了alessandro和jonathan合写的《linux设备驱动程序》之后,深感自己无知,之前遗漏的点准备再整理下
问题一:put_usr和
答:见网页
put_user、get_user、copy_to_user、copy_from_user函数浅析
问题二:devfs是什么
答:见网页 linux devfs初探
问题三:驱动调试的另外一片天地
答:(1)加asm/current和Linux/sched头文件,可以调用当前进程ID(current->ID)和命令名(current->pid)
(2)多核运行预定义#define __SMP__
(3)Linux系统调用都带有sys_前缀,sys_create_module(),get_kernel_syms(), sys_init_module()。
(4)/pro/modules出来的信息表示模块名、模块使用内存的字节数、模块的当前使用计数等
(5)/pro/ioports,属于某个驱动程序或者设备的端口范围+驱动程序或者设备名
问题四:驱动程序员的注意要点
答:编写访问硬件的内核代码时不要给用户强加任何策略。因为用户有不同的需求,驱动程序应该处理如何使硬件可用的问题(并发、内存、用户函数库)。保持三方面的因素:提供用户尽量多的选项、编写驱动程序占用尽量少的时间以及尽量保持程序简单而不至于错误丛生。
问题五:设备类型分类
答:字符型、块设备、网络设备(相关联的模块也是这么分的)
问题六:系统框架图
答:
问题七:linux-kernel资源和邮件
http://www.tux.org/lkml
问题八:多核(SMP)引发的竞态问题
答:对多核最直接的影响是系统程序不只是运行了在一个内核中,这个就是真正多线程的开始(不是以前的单核多线程,运行的永远只有一个),具体分析见文章多核计算与程序设计
问题九:使用全局计数count的重要性
答:使用全局计数能够确定模块是否安全的卸载
问题十:编写小技巧
答:(1)__init的使用使得在初始化完成之后,丢弃初始化函数饼干回收他使用的内存,__exit用在直接链接内核的驱动程序中,他将忽略所标记的函数,而用在模块中的时候没有任何作用(注意),在模块中使用的是release
问题十一:内存的使用和释放
答:kmalloc和kfree(典型的驱动程序是读写IO端口和IO内存)
问题十二:IO编程和内存编程使用的注册函数
答:check_region,request_region,release_region (linux/ioport.h中)
check_mem_region,request_mem_region,release_mem_region (linux/ioport.h中)
问题三:驱动在运行的时候能输入参数?
答:是的。在驱动函数中定义相关参数
int skull_ivall=0;
char skull_sval;
MODULE_PARM(skull_ivall,"i");
MODULE_PARM(skull_sval,"s");
b,一个字节
h,短整型
i,整型
l,长整型