Linux驱动开发入门与实战(第2版):第6章 简单的字符设备驱动程序

上传人:努力****83 文档编号:187569474 上传时间:2023-02-15 格式:PPT 页数:24 大小:105KB
收藏 版权申诉 举报 下载
Linux驱动开发入门与实战(第2版):第6章 简单的字符设备驱动程序_第1页
第1页 / 共24页
Linux驱动开发入门与实战(第2版):第6章 简单的字符设备驱动程序_第2页
第2页 / 共24页
Linux驱动开发入门与实战(第2版):第6章 简单的字符设备驱动程序_第3页
第3页 / 共24页
资源描述:

《Linux驱动开发入门与实战(第2版):第6章 简单的字符设备驱动程序》由会员分享,可在线阅读,更多相关《Linux驱动开发入门与实战(第2版):第6章 简单的字符设备驱动程序(24页珍藏版)》请在装配图网上搜索。

1、第第6 6章章 简单的字符设备驱动程序简单的字符设备驱动程序在在Linux设备驱动程序的家族中,字符设备驱动程序是设备驱动程序的家族中,字符设备驱动程序是较为简单的驱动程序,同时也是应用非常广泛的驱动程序。较为简单的驱动程序,同时也是应用非常广泛的驱动程序。所以学习字符设备驱动程序,对构建所以学习字符设备驱动程序,对构建Linux设备驱动程序的设备驱动程序的知识结构非常的重要。本章将带领读者编写一个完整的字符知识结构非常的重要。本章将带领读者编写一个完整的字符设备驱动程序。设备驱动程序。6.1 6.1 字符设备驱动程序框架字符设备驱动程序框架本节对字符设备驱动程序框架进行了简要的分析。字本节对

2、字符设备驱动程序框架进行了简要的分析。字符设备驱动程序中有许多非常重要的概念,下面将从将从最符设备驱动程序中有许多非常重要的概念,下面将从将从最简单的概念讲起:字符设备和块设备。简单的概念讲起:字符设备和块设备。6.1.1 6.1.1 字符设备和块设备字符设备和块设备Linux系统将设备分为系统将设备分为3种类型:字符设备种类型:字符设备、块设备和块设备和网络接口设备。其中字符设备和块设备难以区分,这里将对网络接口设备。其中字符设备和块设备难以区分,这里将对其进行重要讲解。其进行重要讲解。1字符设备字符设备2块设备块设备3字符设备和块设备的区分字符设备和块设备的区分6.1.2 6.1.2 主设

3、备号和次设备号主设备号和次设备号一个字符设备或者块设备都有一个主设备号和次设备一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。例如一个嵌入式系统,有两个各设备。例如一个嵌入式系统,有两个LED指示灯,指示灯,LED灯灯需要独立的打开或者关闭。那么,可以写一个需要独立的打开或者关闭。那么,可以写一个LED灯的字符灯的字符设备驱动程序,可以将其主设备号注册成设备驱动程序,可以将其主设备号

4、注册成5号设备,次设备号设备,次设备号分别为号分别为1和和2。这里,次设备号就分别表示两个。这里,次设备号就分别表示两个LED灯。灯。6.1.3 6.1.3 申请和释放设备号申请和释放设备号内核维护着一个特殊的数据结构,用来存放设备号与内核维护着一个特殊的数据结构,用来存放设备号与设备的关系。在安装设备时,应该给设备申请一个设备号,设备的关系。在安装设备时,应该给设备申请一个设备号,使系统可以明确设备对应的设备号。设备驱动程序中的很多使系统可以明确设备对应的设备号。设备驱动程序中的很多功能,是通过设备号来操作设备的。这里,首先对申请设备功能,是通过设备号来操作设备的。这里,首先对申请设备号进行

5、简述。号进行简述。6.2 6.2 初识初识cdevcdev结构结构当申请字符设备的设备号后,这时,需要将字符设备注当申请字符设备的设备号后,这时,需要将字符设备注册到系统中,才能使用字符设备。为了理解这个实现过程,册到系统中,才能使用字符设备。为了理解这个实现过程,首先解释一下首先解释一下cdev结构体。结构体。6.2.1 cdev6.2.1 cdev结构体结构体 在在linux内核中使用内核中使用cdev结构体来描述字符设备。该结结构体来描述字符设备。该结构体是所有字符设备的抽象,其包含了大量字符设备所共有构体是所有字符设备的抽象,其包含了大量字符设备所共有的特性。的特性。6.2.2 fil

6、e_operations6.2.2 file_operations结构体结构体file_operations是一个对设备进行操作的抽象结构体。是一个对设备进行操作的抽象结构体。linux内核的设计非常巧妙。内核允许为设备建立一个设备内核的设计非常巧妙。内核允许为设备建立一个设备文件,对设备文件的所有操作,就相当于对设备的操作。这文件,对设备文件的所有操作,就相当于对设备的操作。这样的好处是,用户程序可以使用访问普通文件的方法,来访样的好处是,用户程序可以使用访问普通文件的方法,来访问设备文件问设备文件,进而访问设备。这样的方法,极大地减轻了程进而访问设备。这样的方法,极大地减轻了程序员的编程负

7、担,程序员不必要去熟悉新的驱动接口,就能序员的编程负担,程序员不必要去熟悉新的驱动接口,就能够访问设备。够访问设备。6.2.3 cdev6.2.3 cdev和和file_operationsfile_operations结构体的关系结构体的关系一般来说,驱动开发人员会将特定设备的特定数据放一般来说,驱动开发人员会将特定设备的特定数据放到到cdev结构体后,组成一个新的结构体。如图结构体后,组成一个新的结构体。如图6.3所示,所示,“自定义字符设备自定义字符设备”中就包含特定设备的数据。该中就包含特定设备的数据。该“自定义设自定义设备备”中有一个中有一个cdev结构体。结构体。cdev结构体中有

8、一个指向结构体中有一个指向file_operations的指针。这里,的指针。这里,file_operations中的函数就可中的函数就可以用来操作硬件,或者以用来操作硬件,或者“自定义字符设备自定义字符设备”中的其他数据,中的其他数据,从而起到控制设备的作用。从而起到控制设备的作用。6.2.4 inode6.2.4 inode结构体结构体内核使用内核使用inode结构在内部表示文件。结构在内部表示文件。inode一般作为一般作为file_operations结构中函数的参数传递过来。例如,结构中函数的参数传递过来。例如,open函函数将传递一个数将传递一个inode指针进来,表示目前打开的文

9、件节点。指针进来,表示目前打开的文件节点。需要注意的是,需要注意的是,inode的成员已经被系统赋予了合适的值,的成员已经被系统赋予了合适的值,驱动程序只需要使用该节点中的信息,而不用去更改。驱动程序只需要使用该节点中的信息,而不用去更改。6.3 6.3 字符设备驱动的组成字符设备驱动的组成了解字符设备驱动程序的组成,对编写驱动程序非常了解字符设备驱动程序的组成,对编写驱动程序非常有用。因为字符设备在结构上都有很多相似的地方,所以只有用。因为字符设备在结构上都有很多相似的地方,所以只要会编写一个字符设备驱动程序,那么相似的字符设备驱动要会编写一个字符设备驱动程序,那么相似的字符设备驱动程序的编

10、写,就不难了。在程序的编写,就不难了。在linxu系统中,字符设备驱动程系统中,字符设备驱动程序由以下几个部分组成。序由以下几个部分组成。6.3.1 6.3.1 字符设备加载和卸载函数字符设备加载和卸载函数在字符设备的加载函数中,应该实现字符设备号的申在字符设备的加载函数中,应该实现字符设备号的申请和请和cdev的注册。相反,在字符设备的卸载函数中应该实现的注册。相反,在字符设备的卸载函数中应该实现字符设备号的释放和字符设备号的释放和cdev的注销。的注销。cdev是内核开发者对字符设备的一个抽象。除了是内核开发者对字符设备的一个抽象。除了cdev中中的信息外,特定的字符设备还需要特定的信息,

11、常常将特定的信息外,特定的字符设备还需要特定的信息,常常将特定的信息放在的信息放在cdev之后,形成一个设备结构体,如代码中的之后,形成一个设备结构体,如代码中的xxx_dev。6.3.2 file_operations6.3.2 file_operations结构体和其成员函数结构体和其成员函数file_operations结构体中的成员函数都对应着驱动程序结构体中的成员函数都对应着驱动程序的接口,用户程序可以通过内核来调用这些接口,从而控制的接口,用户程序可以通过内核来调用这些接口,从而控制设备。大多数字符设备驱动都会实现设备。大多数字符设备驱动都会实现read()、write()和和io

12、ctl()函数。函数。6.3.3 6.3.3 驱动程序与应用程序的数据交换驱动程序与应用程序的数据交换驱动程序和应用程序的数据交换是非常重要的。驱动程序和应用程序的数据交换是非常重要的。file_operations中的中的read()和和write()函数,就是用来在驱动程序函数,就是用来在驱动程序和应用程序间交换数据的。通过数据交换,驱动程序和应用程和应用程序间交换数据的。通过数据交换,驱动程序和应用程序可以彼此了解对方的情况。但是驱动程序和应用程序属于不序可以彼此了解对方的情况。但是驱动程序和应用程序属于不同的地址空间。驱动程序不能直接访问应用程序的地址空间;同的地址空间。驱动程序不能直

13、接访问应用程序的地址空间;同样应用程序也不能直接访问驱动程序的地址空间,否则会破同样应用程序也不能直接访问驱动程序的地址空间,否则会破坏彼此空间中的数据,坏彼此空间中的数据,从而造成系统崩溃,或者数据损坏。从而造成系统崩溃,或者数据损坏。6.3.4 6.3.4 字符设备驱动程序组成小结字符设备驱动程序组成小结字符设备是字符设备是3大类设备(字符设备、块设备、网络设备)大类设备(字符设备、块设备、网络设备)中较简单的一类设备,其驱动程序中完成的主要工作是初始中较简单的一类设备,其驱动程序中完成的主要工作是初始化、添加和删除化、添加和删除cdev结构体,申请和释放设备号,以及填充结构体,申请和释放

14、设备号,以及填充file_operation结构体中操作函数,并实现结构体中操作函数,并实现file_operations结构结构体中的体中的read()、write()、ioctl()等重要函数。等重要函数。6.4 VirtualDisk6.4 VirtualDisk字符设备驱动字符设备驱动从本章开始,后续的几章都将以一个从本章开始,后续的几章都将以一个VirtualDisk设备为设备为蓝本进行讲解。蓝本进行讲解。VirtualDisk是一个虚拟磁盘设备,在这个虚是一个虚拟磁盘设备,在这个虚拟磁盘设备中分配了拟磁盘设备中分配了8K的连续内存空间,并定义了两个端口的连续内存空间,并定义了两个端

15、口数据(数据(port1和和port2)。驱动程序可以对设备进行读写、控制)。驱动程序可以对设备进行读写、控制和定位操作,用户空间的程序可以通过和定位操作,用户空间的程序可以通过Linux系统调用访问系统调用访问VirtualDisk设备中的数据。设备中的数据。6.4.1 VirtualDisk6.4.1 VirtualDisk的头文件、宏和设备结构体的头文件、宏和设备结构体VirtualDisk驱动程序应该包含必要的头文件和宏信息,驱动程序应该包含必要的头文件和宏信息,并定义一个与实际设备相对应的设备结构体,相关的定义如并定义一个与实际设备相对应的设备结构体,相关的定义如下面的代码所示。下面

16、的代码所示。6.4.2 6.4.2 加载和卸载驱动程序加载和卸载驱动程序第第6.3节已经对字符设备驱动程序的加载和卸载模板进节已经对字符设备驱动程序的加载和卸载模板进行了介绍。行了介绍。VirtualDisk的加载和卸载函数也和的加载和卸载函数也和6.3节介绍的节介绍的类似。类似。6.4.3 cdev6.4.3 cdev的初始化和注册的初始化和注册 上面代码的第上面代码的第25行调用的行调用的VirtualDisk_setup_cdev()函数函数完成了完成了cdev的初始化和注册。的初始化和注册。6.4.4 6.4.4 打开和释放函数打开和释放函数当用户程序调用当用户程序调用open()函数

17、打开设备文件时,内核会最函数打开设备文件时,内核会最终调用终调用VirtualDisk_open()函数。函数。6.4.5 6.4.5 读写函数读写函数当用户程序调用当用户程序调用read()函数读设备文件中的数据时,内函数读设备文件中的数据时,内核会最终调用核会最终调用VirtualDisk_read()函数。函数。6.4.6 seek()6.4.6 seek()函数函数当用户程序调用当用户程序调用fseek()函数在设备文件中移动文件指针函数在设备文件中移动文件指针时,内核会最终调用时,内核会最终调用VirtualDisk_llseek()函数。函数。6.4.7 ioctl6.4.7 io

18、ctl()()函数函数当用户程序调用当用户程序调用ioctl()函数改变设备的功能时,内核会函数改变设备的功能时,内核会最终调用最终调用VirtualDisk_ioctl()函数。函数。6.5 6.5 小结小结本章主要讲解了字符设备驱动程序。字符设备是本章主要讲解了字符设备驱动程序。字符设备是Linux中的三大设备之一,很多设备都可以看成是字符设备,所以中的三大设备之一,很多设备都可以看成是字符设备,所以学习字符设备驱动程序的编程是很有用的。首先从整体上介学习字符设备驱动程序的编程是很有用的。首先从整体上介绍了字符设备的框架结构。然后介绍了字符设备结构体绍了字符设备的框架结构。然后介绍了字符设备结构体struct cdev。接着介绍了字符设备的组成,最后详细讲解了。接着介绍了字符设备的组成,最后详细讲解了一个一个VirtualDisk字符设备驱动程序。字符设备驱动程序。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!