欢迎来到天天文库
浏览记录
ID:24876436
大小:466.50 KB
页数:73页
时间:2018-11-16
《第11讲 linux驱动程序设计》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、第十一讲Linux驱动程序设计授课班级:07计算机专业授课教师:王震主要内容设备驱动的基本原理设备驱动的编写方法2.6内核设备模型框架设备驱动中的中断处理方法ChavezWang@Gmail.com2嵌入式系统研究室设备驱动的基本原理-1嵌入式系统研究室3ChavezWang@Gmail.comUSERAPPVFSDEVICEopfuncDEV_REGISTERHARDWARE用户空间内核空间设备驱动设备文件与设备文件系统Linux中,字符设备和块设备都是通过文件节点进行访问。每个设备对应一个文件
2、名,操作时对应各自的驱动程序。设备文件与设备文件系统Linux系统靠主次设备号来联系驱动程序和设备文件节点,依靠主设备号标志不同的驱动程序注册Linux设备号的方法为避免不同的驱动程序具有相同的设备号,需要提供一种分配设备号的机制每个驱动程序分配一个主设备号:不可行,Linux最多支持255个主设备根据/proc/devices中的对应关系,用脚本动态的创建设备文件:太麻烦,程序员不愿意设备文件系统自动管理注册Linux设备号的方法系统启动时,会把设备驱动程序挂载在/dev/目录下,Linux设备
3、文件的创建和删除、目录层次都都由各个设备驱动程序管理/dev/下面每个文件都动态对应了一个系统上存在的设备驱动程序。新添加(或者删除)一个设备,比如u盘,系统就会自动在/dev目录中创建(或者删除)对应的设备节点。注册Linux设备号的方法在设备文件系统中,由于分的比较细致,一些驱动程序的对应目标跟以前比一样,如:Linux2.4之前:/dev/fb0/dev/ttyS0Linux2.6之后:/dev/fb/0/dev/tts/0可以用符号链接进行更改,以便与之前的相匹配:ln-s/dev/fb/
4、0/dev/fb0ls-s/dev/tts/0/dev/ttyS0设备驱动的基本原理-2设备分类字符设备:存取时没有缓存、只能顺序读/写的设备。可通过设备文件节点被访问与普通文件的区别:普通文件的访问可以前后移动访问指针,而大多数字符设备不支持该操作。典型的字符设备鼠标键盘串口嵌入式系统研究室4ChavezWang@Gmail.com设备驱动的基本原理-3设备分类块设备:一般块设备都有缓存支持,并且支持随机存取创建的块设备硬盘软盘ramdisk嵌入式系统研究室5ChavezWang@Gmail.c
5、om设备驱动的基本原理-4设备分类网络设备:从BSDUNIX网络组件移植而来。网络设备没有对应地映射到文件系统的设备节点。在Linux中,网络设备的访问采用Socket机制实现嵌入式系统研究室6ChavezWang@Gmail.com设备驱动的基本原理-5设备号:Linux采用主设备号和次设备号来标志一个具体设备。主设备号用来标志设备类型次设备号用来区分不同的具体设备系统创建一个设备驱动程序时,设备驱动需要使用一个主设备号向内核注册此驱动。创建一个设备节点的方法:mknod设备名设备类型主设备号次
6、设备号例:mknodttyS0c644嵌入式系统研究室7ChavezWang@Gmail.com设备驱动的基本原理-6-内核模块内核模块的概念:内核模块是一些可以让操作系统内核在需要时载入和执行的代码,不需要时可以从操作系统中卸载内核模块是Linux内核运行时动态扩展的一种技术,可以在Linux内核运行期间向内核动态添加代码,扩展内核的功能嵌入式系统研究室8ChavezWang@Gmail.com设备驱动的基本原理-7-内核模块内核模块与应用程序加载的不同:内核模块的加载只是向内核预先注册自己以便
7、服务于将来的某个请求,只是加载了某项功能,而不需要马上执行应用程序加载后就开始执行内核模块不能使用外部函数库,只能使用内核导出的函数应用程序可以使用外部函数库内核模块只能运行在内核空间,并且不生成新的进程应用程序运行在用户空间,一般一个应用程序生成一个新的进程嵌入式系统研究室9ChavezWang@Gmail.com设备驱动的基本原理-8-内核模块内核模块的框架#include#include#include8、>MODULE_LICENSE("DualBSD/GPL");staticinthello_init(void){printk(KERN_ALERT"Hello,world");return0;}staticvoidhello_exit(void){printk(KERN_ALERT"Goodbye,world");}module_init(hello_init);module_exit(hello_exit);嵌入式系统研究室10ChavezWang@Gmail.com设
8、>MODULE_LICENSE("DualBSD/GPL");staticinthello_init(void){printk(KERN_ALERT"Hello,world");return0;}staticvoidhello_exit(void){printk(KERN_ALERT"Goodbye,world");}module_init(hello_init);module_exit(hello_exit);嵌入式系统研究室10ChavezWang@Gmail.com设
此文档下载收益归作者所有