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

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

ID:41655880

大小:61.76 KB

页数:9页

时间:2019-08-29

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

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

1、如何编写Linux设备驱动程序Linux是Unix操作系统的一种变种,在Linux下编吗驱动程序的原理和思想完全类似于莫他的Unix系统,但它dos或window环境.卜的驱动程序冇很大的区别。在Linux环境卜•设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel中的函数,冇些常用的操作要自己來编写,而且调试也不方便。一、Linuxdevicedriver的概念系统调用是操作系统内核和应用程序Z间的接口,设备驱动程序是操作系统内核和机器硬件Z间的接IL设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看來,駛件设备只是一个设备文件,应

2、用程序口J以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:k对设备初始化和释放。2o把数据从内核传送到硬件和从硬件读取数据。3。读取应用程序传送给设备文件的数据和回送应用程序请求的数据(设备驱动程序是内核的一部分)。4。检测和处理设备出现的错误。在Linux操作系统下有三类主要的设备文件类型,一是字符设备,二是块设备,三是网络设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件"0(数据的输入/输出)一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返冋请求的

3、数据,如果不能,就调用请求函数来进行实际的1/0(数据的输入/输出)操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。已经提到,用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都有其文件属性(c/b),表示是字符设备还是块设备?另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备駆动程序的不同的硕件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序。最后必须提到的是,在用户进程调用驱动程序时,系统进

4、入核心态,这时不再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返冋后才能进行其他的工作。如果你的驱动程序陷入死循环,不幸的是你只冇重新启动机器了,然后•就是漫长的fscko读/写时,它首先察看缓冲区的内容,如果缓冲区的数据满,则与缓冲区中的数据交换数据,如果缓冲区没有数据,则调用请求函数来进行实际的I/O操作,待缓冲区有数据后再进行操作。二、实例剖析我们來写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理。把下面的C代码输入机器,你就会获得一个真正的设备駅动程序。#define_NO_VERSION_#incl

5、ude#includecharkerneLversion[]=UTS.RELEASE;〃这个宏定义扩展成字符串,描述了这个内核树的版本•例如,”2632”.这一段定义了一些版本信息,虽然用处不是很大,但也必不可少。我们建议所有的驱动程序的开头都要包含,一般来讲最好使用。曲于用户进程是通过设备文件同硬件打交道,对设备文件的操作方式不外乎就是一些系统调用,女口open,read,write,close…,注意,不是fopen,fread,但是如何把系统调用和駆动程序关联起来呢?

6、这需要了解一个非常关键的数据结构:structfile_operationsint(*seek)(structinode*,structfileoff_t,int);int(*read)(structinode*,structfile*,char,int);int(*write)(structinode*,structfileoffLt,int);int(*readdir)(structinode*,structfile*>structdirent*,int);int(^select)(structinode*,structfileint,select_table*);i

7、nt(*ioctl)(structinode*,structfileunsinedint,unsignedlong);int(*mmap)(structinode*,structfilestructvm_area_struct*);int(*open)(structinode*,structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structinode*,structfile*);int(*fasync)(structinode*,structfil

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

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

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