【13】设备管理(设备管理概念、设备驱动程序)

一、I/O系统模型、接口和功能

1、设备管理在OS的位置

计算机中三个最基本的物质基础是CPU、内存和 I/O 设备

CPU的管理实际上是对进程的管理,进程的执行涉及到内存管理,进程执行的过程需要输入输出数据,涉及到文件系统和设备管理,与I/O设备相比,文件系统是一种逻辑意义上的存在,使对设备的操作更为方便、有效、更有组织(open、write、read),文件操作是对设备操作的组织和抽象,设备操作则是对文件操作的最终实现

I/O系统是操作系统中最具多样性和复杂性的部分,OS大部分代码专门用于I/O管理

2、外设如何工作

2.1 OS如何操作外设

通过CPU向外设发出指令,CPU转身执行其他进程(外设运行速度慢),外设控制器控制外设完成输入输出,当外设完成输入输出后,向CPU发出中断请求,这时CPU执行中断处理程序,将数据从外存读入内存

OS让外设工作有三件事:

  • 向外设发指令
  • 中断处理
  • 提供方便的接口(文件系统)
2.2、代码如何操作外设

系统调用是以文件系统的接口提供给用户的,Unix/Linux类操作系统为了方便管理,把所有的设备都看成文件,给每个设备对应一个文件名,因此对设备和文件提供统一的接口

  • 不论什么设备都是调用open(), read(), write(), close等函数,也就是操作系统为用户提供统一的接口
  • 不同的设备对应不同的设备文件,根据设备文件找到控制器的地址、相应的驱动程序等

3、Unix/Linux中一切皆文件的层次模型

Unix/Linux中一切皆文件的层次模型在Unix/Linux系统中,把设备也当做文件来看待,设备与文件系统的系统调用接口是一致的,CPU通过out指令将控制命令送到控制器来启动外设工作,相应的控制器对命令字进行解释,形成相应的控制信息控制外设进行工作,等完成相应操作后就做中断操作处理

4、I/O软件的层次结构

I/O软件的层次结构

  • 用户层I/O软件:实现与用户交互的接口,用户可以直接调用在用户中提供的与I/O设备有关的库函数,对设备进行操作
  • 设备独立性软件(设备无关性软件):使得应用程序独立于具体使用的物理设备,为了实现设备独立性,必须在驱动程序上设置一层设备独立性软件,优点是方便用户、改善设备利用率、提高系统的可扩展性和可适应性
    • 执行所有设备的公有操作
    • 向用户层提供统一的接口
  • 设备驱动程序:处于次底层,是进程和控制器之间的通讯程序,其将上层发来的抽象I/O请求,转化为对I/O设备的具体命令和参数,并把它装入到设备控制器中的命令和参数寄存器中负责具体实现,系统对设备发出的操作指令、驱动、I/O设备工作
  • 中断处理程序:保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完并恢复被中断进程的现场后返回到被中断进程
  • 硬件:执行I/O操作

5、I/O系统中各种模块之间的层次视图

I/O系统中各种模块之间的层次视图

  • I/O系统的接口:I/O系统与上层系统之间的接口,向上层提供对设备进行操作的抽象I/O命令,以便于高层对设备的使用
  • 软硬件接口:在接口之上是中断处理程序和用于不同设备的设备驱动程序,在此之下是各种设备的控制器。硬件种类繁多导致该接口相对复杂

I/O系统可划分为三个层次:

  • 中断处理程序
  • 设备驱动程序
  • 设备独立性软件
5.1 I/O系统的接口
块设备接口

定义:对块设备来说,数据的存取和传输是以数据块为单位,块设备接口是块设备管理程序与高层间的接口,其反映了大部分磁盘存储器和光盘存储器的本质特征,用于控制块设备的输入和输出,磁盘设备的I/O常采用DMA(直接存储访问)方式

I/O命令:read/write

流设备接口

定义:对流设备来说,数据的存取和传输是以字符为单位,流设备接口是流设备管理程序与高层间的接口,反映了大部分字符设备的本质特征,用于字符设备的输入和输出,基本特征是传输速率低、不可寻址、常采用中断处理方式

I/O命令:get/put

网络通信接口

定义:OS提供相应的网络软件和网络通信接口

I/O命令:send/receive

6、设备管理的主要任务和功能

I/O系统的主要管理对象是I/O设备和相应的设备控制器,其最主要的任务是:

  • 完成用户提出的请求
  • 提高I/O设备速率、改善I/O设备的利用率
  • 为更高层进程方便使用设备提供手段

设备管理的功能:

  • 隐藏物理设备细节
  • 实现设备无关性:抽象的I/O命令、使用现成的逻辑设备名称控制选择设备和添加设备驱动程序
  • 提高处理机和设备的利用率:处理机与I/O设备并行操作
  • 对I/O设备进行控制:4种控制方式
    • ①程序I/O控制方式
    • ②中断驱动控制方式
    • ③DMA控制方式
    • ④通道控制方式
  • 确保对设备正确共享:从设备的共享属性可将系统中的设备分为:
    • 独占设备:进程应互斥的访问这类设备
    • 共享设备:允许多个进程同时访问
  • 错误处理:
    • 临时性错误:重试操作
    • 持久性错误:向上层报告

7、I/O软件的设计目标

  • 提高设备的利用率:I/O操作一般是系统的瓶颈,很大程度上影响系统的性能和吞吐量,为此应尽量提高进程与I/O设备之间的并行程度,主要利用的技术有中断技术、DMA技术、通道技术和缓冲技术
  • 方便、统一的界面:以一致的方式来管理所有的设备,用一种层次化、模块化的方法设计I/O功能,在底层的历程中隐藏物理设备的细节,使得用户进程和OS高层通过一些通用功能查看I/O设备

二、I/O设备和设备控制器

1、I/O设备类型

按速率分类:低速(键盘、显示器等)、中速(激光打印机)、高速设备(磁盘)
按信息交换单位分类:块设备、字符设备
按设备的共享属性:独占设备、共享设备(可寻址、可随机访问)、虚拟设备(通过虚拟技术将一台独占设备改造为若干台供多个用户使用的逻辑设备,SPOOLing技术)

2、I/O系统硬件组成

I/O系统硬件组成I/O设备通过接口与控制器相连,再由控制器与总线相连

2.1 设备控制器

设备控制器由如下三部分组成:

  • 设备控制器与处理机的接口:实现CPU与设备控制器之间的通讯,有三类信号线(数据线、地址线、控制线
  • 设备控制器与设备的接口:可连多个设备,在每个接口中都存在数据、控制和状态三种类型的信号线
  • I/O控制逻辑:实现对设备的控制,通过一组控制线与处理机交互,处理机利用该逻辑向控制器发送I/O指令,I/O逻辑对收到的命令进行译码,再根据所译出的命令,对所选定的设备进行控制

设备控制器主要职责是控制一个或多个I/O设备,以实现I/O设备和计算机之间的数据交换,是CPU与I/O设备之间的接口,接收从CPU发来的命令,控制I/O设备工作,基本功能如下:

  • 接收和识别命令:控制寄存器,用来存放接收命令和参数,并进行译码
  • 数据交换:实现CPU与控制器、控制器与设备间的数据交换
  • 标识和报告设备的状态:状态寄存器记录设备状态
  • 地址识别:地址译码器,每个设备都有一个地址,控制器必须能识别
  • 数据缓冲区:解决I/O设备与CPU、内存速度不匹配的矛盾
  • 差错控制:控制器兼管对由I/O设备传送来的数据进行差错控制
2.2 设备寻址方式

控制寄存器、数据寄存器、状态寄存器位于控制器内,从编址方式来说:

  • 如果I/O空间单独编址,就位于I/O空间,通常被称为I/O端口
  • 如果I/O空间与内存一起编址,对应的内存空间被称为内存映像I/O

I/O设备的寻址方式就是I/O端口的编号方式:

  • 设备独立编址方式:采用单独编号,成为一个独立的I/O地址空间,需专门的I/O指令,也被称为特殊I/O指令方式,Inter处理机就是独立编址方式,通过指令操作码来区分,使用专门的I/O指令完成
  • 统一编址方式:与主存空间统一编址,主存单元和I/O端口在同一个地址空间中,将I/O端口映射到某个主存地址空间的不同段,也称为内存映射方式,访问I/O端口也可用访问指令,根据地址范围不同来区分内存和设备

Linux内核访问I/O内存的函数:ioremap(将外设卡上的存储器映射到内存空间,虚拟空间)、inb(port参数指定I/O端口空间的端口地址)等,端口地址的类型是由I/O端口空间的大小来决定的,可以通过访问proc下的ioports来获取设备当前的端口号

2.3 I/O通道设备的引入

设备控制器可以大大减少CPU对I/O的干预,但主机配置外设很多时,CPU负担仍然很重,因此在CPU和设备控制器之间又增设了通道
I/O通道设备的引入

  • 定义:通道是一种硬件(低配CPU),专门用于处理I/O的处理机,控制内存和外设直接进行数据交换
  • 目的:为了建立更独立的操作,减轻CPU的负担
  • 工作方式:CPU向通道发送I/O命令,通道从内存中取出通道程序执行,完成I/O任务后向CPU发送中断信号
  • 通道与一般处理机的不同:指令类型单一,仅能执行I/O指令,通道没有自己的内存,通道程序放在内存中

通道类型:

  • 字节多路通道:按字节交叉方式工作,多个非分配型子通道(时间片轮转)
  • 数组选择通道:按数组方式进行数据传送,一个分配型子通道
  • 数组多路通道:将数组选择通道传输速率高和字节多路通道能使各子通道(设备)分时并行操作的优点相结合

通道“瓶颈”问题:通道价格昂贵,致使机器中设置的通道数量较小,进而造成整个系统吞吐量的下降
解决方案:增加设备到主机间的通路,把一个设备连接到多个控制器上,而一个控制器上又连接多个通道


三、I/O设备驱动程序

1、设备驱动程序

1.1 设备驱动程序概念

设备驱动程序是I/O系统的高层与设备控制器之间的通信程序,其主要任务是接收上层软件发来的抽象要求,如read或write命令,文件系统把这些请求转化为具体的要求后,发送给设备控制器,启动设备去执行;反之,也将设备控制器发来的信号传送给上层软件

1.2 应具备什么功能?

设备驱动程序应具备以下功能:

  • 接收由与设备无关的软件发来的命令和参数,并将命令中抽象的要求转换为与设备相关的低层操作序列
  • 检查用户I/O请求的合法性
  • 发出I/O命令
  • 及时响应由设备控制器发来的中断请求
1.3 设备驱动程序的特点
  • 设备驱动程序属于低级的系统例程,主要是指在请求I/O的进程与设备控制器之间的一个通信和转换程序
  • 驱动程序与设备控制器和I/O设备的硬件特性紧密相关,因而对不同类型的设备应配置不同的驱动程序
  • 驱动程序与I/O设备所采用的I/O控制方式(中断方式和DMA方式)紧密相关
  • 驱动程序与硬件紧密相关,因而其中一部分必须采用汇编语言编写
  • 驱动程序应允许可重入

2、设备处理方式

三类处理方式:

  1. 为每一类设备设置一个进程,专门用于执行这类设备的I/O操作
  2. 在整个系统中设置一个I/O进程,专门用于执行系统中所有各类设备的I/O操作
  3. 不设置专门的设备处理进程,而只为各类设备设置相应的设备处理程序(模块),供用户进程或系统进程调用

3、设备驱动程序的处理过程

不同类型的设备应有不同的设备驱动程序,大体分为两部分,第一部分,能够驱动I/O设备工作的驱动程序,第二部分,设备中断处理程序,以下是设备驱动程序的处理过程:

  1. 将抽象要求转换为具体要求
  2. 检查I/O请求的合法性
  3. 读出和检查设备的状态
  4. 传送必要的参数
  5. 工作方式的设置
  6. 启动I/O设备

4、I/O控制方式

4.1 程序直接控制方式

由于CPU速度远远快于I/O设备,CPU需要不断的检测I/O设备,CPU利用率相当低,绝大部分时间都在测试设备是否已经完成数据的传输

4.2 中断驱动方式

中断硬件支持,CPU与I/O设备可以并行工作,但存在问题是每输入输出一个字节都要求中断,中断次数太多,不适用于高速设备

4.3 DMA(直接存储器访问)方式

与中断驱动方式相比,DMA方式有了以下几个改进:

  • 数据传送的单位是块,不再是一个字一个字的传送
  • 数据的流向是从设备直接放入内存或直接从内存到设备,不需要CPU单位,仅在一个块或多个块开始和结束时才需要CPU干预

DMA控制器由三部分组成:

  • 主机与DMA控制器的接口
  • DMA控制器与设备的接口
  • I/O控制逻辑

DMA控制器

  • 命令寄存器CR:用于存放CPU发送来的命令或设备状态信息
  • 内存地址寄存器MAR:在设备向内存输入数据,MAR表示输入数据应该存放在内存的位置;在内存向设备输出数据时,MAR表示输出数据应该存放在内存的位置
  • 数据寄存器DR:暂存从设备到内存或者内存到设备的数据
  • 数据计数器DC:表示剩余要读或者写的字节数
4.4 I/O通道控制方式

进一步减少CPU对I/O操作的干预,通道控制方式也是一种一内存为中心,实现设备与内存直接数据交换的控制方式,与DMA方式相比,CPU对I/O操作的干预更少,只有完成这一组数据块的读或者是写之后,才需要发出中断信号,请求CPU干预,而且可以做到一个通道控制多台设备

通道本质是一个简单的处理器,有自己的指令系统(数据传送指令、设备控制指令等),通过执行通道程序来控制I/O操作。

以数据输入为例,当用户进程需要输入数据时,CPU发出启动指令,指明要执行的I/O操作所使用的设备和通道,当对应通道接收到CPU发来的启动指令后,把存放在内存中的通道程序读出,并执行通道程序,控制设备将数据传送到内存中指定的区域,在设备进行输入时,CPU可以做其他事情;当数据传送结束后,设备控制器向CPU发送一个中断请求,CPU收到中断信号后转去执行中断处理程序,之后返回被中断的程序

I/O控制方式


四、Linux字符设备驱动程序

1、Linux设备驱动分类

Linux设备驱动分类

2、字符设备

字符设备是指只能一个字节一个字节进行读写操作的设备,字符设备是面向流的设备(鼠标、键盘、串口、控制台等),一般每个字符设备或者块设备都会在/dev目录下对应一个设备文件,Linux用户层程序通过设备文件来使用驱动程序操作字符设备或者块设备

2.1 建立设备文件
  • 系统调用mknod()
  • 通过mknod命令,通过主设备号就可以把设备文件与驱动程序关联起来
    sudo mknod /dev/mycdev c 231 0
    该命令第一个参数为设备文件名,第二个参数为设备类型,三四个参数为设备文件的主设备号和次设备号,同一个设备不同类型的主设备号是一样的,次设备号不同(一个硬盘的多个分区,只需要一个驱动程序)
2.2 描述字符设备

Linux内核中使用cdev结构体描述字符设备,cdev定义于<linux/cdev.h>中,在Linux内核中
cdev结构体:dev定义设备号,以确定字符设备的唯一性;file_operation来定义字符设备驱动,提供给虚拟文件系统的接口

struct cdev {
	struct kobject kobj;	//内嵌内核对象
	struct module *owner;	//该字符设备所在的内核模块
	const struct file_operations *ops;//文件操作结构体
	struct list_head list;//已注册字符设备链表
	dev_t dev; //由主、次设备号构成的设备号
	unsigned int count;//同一主设备号的次设备号的个数
};
  • kobject是组成Linux设备模型的基础,一个kobject对应sysfs文件系统中的一个目录,从面向对象的角度说,kobject可以看作所有设备对象的基类(cdev实际是kobject的一个子类)
  • file_operations是设备驱动开发最关键的数据结构,是实现字符设备的操作集
  • 系统已经注册的字符设备都可通过list字段链接成一个双链表
  • dev表示主次设备号构成的设备号(主设备号12位,次设备号20位),其主设备号唯一的对应一个驱动程序

文件操作集file_operation结构:
file_operation数据结构位于fs.h中,每一个字段都对应一个系统调用,是一个指向函数的指针,对其实现就是驱动程序要做的工作(如read、write、mmap、open等)

2.3 字符设备驱动框架

字符设备驱动程序是以内核模块的形式加载到内核中

  1. 模块加载函数静态/动态的获取设备号
  2. 字符设备初始化函数建立cdev与file_operation之间的关系
  3. 注册函数向系统添加一个cdev完成注册(注册)
  4. 注销cdev,并释放设备号(注销)
  5. 在用户程序中,可以通过系统调用open()等调用驱动程序所实现的函数(设备操作)
2.4 编写简单的字符设备驱动程序

① 驱动初始化 ②实现设备操作 ③驱动注销

2.4.1 字符设备驱动接口函数
序号函数名功能
1cdev_alloc()动态申请(构造)cdev内存(设备对象)
2cdev_init()初始化cdev的成员,并建立起cdev和file_operations之间的关联
3cdev_add()注册cdev设备对象,添加到系统字符设备列表
4cdev_del()将cdev对象从系统中移除(注销)
5cdev_put()释放cdev内存
2.4.2 设备号的申请和释放
宏或者函数名功能
MAJOR宏从设备号中提取主设备号
MINOR宏从设备号中提取次设备号
MKDEV宏将主次设备号拼凑成设备号
register_chrdev_region()函数静态申请设备号
alloc_chrdev_region()动态申请设备号
unregister_chrdev_region()释放设备号
2.4.3 用户空间与内核空间数据的传送

调用函数时,如read()函数,要陷入内核空间,通过内核的copy_to_user()函数将内核空间缓冲区中的数据拷贝到用户空间的缓冲区

调用write函数时,内核调用copy_from_user()函数将用户空间的缓冲区中的数据拷贝到内核空间缓冲区

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值