如何编写Linux设备驱动程序39621

如何编写Linux设备驱动程序39621

ID:41647090

大小:62.71 KB

页数:9页

时间:2019-08-29

如何编写Linux设备驱动程序39621_第1页
如何编写Linux设备驱动程序39621_第2页
如何编写Linux设备驱动程序39621_第3页
如何编写Linux设备驱动程序39621_第4页
如何编写Linux设备驱动程序39621_第5页
资源描述:

《如何编写Linux设备驱动程序39621》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、如何编写Linux设备驱动程序序言Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window坏境下的驱动程序有很大的区别。在Linux环境卜设计骡动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel中的函数,有些常用的操作耍口己来编写,而且调试也不方便。本人这几周来为实验室口行研制的一块多媒休卡编制了驱动程序,获得了一些经验,愿与Linuxfans共亨,有不当之处,请予指正。以卜的一些文字主要来源于khg,johnsonm的Writelin

2、uxdevicedriver,Brennan'sGuidetoInlineAssembly,TheLinuxA■乙还有清华BBS上的有关devicedriver的一•些资料.这些资料有的已经过时,有的还有一些错课,我依据H己的试验结果进行了修正.一、Linuxdevicedriver的概念系统调川是操作系统内核和应川程序之间的接口,设备驱动程序是操作系统内核和机器硕件Z间的接口•设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硕件设备只是一个设备文件,应川程序可以象操作普通文件一样对硬件设备进行操作•设备张动程序是内核的一部分

3、,它完成以下的功能:1•对设备初始化和释放.2.把数据从内核传送到硬件和从硬件读取数据.3•读取应川程序传送给设备文件的数据和回送应川程序请求的数据.4.检测和处理设备岀现的错误.在Linux操作系统下有两类主耍的设备文件类型,一种是字符设备,另一种是块设备.字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硕件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返凹请求的数据,如果不能,就调用请求函数来进行实际的I/O操作.块设备是主要针对磁盘等慢速设备设计的,以免

4、耗费过多的CPU时间来等待.已经提到,用户进程是通过设备文件来与实际的硬件打交道•每个设备文件都都有其文件属性(c/b),表示是字符设备还蓉强檣璞?另外每个文件都有两个设备号,笫一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号來区分他们•设备文件的的主设备号必须与设备驱动程序在登记时屮请的主设备号一致,否则用户进程将无法访问到驱动程序.最后必须捉到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度•也就是说,系统必须在你的驱动程序的了函数返冋示才

5、能进行其他的工作•如果你的驱动程序陷入死循坏,不幸的是你只有重新启动机器了,然后就是漫长的fsck.//hehe读/写时,它首先察看缓冲区的内容,如果缓冲区的数据如何编写Linux操作系统卜的设备驱动程序二、实例剖析我们來写一个最简单的字符设备骡动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理.把下而的C代码输入机器,你就会获得一个真正的设备驱动程序•不过我的kernel是20.34,在低版本的kernel±可能会出现问题,我还没测试过.//xixi#define_NO_VERSION_#include

6、nux/modules.h>#includecharkernel_version[]=UTS_RELEASE;这一段定义了一些版木信息,虽然用处不是很大,但也必不可少.Johnsonm说所有的驱动程序的开头都要包含,但我看倒是未必.由于用户进程是通过设备文件同硬件打交道,对设备文件的操作方式不外乎就是一些系统调用,如open,read,write,close....,注意,不是fopen,fread,但是如何把系统调川和驱动程序关联起来呢?这需要了解一个非常关键的数据结构:

7、structfile_operations{int(seek)(structinode,structfileoff_t,int);int(read)(structinode,structfilechar,int);int(write)(structinode,structfileoff_t,int);int(readdir)(structinode,structfilestructdirent,int);int(select)(structinode,structfileint,select_table);int(ioctl)(struc

8、tinode,structfile,unsinedint,unsignedlong);int(mmap)(structinode,structfilestructvm_area_struct)

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。