嵌入式Linux系统开发教程 教学课件 ppt 作者 978-7-302-22520-1 第十章

上传人:E**** 文档编号:89375620 上传时间:2019-05-24 格式:PPT 页数:102 大小:680.50KB
返回 下载 相关 举报
嵌入式Linux系统开发教程 教学课件 ppt 作者 978-7-302-22520-1 第十章_第1页
第1页 / 共102页
嵌入式Linux系统开发教程 教学课件 ppt 作者 978-7-302-22520-1 第十章_第2页
第2页 / 共102页
嵌入式Linux系统开发教程 教学课件 ppt 作者 978-7-302-22520-1 第十章_第3页
第3页 / 共102页
嵌入式Linux系统开发教程 教学课件 ppt 作者 978-7-302-22520-1 第十章_第4页
第4页 / 共102页
嵌入式Linux系统开发教程 教学课件 ppt 作者 978-7-302-22520-1 第十章_第5页
第5页 / 共102页
点击查看更多>>
资源描述

《嵌入式Linux系统开发教程 教学课件 ppt 作者 978-7-302-22520-1 第十章》由会员分享,可在线阅读,更多相关《嵌入式Linux系统开发教程 教学课件 ppt 作者 978-7-302-22520-1 第十章(102页珍藏版)》请在金锄头文库上搜索。

1、重点内容: Linux设备管理机制 模块编程 字符设备数据结构 字符设备驱动开发流程 字符设备驱动扩展,第10章 嵌入式Linux驱动开发基础,一、嵌入式Linux驱动概述,设备驱动是操作系统内核中最接近硬件设备,是操作系统内核和底层硬件设备之间的接口。也就是说,操作系统内核就是通过调用这些接口函数来完成对底层硬件设备的使用。那么应用程序怎样使用底层的硬件平台呢?前面讲过,在操作系统和应用程序之间也有很多接口函数,这些接口函数为应用程序使用操作系统内核提供了窗口,我们称这些接口函数为系统调用。,Linux驱动基本原理,系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器

2、硬件之间的接口。它们都有一个共同的特点:屏蔽了底层的某个具体服务的实现细节,比如,系统调用屏蔽了操作系统内核某个具体功能的实现细节,设备驱动程序则屏蔽了底层硬件设备的细节。,具体来说,在Linux中设备是被当做文件来进行处理的。上层的应用程序需要操作硬件时,只需要获得设备的文件描述符,然后通过系统调用open(),read(),write(),ioctl(),close()等来操作设备,这与一般普通的文件操作非常类似。应用程序不关心无需关心硬件的细节。应用程序发出系统调用指令后,会从用户态转换为内核态,通过内核将系统调用函数转换成对物理设备的操作。如图所示了应用程序使用底层的设备接口示意图,从

3、中可以看出,设备驱动层起到了承上启下的作用。,一、嵌入式Linux驱动概述,Linux驱动基本原理,常见的驱动程序也是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,而 Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM(高级电源管理)、VFS等驱动程序则直接编译在内核文件中。有时也把内核模块叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。因此,加载驱动时就是加载内核模块。,一、嵌入式Linux驱动概述,Linux驱动基本原理,作为程序开发者,从上图可以看出,处于设备驱动层的Linux驱动程序为应用程序提供了访问硬件设备的编程接口(Applic

4、ation Programming Interface,API),它是真个设备驱动的核心内容。驱动程序主要提供以下功能: 应用程序通过驱动程序安全有效地访问硬件; 驱动程序作为嵌入式系统的中间层软件,它隐藏了底层的细节,从而提高了软件的可移植性和可复用性; 驱动程序文件节点可以方便地提供访问权限控制。,一、嵌入式Linux驱动概述,Linux驱动功能,从下层驱动开发人员的角度来看,Linux驱动程序就是通过直接操控硬件的软件,来完成下面的功能: 对设备初始化和释放; 直接读写硬件寄存器来控制硬件; 把数据从内核传送到硬件和从硬件读取数据; 操作设备缓冲区设备; 操作输入、输出设备,如键盘、打印

5、机等; 读取应用程序传送给设备文件的数据和回送应用程序请求的数据; 检测和处理设备出现的错误。,一、嵌入式Linux驱动概述,Linux驱动功能,Linux 的一个重要特点就是将所有的设备都当做文件进行处理,这一类特殊文件就是设备文件,它们可以使用前面提到的文件、I/O相关函数进行操作,这样就大大方便了对设备的处理。它通常在“/dev”下面存在一个对应的逻辑设备节点,这个节点以文件的形式存在。,二、设备驱动的基础知识,Linux设备管理机制,Linux 系统的设备文件分为四类:块设备文件、字符设备文件、网络设备文件和杂项设备文件。 块设备文件:通常指一些需要以块(如512字节)的方式写入的设备

6、,如IDE硬盘、SCSI硬盘、光驱等; 字符型设备文件:通常指可以直接读写,没有缓冲区的设备,如并口、虚拟控制台等; 网络设备文件:通常是指网络设备访问的 BSD socket接口,如网卡等; 杂项设备文件:通常指的是比较特殊的驱动程序,如IIC、USB等。,二、设备驱动的基础知识,设备分类,设备号是一个数字,它是设备的标志。就如前面所述,一个设备文件(也就是设备节点)可以通过mknod命令来创建,其中指定了主设备号和次设备号。主设备号表明某一类设备,用于标识设备对应的驱动程序,一般对应着确定的驱动程序,主设备号相同的设备使用相同的驱动程序;次设备号一般是用于区分标明不同属性(例如不同的使用方

7、法,不同的位置,不同的操作等),它标志着某个具体的物理设备。次设备号是一个8位数,用来区分具体设备的实例。因此,同一台机器上如果有两个相同的设备,则它们的主设备号相同,但第一个设备的次设备号为0,而第二个设备的次设备号为1。一般,高字节为主设备号和底字节为次设备号。例如,在系统中的块设备IDE 硬盘的主设备号是 3,而多个 IDE 硬盘及其各个分区分别赋予次设备号1、2、3,二、设备驱动的基础知识,设备号,Linux设备的设备号由主、次设备号构成,如果已经知道某设备的主、次设备号,可以利用MKDEV()宏来合成设备号。该宏定义如下(位于include/linux/kdev_t.h中): #de

8、fine MKDEV(ma,mi) (ma)8) #define MINOR(dev) (dev) & 0xff) Linux系统下,有关主设备号的分配原则,可以参看Documentation/Device.txt。,二、设备驱动的基础知识,设备号,Linux驱动程序可以通过两种方式集成到内核中去: 一是将其直接编译到内核; 二是将其编写成模块,在需要添加某种硬件的时候,内核可以将其调入。在配置Linux内核时,可以选择“Enable loadable module support”选项,来支持可加载内核模块。,二、设备驱动的基础知识,内核模块,前一种方法将驱动程序直接写入内核,其优点是用户可

9、以随时地进行调用而无需安装。但是这样会大大增加内核占用的空间,导致内核体积较大。,后一种方法将驱动程序编写成模块供内核有选择性地加载,虽然会因为寻找驱动模块而增加系统资源的占用和运行时间,但是与庞大的内核所消耗的资源相比显得微不足道。另外,这种可加载的内核模块还可以为软件开发提供许多便利。当用户需要对某一硬件驱动程序进行开发或者纠错时,用户可以动态地卸载旧的版本并加载新的版本,但是如果用户的驱动程序已经写入内核,那么必须对内核进行重新编译,并且每次对修改后的程序进行测试时,都必须重新启动系统。显然,后者在时间和精力上花费更大。如果将驱动程序视为可加载的内核模块进行开发和配置,用户就可以将硬件驱

10、动程序作为一种独立的系统进行升级,而不必频繁地对内核进行改动了。,二、设备驱动的基础知识,内核模块,可加载的内核模块通常情况下安装在系统“/lib/modules”目录的一个子目录下。我们可以通过通过模块加载或者卸载命令来对模块进行管理。,二、设备驱动的基础知识,内核模块,常用的模块相关命令列表,另外,注意Linux 2.6内核对可加载内核模块规定了新的命名方法,使用的是“.ko”扩展名,而不是Linux2.4内核采用的“.o”扩展名。,Linux 设备驱动程序包含中断处理程序和设备服务子程序两部分: 设备服务子程序包含了所有与设备操作相关的处理代码。它从面向用户进程的设备文件系统中接受用户命

11、令,并对设备控制器执行操作。这样,设备驱动程序屏蔽了设备的特殊性,使用户可以像对待文件一样操作设备。 设备控制器需要获得系统服务时有两种方式:查询和中断。因为 Linux 下的设备驱动程序是内核的一部分,在设备查询期间系统不能运行其他代码,查询方式的工作效率比较低,所以只有少数设备如软盘驱动程序采取这种方式,大多设备以中断方式向设备驱动程序发出输入/输出请求。 Linux的输入/输出系统的各层次结构和功能,如图 :,二、设备驱动的基础知识,驱动层次结构,Linux输入/输出系统层次结构和功能,Linux 设备驱动程序与外界的接口可以分为如下三个部分: 驱动程序与操作系统内核的接口:这是通过数据

12、结构 file_operations(在本书后面会有详细介绍)来完成的。 驱动程序与系统引导的接口:这部分利用驱动程序对设备进行初始化。 驱动程序与设备的接口:这部分描述了驱动程序如何与设备进行交互,这与具体设备密切相关。,二、设备驱动的基础知识,设备驱动程序与外界接口,它们之间的相互关系如下图 :,二、设备驱动的基础知识,设备驱动程序与外界接口,二、设备驱动的基础知识,设备驱动程序的特点,综上所述,Linux 中的设备驱动程序有如下特点: 内核代码 设备驱动程序是内核的一部分,如果驱动程序出错,则可能导致系统崩溃。 内核接口 设备驱动程序必须为内核或者其子系统提供一个标准接口。比如,一个终端

13、驱动程序必须为内核提供一个文件 I/O 接口;一个 SCSI设备驱动程序应该为 SCSI子系统提供一个SCSI设备接口,同时SCSI子系统也必须为内核提供文件的 I/O 接口及缓冲区。 内核机制和服务 设备驱动程序使用一些标准的内核服务,如内存分配等。,可装载 大多数的 Linux 操作系统设备驱动程序都可以在需要时装载进内核,在不需要时从内核中卸载。 可设置 Linux 操作系统设备驱动程序可以集成为内核的一部分,并可以根据需要把其中的某一部分集成到内核中,这只需要在系统编译时进行相应的设置即可。 动态性 在系统启动且各个设备驱动程序初始化后,驱动程序将维护其控制的设备。如果该设备驱动程序控

14、制的设备不存在也不影响系统的运行,那么此时的设备驱动程序只是多占用了一点系统内存而已。,可装载 大多数的 Linux 操作系统设备驱动程序都可以在需要时装载进内核,在不需要时从内核中卸载。 可设置 Linux 操作系统设备驱动程序可以集成为内核的一部分,并可以根据需要把其中的某一部分集成到内核中,这只需要在系统编译时进行相应的设置即可。 动态性 在系统启动且各个设备驱动程序初始化后,驱动程序将维护其控制的设备。如果该设备驱动程序控制的设备不存在也不影响系统的运行,那么此时的设备驱动程序只是多占用了一点系统内存而已。,二、设备驱动的基础知识,设备驱动程序的特点,以往在开发应用程序时都有一个 ma

15、in函数作为程序的入口点,而在驱动开发时却没有 main函数,模块在调用 insmod 命令时被加载,此时的入口点是init_module函数,通常在该函数中完成设备的注册。同样,模块在调用 rmmod函数时被卸载,此时的入口点是cleanup_module函数,在该函数中完成设备的卸载。在设备完成注册加载之后,用户的应用程序就可以对该设备进行一定的操作,如read、write等,而驱动程序就是用于实现这些操作,在用户应用程序调用相应入口函数时执行相关的操作,init_module入口点函数则不需要完成其他如read、write之类功能。,二、设备驱动的基础知识,驱动开发流程,Linux驱动程

16、序编写流程如图 :,二、设备驱动的基础知识,驱动开发流程,Linux内核是“单内核”结构,这个单内核由很多模块构成,每个模块完成内核一部分的功能,比如TCP/IP协议栈模块完成网络协议功能,文件系统模块完成文件管理功能等等。使用模块的好处是可以根据用户的需要随意裁减Linux系统,使得整个系统恰好适应产品的需要。正是具有这样的特点,Linux被广泛应用在嵌入式产品设计中。 但是这里我们要指出的是Linux内核中的模块机制不同于微内核中的模块机制。在微内核中,模块处于用户空间;而在Linux中,模块位于内核中,用户可以通过insmod等工具将一段代码加入到内核中,也可以在不需要它的时候,调用rmmod工具将其调出内核。,三、模块编程,模块与内核,内核和模块之间的关系见图 :,三、模块编程,模块与内核,在Linux内核中使用模的好处是: 模块化编程的需要,降低开发和维护成本。 增强系统的灵活性,使得修改一些内核功能而不必重新编译内核和重启系统。 降低内核编程的复杂性,使入门门槛降低。,三、模块编程,模块与内核,在进行模块设计的时候,必须遵循Linux的标准,否则无法通过Linux

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号