《Essential Linux Device Drivers》第5章.doc

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《Essential Linux Device Drivers》第5章

第5章?字符设备驱动 字符设备驱动基础设备例子:系统CMOS检测数据可获得RTC?子系统伪字符驱动 ·Character Caveats ·查看源代码 现在,你已经准备就绪了,可以尝试去写一个简单、但实用的设备驱动了。在这一章,我们将深入字符设备驱动的内幕:顺序存取设备数据的内核代码。字符设备驱动能从如下几类设备获取原始的数据:如打印机、鼠标、看门狗、键盘、内存、实时时钟等,但它不适合用于以块方式存储的、随机访问的设备,如硬盘、软盘和光盘。字符设备驱动基础 让我们以自顶向下的方式开始字符设备驱动学习之旅。为了访问一个字符设备,系统用户需要调用相应的应用程序。此应用程序负责和设备交互,为了实现此目的,需要得到相应驱动的标识符。驱动通过/dev目录给用户提供接口: bash ls -l /dev total 0 crw------- 1 root root 5, 1 Jul 16 10:02 console ... lrwxrwxrwx 1 root root 3 Oct 6 10:02 cdrom - hdc ... brw-rw---- 1 root disk 3, 0 Oct 6 2007 hda brw-rw---- 1 root disk 3, 1 Oct 6 2007 hda1 ... crw------- 1 root tty 4, 1 Oct 6 10:20 tty1 crw------- 1 root tty 4, 2 Oct 6 10:02 tty2 ls命令输出结果的每一行的第一个字符表示驱动的类型:c表示字符设备驱动,b代表块设备驱动,l表示符号链接。第五列的数字是主设备号,第六列是次设备号。主设备号通常标识设备对应的驱动程序,次设备号用于确定驱动程序所服务的设备。例如,IDE块存储设备驱动/dev/had的主设备号为3,负责处理系统的硬盘;当进一步指明其次设备号为1时(/dev/hda1),它指向第一个硬盘分区。字符设备驱动与块设备驱动占用不同空间,因此可以将同一个主设备号分配给字符设备和块设备驱动。 让我们进一步深入字符设备驱动。从程序结构的角度看,字符设备驱动包括如下内容: !--[if !supportLists]--??????????!--[endif]--初始化例程init(),负责初始化设备并且将驱动和内核的其它部分通过注册函数实现无缝连接。 !--[if !supportLists]--??????????!--[endif]--入口函数(或方法)集,如open(),read(),ioctl(),llseek(),和write(),这些函数直接对应相应的的I/O系统调用,由用户应用程序通过对应的/dev节点调用。 !--[if !supportLists]--??????????!--[endif]--中断例程,底半部例程,定时器处理例程,内核辅助线程,以及其他的组成部分。它们大部分对用户应用程序是透明的。 从数据流的角度看,字符设备驱动包括如下关键的数据结构: !--[if !supportLists]--1.???????!--[endif]--特定设备相关的数据结构。此结构保存着驱动频繁使用的信息。 !--[if !supportLists]--2.???????!--[endif]--cdev结构,针对字符设备驱动的内核抽象。这个结构通常作为前面讨论过的特定设备相关pre-device)结构的成员。 !--[if !supportLists]--3.???????!--[endif]--file_operations结构,包括所有设备驱动入口函数的地址。 !--[if !supportLists]--4.??????!--[endif]--file结构,包括关联的/dev节点的信息。 设备例子:系统CMOS 让我们实现一个字符设备驱动以访问系统CMOS。在PC兼容的硬件上(见图5.1)BIOS使用CMOS存储系统信息,如启动选项,引导顺序,系统数据等,我们可以通过BIOS设置菜单对其进行配置。我们的CMOS设备驱动使你像访问普通文件一样访问两个PC CMOS块。应用程序可以在/dev/cmos/0和/dev/cmos/1上使用I/O系统调用从两个块存取数据。因为BIOS分配给CMOS域的存取粒度是比特级的,所以驱动程序能够进行比特级的访问。因此,read()可以获取指定数目的比特,并根据读取的比特数移动内部文件指针。 图?5.1. PC兼容系统的CMOS 通过两个I/O地址访问CMOS,一个索引寄存器和一个数据寄存器,如表5.1所示。你必须在索引寄存器中指定准备访

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档