全部博文(16)
分类: LINUX
2008-12-23 16:02:16
一.设备驱动简介
系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件只是个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。
设备驱动程序是内核的一部分,它完成以下的功能
第一. 对设备初始化和释放
第二. 把数据从内核传送到硬件,从硬件读取数据。
第三. 读取应用程序传送给设备文件的数据和回送应用程序请求的数据
第四. 检测和处理设备出现的错误
在Linux操作系统下有两类主要的设备文件:一种是字符设备,另一种是块设备。
字符设备和块设备的主要区别在于:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了;而块设备就不同,它利用一块系统内存作缓冲区,如果用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的cpu时间来等待。
用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都有其文件属性(c/b),如表示是字符设备还是块设备。另外每个文件都有两个设备号,第一个是主设备号,用于标识驱动程序;第二个是从设备号,用于标识使用同一个设备驱动程序的不同的硬件设备。设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序
最后,在用户进程调用驱动程序时系统进入核心态,这时不再是抢先式调度,也就是说,系统必须在完成当前驱动程序的子函数返回后才能进行其他工作。设备驱动程序是内核的一部分,硬件驱动程序是操作系统最基本的组成部分,在Linux内核源程序中占有60%以上,因此,熟悉驱动的编写是很重要的。
二.设备驱动程序的特点
Linux中的设备驱动程序有如下的特点:
1. 内核代码
设备驱动程序是内核的一部分,如果驱动程序出错,则可能导致系统崩溃
2. 内核接口
设备驱动程序必须为内核或者其子系统提供的一个标准接口。比如,一个终端驱动程序必须为内核提供一个文件I/O接口;一个SCSI设备驱动程序应该为SCSI子系统提供一个SCSI设备接口,同时SCSI子系统也必须为内核提供文件的I/O接口及缓冲区。
3. 内核机制和服务
设备驱动程序使用一些标准的内核服务,如内存分配等等
4. 可装载
大多数的Linux 操作系统设备驱动程序都可以在需要时装载进内核,在不需要时从内核中卸载。
5. 可设置
Linux 操作系统设备驱动程序可以集成为内核的一部分,并可以根据需要把其中的某一部分集成到内核中,这只需要在系统编译时进行相应的设置即可
6. 动态性
在系统启动且各个设备驱动初始化后,驱动程序将维护其控制的设备。如果该设备驱动程序控制的设备不存在也不影响系统的运行,那么此时的设备驱动程序只是多占了一点系统内存