如何编写linux设备驱动程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何编写linux设备驱动程序
一、linux device driver 概念
二、实训剖析
如何编写linux设备驱动程序
①在linux下编写驱动程序完全类似于unix系统。与DOS或window环境下的驱动程序有很大区别。
②在linux环境下设计驱动程序。思想简洁,操作方便,功能也很强大。但支持函数少只能依赖kelmel中的函数。有些常用操作要自己来编写而且调试也不方便。
一、linux device driver 概念
①系统调用是操作系统内核和应用程序之间的接口。
②设备驱动是操作系统内核和机器硬件之间的接口。
③设备驱动程序为应用程序屏蔽了硬件的细节。这样应用程序看起来,硬件设备只是一个设备文件。应用程序可以像操作普通文件一样对硬件设备进行操作。
④设备驱动程序是内核的一部分,他完成以下功能:
a.对设备初始化和释放。
b.把数据从内核送到硬件和从硬件读取数据。
c.读取应用程序传送设备文件的数据和回送应用程序请求的数据。
d.监测和处理设备出现的错误。
Linux操作系统下有三类主要的设备文件类型:一是字符设备;
二是块设备;
三是网络设备;
①字符设备和块设备的主要区别是:在对字符设备发出读写请求时,实际的硬件I/O一般就是紧接着发生了,块设备则不然,他利用一块系统内存作缓冲区。当用户进程对设备请求能满足用户的要求,就返回请求的数据。如果不能,则调用请求函数来进行实际的I/O操作。块设备主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。
②用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都有其文件属性(c/b)表示是字符设备还是块设备。
③另外每个文件都有两个设备号,标识使用同一个设备驱动程序不同的硬件设备,比如有两软盘就可以用从设备号来区分。
④设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程无法访问到驱动程序。
⑤用户进程调用驱动程序时,系统进入核心状态,这时不再时???调度,也就是说系统必须在你的驱动程序的子函数返回后才能进行其他的工作,如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了。
读写是,它首先查看缓冲区的内容。
如何编写linux操作系统F的设备驱动程序。
二实例剖析
一个最简单的字符设备驱动程序,什么也不做。通过了解linux的设备驱动程序的工作原理。把下面C代码输入机器,就会获得一个真正的设备驱动程序。
#define_No_ VERsioN_ ①定义了一些版本??,虽然用处不大,
但也必不可少
#include
#include
③由于用户进程是通过设备文件同硬件打交道,对设备文件的方式不外乎就是一些系统调用。如Open,rcad,urife,clos e……如何把系统调用和驱动程序关联起来呢?需要了解一个非常关键的数据结构。
Strut file_operatlong
{int (*seek)(sthut;node* sehut file*,off_t,int);
.
.
.
} 其中.rcul、wille、open、releare、iocell、close.
{填出相应的?式}
说明:①结构中每一个成员的名字都对应着一个系统调用。用户进程利用系统调用又对设备文件进行诸如real/write操作时,系统调用通过设备文件的主设备号找到相应的驱动程序,然后读取这个数据结构相对应的函数指针,接着把控制权交给该函数Linux设备驱动的工作原理。
②既然是这样,则便携设备驱动程序的主要工作就是编写子函数,并填充file-operation的各个域。
下面开始写字程序
#include
#include
#include
#include
#include
Unsigned int test_major=0;
Stat ic i nt r ead_te st(str cut ino de *nod e,s thu ct f ile*f ile,ch ar*bu f,i nt l oru nt) { in t l eft;
If(re rif y_a lea(VE RIF`l_WRI TE,buf,lo run t)==-EFAULT)
Return -EFAULT; {?记某个区域
内数据属否有
for (left=lonut;left>0;left--) 效函数}
{_put_us (1,buf,1); (内核空间数据-)用户
空间中内核
Buf++; 函数
}
Return Cont; 内核空间数据传送到用户空间}
说明:①这个函数是为r ead调用准备的,当调用re ad时,re ad_tes t()被调用,他把用户缓冲区全都写1,buf是re ad调用的一个参数,它是用户空间的一个地址。但在rea d_t est被调用时,系统进入核心态,所以不能使用buf这个地址。必须使_p ut_us( )这是ke rmel提供一个函数,用于同用户传送数据,另外还有很多类是功能的函数。请参考?在向用户空间拷贝数据之前,必须验证buf是否可用,这就用到函数Ver ify_ar ea
Stat ic int wr ite_te st(str uct i nod e *ino de,stl uct f ile *fil e,C ons t cha r *bu f,i nt