字符设备驱动程序

字符设备驱动程序

ID:63305435

大小:74.38 KB

页数:39页

时间:2021-10-11

字符设备驱动程序_第1页
字符设备驱动程序_第2页
字符设备驱动程序_第3页
字符设备驱动程序_第4页
字符设备驱动程序_第5页
资源描述:

《字符设备驱动程序》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、第3章字符设备驱动程序本章的目标是编写一个完整的字符设备驱动程序。由于这类驱动程序适合于大多数简单的硬件设备,我们首先开放一个字符设备驱动程序。字符也相对比较好理解,比如说块设备驱动程序。我们的最终目标是写一个模块化的字符设备驱动程序,但本章我们不再讲述有关模块化的问题。本章通篇都是从一个真实的设备驱动程序截取出的代码块:这个设备就是scull,是“SimpleCharacterUtilityforLoadingLocalities”的缩写。尽管scull是一个设备,但它却是操作内存的字符设备。这种情况的一个副作用就是,只要涉及scull,“设备”这

2、个词就可以同“scull使用的内存区”互换使用。scull的优点是,由于每台电脑都有内存,所以它与硬件无关。scull用kmalloc分配内存,而且仅仅操作内存。任何人都可以编译和运行scull,而且scull可以移植到所有Linux支持的平台上。但另一方面,除了演示内核于字符设备驱动程序间的交互过程,可以让用户运行某些测试例程外,scull做不了“有用的”事。scull的设计编写设备驱动程序的第一步就是定义驱动程序提供给用户程序的能力(“机制”)。由于我们的“设备”是电脑内存的一部分,我做什么都可以。它可以是顺便存取设备,也可以是随机存取设备,可以

3、是一个设备,也可以是多个,等等。为了是scull更有用,可以成为编写真实设备的驱动程序的模板,我将向你展示如何在电脑的内存之上实现若干设备抽象操作,每一种操作都有自己的特点。scull的源码实现如下设备。由模块实现的每一种设备都涉及一种类型:精品资料scull0-34个设备,共保护了4片内存区,都是全局性的和持久性的。“全局性”是指,如果打开设备多次,所有打开它的文件描述符共享其中的数据。“持久性”是指,如果设备关闭后再次打开,数据不丢失。由于可以使用常用命令访问这个设备,如cp,cat以及shellI/O重定向等,这个设备操作非常有趣;本章将深入探

4、讨它的内部结构。scullpipe0-34个“fifo”设备,操作起来有点象管道。一个进程读取另一个进程写入的数据。如果有多个进程读同一个设备,他们彼此间竞争数据。通过scullpipe的内部结构可以了解阻塞型和非阻塞型读/写是如何实现的;没有中断也会出现这样的情况。尽管真实的驱动程序利用中断与它们的设备同步,但阻塞型和非阻塞型操作是非常重要的内容,从概念上讲与中断处理(第9章,中断处理,介绍)无关。scullsinglescullprivsculluidscullwuid这些设备与scull0相似,但在何时允许open操作时都不同方式的限制。第一个

5、(scullsingle)只允许一次一个进程使用驱动程序,而scullpriv对每个虚拟控制台是私有的(每个设备对虚拟控制台是私有的)。sculluid和scullwuid可以多次打开,但每次只能有一个用户;如果另一个用户锁住了设备,前者返回-EBUSY,而后者则实现为阻塞型open。通过这些可以展示如何实现不同的访问策略。每一个scull设备都展示了驱动程序不同的功能,而且都不同的难度。本章主要讲解scull0-3的内部结构;第5章,字符设备驱动程序的扩展操作,将介绍更复杂的设备:“一个样例实现:scullpipe”介绍scullpipe,“设备文

6、件的访问控制”精品资料介绍其他设备。主设备号和次设备号通过访问文件系统的名字(或“节点”)访问字符设备,通常这些文件位于/dev目录。设备文件是特殊文件,这一点可以通过ls-l输出的第一列中的C”标明,它说明它们是字符节点。/dev下还有块设备,但它们的第一列是“b”;尽管如下介绍的某些内容也同样适用于块设备,现在我们只关注字符设备。如果你执行ls命令,在设备文件条目的最新修改日期前你会看到两个数(用逗号分隔),这个位置通常显示文件长度。这些数就是相应设备的主设备号和次设备号。下面的列表给出了我使用的系统上的一些设备。它们的主设备号是10,1和4,而

7、次设备号是0,3,5,64-65和128-129。(代码)主设备号标识设备对应的驱动程序。例如,/dev/null和/dev/zero都有驱动程序1管理,而所有的tty和pty都由驱动程序4管理。内核利用主设备号将设备与相应的驱动程序对应起来。次设备号只由设备驱动程序使用;内核的其他部分不使用它,仅将它传递给驱动程序。一个驱动程序控制若干个设备并不为奇(如上面的例子所示)――次顺便号提供了一种区分它们的方法。向系统增加一个驱动程序意味着要赋予它一个主设备号。这一赋值过程应该在驱动程序(模块)的初始化过程中完成,它调用如下函数,这个函数定义在

8、x/fs.h>:(代码)返回值是错误码。当出错时返回一个负值;成功时返回零或正值。参数major是所请求的主

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

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

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