第6章简单的字符设备驱动程序分析.ppt

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

第6章 简单的字符设备驱动程序 在Linux设备驱动程序的家族中,字符设备驱动程序是较为简单的驱动程序,同时也是应用非常广泛的驱动程序。所以学习字符设备驱动程序,对构建Linux设备驱动程序的知识结构非常的重要。本章将带领读者编写一个完整的字符设备驱动程序。 6.1 字符设备驱动程序框架 本节对字符设备驱动程序框架进行了简要的分析。字符设备驱动程序中有许多非常重要的概念,下面将从将从最简单的概念讲起:字符设备和块设备。 6.1.1 字符设备和块设备 Linux系统将设备分为3种类型:字符设备、块设备和网络接口设备。其中字符设备和块设备难以区分,这里将对其进行重要讲解。 1.字符设备 2.块设备 3.字符设备和块设备的区分 6.1.2 主设备号和次设备号 一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。例如一个嵌入式系统,有两个LED指示灯,LED灯需要独立的打开或者关闭。那么,可以写一个LED灯的字符设备驱动程序,可以将其主设备号注册成5号设备,次设备号分别为1和2。这里,次设备号就分别表示两个LED灯。 6.1.3 申请和释放设备号 内核维护着一个特殊的数据结构,用来存放设备号与设备的关系。在安装设备时,应该给设备申请一个设备号,使系统可以明确设备对应的设备号。设备驱动程序中的很多功能,是通过设备号来操作设备的。这里,首先对申请设备号进行简述。 6.2 初识cdev结构 当申请字符设备的设备号后,这时,需要将字符设备注册到系统中,才能使用字符设备。为了理解这个实现过程,首先解释一下cdev结构体。 6.2.1 cdev结构体 在linux内核中使用cdev结构体来描述字符设备。该结构体是所有字符设备的抽象,其包含了大量字符设备所共有的特性。 6.2.2 file_operations结构体 file_operations是一个对设备进行操作的抽象结构体。linux内核的设计非常巧妙。内核允许为设备建立一个设备文件,对设备文件的所有操作,就相当于对设备的操作。这样的好处是,用户程序可以使用访问普通文件的方法,来访问设备文件,进而访问设备。这样的方法,极大地减轻了程序员的编程负担,程序员不必要去熟悉新的驱动接口,就能够访问设备。 6.2.3 cdev和file_operations结构体的关系 一般来说,驱动开发人员会将特定设备的特定数据放到cdev结构体后,组成一个新的结构体。如图6.3所示,“自定义字符设备”中就包含特定设备的数据。该“自定义设备”中有一个cdev结构体。cdev结构体中有一个指向file_operations的指针。这里,file_operations中的函数就可以用来操作硬件,或者“自定义字符设备”中的其他数据,从而起到控制设备的作用。 6.2.4 inode结构体 内核使用inode结构在内部表示文件。inode一般作为file_operations结构中函数的参数传递过来。例如,open函数将传递一个inode指针进来,表示目前打开的文件节点。需要注意的是,inode的成员已经被系统赋予了合适的值,驱动程序只需要使用该节点中的信息,而不用去更改。 6.3 字符设备驱动的组成 了解字符设备驱动程序的组成,对编写驱动程序非常有用。因为字符设备在结构上都有很多相似的地方,所以只要会编写一个字符设备驱动程序,那么相似的字符设备驱动程序的编写,就不难了。在linxu系统中,字符设备驱动程序由以下几个部分组成。 6.3.1 字符设备加载和卸载函数 在字符设备的加载函数中,应该实现字符设备号的申请和cdev的注册。相反,在字符设备的卸载函数中应该实现字符设备号的释放和cdev的注销。 cdev是内核开发者对字符设备的一个抽象。除了cdev中的信息外,特定的字符设备还需要特定的信息,常常将特定的信息放在cdev之后,形成一个设备结构体,如代码中的xxx_dev。 6.3.2 file_operations结构体和其成员函数 file_operations结构体中的成员函数都对应着驱动程序的接口,用户程序可以通过内核来调用这些接口,从而控制设备。大多数字符设备驱动都会实现read()、write()和ioctl()函数。 6.3.3 驱动程序与应用程序的数据交换 驱动程序和应用程序的数据交换是非常重要的。file_operations中的read()和write()函数,就是用来在驱动程序和应用程序间交换数据的。通过数据交换,驱动程序和应用程序可以彼此了解对方的情况。但是驱动程序和应用程序属于不同的地址空间。驱动程序不能直接访问应用程序的地址空间;同样应用程序也不能直接访问

文档评论(0)

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

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

1亿VIP精品文档

相关文档