《嵌入式Linux操作系统 教学课件 ppt 华清远见嵌入式学院 孙天泽 第9章 设备管理》由会员分享,可在线阅读,更多相关《嵌入式Linux操作系统 教学课件 ppt 华清远见嵌入式学院 孙天泽 第9章 设备管理(19页珍藏版)》请在金锄头文库上搜索。
1、嵌入式Linux操作系统 第9章 设备管理,www.embedu.org,2,第1章 嵌入式Linux操作系统简介 第2章 Linux操作系统使用与系统配置 第3章 嵌入式Linux编程环境 第4章 存储管理 第5章 操作系统进程 第6章 进程间通信 第7章 中断与系统调用 第8章 文件管理 第9章 设备管理 第10章 嵌入式Linux的构建,课程安排:,www.embedu.org,3,第9章 设备管理 9.1 设备及设备管理的功能 9.2 I/O内核子系统 9.3 Linux设备驱动程序 思考题,本章课程:,www.embedu.org,4,9.1 设备及设备管理的功能,9.1.1 设备分
2、类 按系统和用户分:系统设备、用户设备 按输入输出传送方式分(UNIX或Linux操作系统):字符设备、块设备 按资源特点分:独享设备、共享设备、虚拟设备 按设备硬件物理特性分:顺序存取设备、直接存取设备 按设备使用分:物理设备、逻辑设备、伪设备 按数据组织分:块设备、字符设备 按数据传输率分:低速设备、中速设备、高速设备 根据设备的用途,可以把设备分为存储设备与输入/输出设备两大类 存储设备是指用来进行数据存储的设备,计算机的存储器分为主存储器(内存)和辅助存储器(外存),外部存储器就是一种典型的存储类型的设备,例如硬盘、软盘、CD、U盘、移动硬盘等。 输入/输出设备是主机从外界接收信息或向
3、外界发送信息的媒介。输入设备是计算机用来从外界接收信息的设备,例如鼠标、键盘、扫描仪等;输出设备是计算机把处理后的信息发向外界的设备,例如打印机、显示器等。这种设备以每次一个字符的方式发送数据,因此称为字符设备。,www.embedu.org,5,9.1 设备及设备管理的功能,9.1.2 设备管理 操作系统的设备管理功能主要是分配和回收外部设备以及控制外部设备按用户程序的要求进行操作等。 动态掌握并记录设备的状态 分配设备和释放 对输入输出缓冲区进行管理 控制和实现真正的输入输出操作 提供设备使用的用户接口 在一些较大系统中实现虚拟设备技术 通道(channel):计算机系统中能够独立完成输入
4、输出操作的硬件装置,也称为“输入输出处理机”。,www.embedu.org,6,9.2 I/O内核子系统,9.2.1 I/O系统的基本功能 功能一:隐藏物理设备的细节。 功能二:与设备的无关性。 功能三:提高处理器与I/O设备的利用率。 功能四:对I/O设备进行控制。 功能五:能确保对设备的正确共享。 功能六:错误处理。,www.embedu.org,7,9.2 I/O内核子系统,9.2.2 I/O空间 为了访问某些外部设备,系统必须为外设的寄存器分配地址空间,外设所占用的地址空间叫做I/O空间。 对于I/O空间的处理,目前有两种方式:一种是存储器统一编址,即在整个内存空间中划出一个范围作为
5、I/O空间,这种方式的特点是处理器没有独立的I/O指令,而是把外部设备的寄存器作为存储单元来对待;另一种方式是处理器具有单独的I/O指令,所以在这种方式中,I/O地址空间是独立编址的。不管是统一编址还是独立编址,从逻辑上看,外设控制器的寄存器就是一种存储装置,它可以向处理器提供数据,也可以接受处理器的数据,即处理器可以对它们进行读写操作。,www.embedu.org,8,9.2 I/O内核子系统,9.2.3 I/O控制方式 使用设备完成输入/输出的过程,就是主机与外部设备之间数据传送的过程。设备管理的主要任务之一是控制设备与内存或CPU之间的数据传送。 常用的传输控制方式 : (1)轮询:
6、(2)中断: (3)DMA(直接内存存取): 一个完整的DMA过程应包括:初始化、DMA请求、DMA响应、DMA传输、DMA结束5个阶段。 (4)通道:,www.embedu.org,9,9.3 Linux设备驱动程序,设备驱动程序与外部设备之间的关系: 驱动程序大致分为4个主要组成部分: 自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和是否能正常工作。如果该设备正常,则对这个设备及其相关的、设备驱动程序需要的软件状态进行初始化。这部分驱动程序只有在初始化时被调用一次。 完成用户进程请求的程序,即永恒进程对设备的操控部分。 设备中断服务程序,通常分为上半部和下半部。,www.emb
7、edu.org,10,9.3 Linux设备驱动程序,9.3.1 设备管理 设备管理包括两个方面的内容: 一是如何在系统中登记注册设备及其驱动程序,以使系统知道设备的存在以及状态; 二是当进程需要使用外部设备时,采用哪种方式将设备及其驱动程序提交给进程。其核心内容就是设备驱动程序的管理。 从进程的角度看,外部设备的驱动程序就是一组包括中断服务程序的操作函数集合。其中,对于外设的中断管理,我们无须操心,因为计算机系统中已经存在一个完善的中断管理系统。所以,重点要关心如何向应用进程提供那些供进程调用的操作函数及管理方法。,www.embedu.org,11,9.3 Linux设备驱动程序,9.3.
8、2 Linux字符设备 字符设备(character device)和 普通文件之间的主要区别是:普通 文件可以来回读/写,而大多数字符 设备仅仅是数据通道,只能顺序读/写。 字符设备是Linux最简单的设备,可以像文件一样访问 chrdevs向量表中的每一个条目,一个device_struct数据结构,包括两个元素:一个登记的设备驱动程序的名称的指针和一个指向一组文件操作的指针。这块文件操作本身位于这个设备的字符设备驱动程序中,每一个都处理特定的文件操作,比如打开、读、写和关闭。,www.embedu.org,12,9.3 Linux设备驱动程序,9.3.3 Linux块设备 块设备(blo
9、ck device)是文件系统的物质基础,它也支持像文件一样被访问。 Linux用blkdevs向量表维护已经登记的块设备文件。 字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作为缓冲区,当用户进程对设备请求能满足用户的要求时,就返回请求的数据,如果不能就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。,www.embedu.org,13,9.3 Linux设备驱动程序,9.3.4 Linux网络接口 为了屏蔽网络环境中物理网络设备的多样性,Linux对所
10、有的物理设备进行抽象并定义了一个统一的概念,称之为接口(Interface)。所有对网络硬件的访问都是通过接口进行的,接口对上层协议提供一致化的操作集合来处理基本数据的发送和接收,对下层屏蔽硬件差异。 在Linux中所有网络接口都用一个net_device的数据结构表示。通常,网络设备是一个物理设备如以太网卡,但软件也可以作为网络设备,如回环设备(loopback)。所有被网络设备发送和接收的包都用数据结构skb_buff表示,这是一个具有很好的灵活性的数据结构,可以很容易增加或删除网络协议数据包头。,www.embedu.org,14,9.3 Linux设备驱动程序,9.3.5 Linux设
11、备文件 Linux把所有外部设备按其数据交换的特性分为三类: 字符设备是以字符为单位进行输入输出的设备,如打印机,显示终端。 块设备是以数据块为单位进行输入输出的设备,如磁盘、光盘等 网络设备是以数据包为单位进行数据交换的设备,如以太网卡。 设备文件、驱动程序与外设的关系:,www.embedu.org,15,9.3 Linux设备驱动程序,9.3.6 Linux设备注册与注销 在Linux系统中,完成驱动程序的第一个任务就是对设备进行注册,使用的函数是device_register,这个函数在drivers/base/core.c实现 int device_register(struct d
12、evice *dev) device_initialize(dev); return device_add(dev); 在驱动程序中对设备进行注销的核心函数是device_unregister,驱动核心将删除这个设备的驱动程序指向这个设备的符号链接,并从它的内部设备链表中删除该设备,再以device 结构中的 struct kobject指针为参数,调用kobject_del。 void device_unregister(struct device *dev) pr_debug(“device: %s: %sn“, dev-bus_id, _func_); device_del(dev);
13、put_device(dev); ,www.embedu.org,16,9.3 Linux设备驱动程序,9.3.7 操作I/O端口 设备驱动程序是内核代码中与设备无关的软件和系统硬件之间的一个隔离带。因此驱动程序在输入、输出和控制硬件设备的同时,必须要得到底层内核函数的支持,这些函数包括分配内存、申请中断、管理缓冲区等等,由于驱动程序最终要通过I/O地址空间执行I/O端口操作,所以涉及硬件的操作就是内核提供的I/O端口操作函数。 在PC机使用的系统总线中,有8位端口、16位端口,以及32位端口。我们要注意,大部分与I/O端口操作相关的源代码是和硬件平台相关的。Linux内核头文件中(就在与体系
14、结构相关的头文件中)定义了如下一些内联函数。这些函数(宏)用于读写8位,16位和32位的数据项。,www.embedu.org,17,9.3 Linux设备驱动程序,9.3.8 Linux逻辑I/O与设备驱动程序的接口 Linux内核为进程提供了使用驱动程序的接口。由于Linux把设备作为文件,所以访问设备驱动程序的接口与访问文件的接口是统一的,即VFS。Linux对设备的管理和控制是使用VFS提供的各种数据结构和操作函数实现的。 逻辑I/O层与设备驱动程序之间的接口是由两个由内核分别定义的数据结构组成的数组。,www.embedu.org,18,思考题,简单说明设备的分类。 I/O空间编址有几种方式?分别是什么? Linux系统的设备驱动一般分几类,各有什么特点? 什么是设备节点?如何创建? 什么是设备号?在驱动程序中如何申请?,www.embedu.org,19,19,