- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何编写Linux 设备驱动程序
如何编写Linux 设备驱动程序
如如何何编编写写LLiinnuuxx设设备备驱驱动动程程序序
Linux 是Unix操作系统的一种变种,在Linux 下编写驱动程序的原理和思想
完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的
区别。在Linux 环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但
是支持函数少,只能依赖kernel 中的函数,有些常用的操作要自己来编写,而且
调试也不方便。
以下的一些文字主要来源于khg,johnsonm的Writelinuxdevicedriver,
Brennans GuidetoInlineAssembly,TheLinux A-Z,还有清华BBS上的有关device
driver的一些资料。
一、Linux devicedriver 的概念
系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统
内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样
在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一
样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:
1。对设备初始化和释放。
2。把数据从内核传送到硬件和从硬件读取数据。
3。读取应用程序传送给设备文件的数据和回送应用程序请求的数据。
4。检测和处理设备出现的错误。
在Linux 操作系统下有三类主要的设备文件类型,一是字符设备,二是块设
备,三是网络设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请
求时,实际的硬件I/O 一般就紧接着发生了,块设备则不然,它利用一块系统内
存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如
果不能,就调用请求函数来进行实际的I/O 操作。块设备是主要针对磁盘等慢速
设备设计的,以免耗费过多的CPU时间来等待。
已经提到,用户进程是通过设备文件来与实际的硬件打交道。每个设备文件
都都有其文件属性(c/b),表示是字符设备还是块设备?另外每个文件都有两个设
备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个
设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他
们。设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,
否则用户进程将无法访问到驱动程序。
最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不
再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返回后才能进行
其他的工作。如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,
然后就是漫长的fsck。
读/写时,它首先察看缓冲区的内容,如果缓冲区的数据
如何编写Linux 操作系统下的设备驱动程序
二、实例剖析
我们来写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它
可以了解Linux 的设备驱动程序的工作原理。把下面的C代码输入机器,你就会
获得一个真正的设备驱动程序。
#define __NO_VERSION__
#include linux/modules.h
#include linux/version.h
charkernel_version []=UTS_RELEASE;
这一段定义了一些版本信息,虽然用处不是很大,但也必不可少。Johnsonm
说所有的驱动程序的开头都要包含linux/config.h,一般来讲最好使用。
由于用户进程是通过设备文件同硬件打交道,对设备文件的操作方式不外乎
就是一些系统调用,如 open,read,write,close…, 注意,不是fopen, fread,
但是如何把系统调用和驱动程序关联起来呢?这需要了解一个非常关键的数据结
构:
struct file_operations
{
int(*seek)(structinode* ,structfile*, off_t ,int);
int(*read)(structinode* ,structfile*, char ,int);
int(*write)(structinode* ,struct file*, off_t ,int);
int(*readdir)(struct
文档评论(0)