8.1 设备管理概念
按交互对象分类
- 人机交互设备: 显示设备,键盘,鼠标,打印机
- 与CPU等交互的设备: 磁盘,磁带,传感器,控制器
- 计算机间的通信设备:网卡,调制解调器
按交互方向分类
- 输入设备: 键盘,扫描仪
- 输出设备: 显示设备,打印机
- 双向设备: 输入/输出:硬盘,软盘,网卡
按外设特性分类
- 使用特征: 存储, 输入/输出
- 数据传输率: 低速(键盘),中速(打印机),高诉(网卡,磁盘)
- 信息组织特征:字符设备(打印机),块设备(磁盘),网络设备
鼠标内部
键盘内部
打印机工作原理
硬盘内部
设备管理的主要功能
- 设备分配
- 设备映射
- 设备驱动
设备分配
设备分配功能时设备管理的基本任务,设备分配程序按照一定的策略,为申请设备的进程分配设备,记录设备的使用情况.
设备映射
物理设备: I/O系统中实际安装的设备; 物理名: ID或字符串
逻辑设备: 应用软件使用的设备;逻辑名:友好名
设备映射功能
- 设备管理模块将逻辑设备映射到物理设备的功能.
- 从应用软件的角度看,逻辑设备是一类物理设备的抽象
- 从设备管理程序的角度看,物理设备是逻辑设备的实例
设备独立性
- 物理设备对用户透明,用户使用同一规范的方式使用设备
- 用户编程时使用设备逻辑名,由系统实现逻辑设备到物理设备的转换
设备驱动
- 对物理设备进行控制,实现I/O操作:IN/OUT
- 接收应用的服务请求(例如读写),转换为具体的I/O指令,控制设备完成相关操作.
- 向用户提供统一接口
设备驱动的特点
- 设备驱动程序与硬件密切相关
- 每类设备都要配置特定的驱动程序
- 驱动程序一般由设备厂商根据操作要求编写
- 操作系统仅对与设备驱动的接口提出要求.
8.2 Spooling系统
设备分配方法
- 独占设备的分配
- 共享设备的分配
- 虚拟分配
独占性设备 VS共享型设备
独占性设备包括所有的字符型设备.
- 任意时间段内最多只能被一个进程占用,
- 使用时,进程首先向系统申请,可能进入阻塞状态.当设备可用时,唤醒一个等待进程;使用完毕后,进程必须释放设备
共享型设备包括所有块型设备.
- I/O传输单位:块
- 宏观上,一个共享型设备可以被多个进程同时占用
- 微观上,多个进程交替使用同一设备
- 进程使用这类设备时,无须申请或释放设备,也不存在某个进程占用设备的问题.
独占性设备的分配
进程使用独占设备的过程:申请-使用-释放,从进程申请成功,直到释放用完之前,独占设备
- 进程申请设备
- 系统分配设备
- 进程发送使用命令
- 系统将转到设备驱动模块完成一次I/O传输
- 进程释放设备
- 系统回收设备
共享型设备的分配
- 进程使用共享型设备不需要申请,当然也不存在占用或释放设备的问题
- 但是,I/O期间只能有一个进程使用设备.因此,进程使用共享型设备之前,有一个隐含的申请命令.使用完毕以后,有一个隐含的释放命令,以实现一次基本I/O传输期间的排它性,保证操作的正常运行.
- 使用共享型设备的过程中,进程完全有可能进入阻塞等待状态.
虚拟分配
虚拟技术
在一类物理设备上模拟另一类物理设备的技术
借助辅存部分区域模拟独占设备,将独占设备转化为共享设备
虚拟设备
用来模拟独占设备的部分辅存称为虚拟设备,虚拟独占设备
输入井: 模拟输入设备的辅存区域
输出井: 模拟输出设备的辅存区域
虚拟分配: 当进程需要与独占设备交换信息时,就采用虚拟技术将该独占设备所对应的虚拟设备(部分辅存)分配给它.
SPOOLing系统是虚拟技术和虚拟分配的实现
Simultaneaus Periphernal Operations OnLine
外部设备同时联机操作(假脱机输入/输出操作)
SPOOLing的工作流程
SPOOLing系统原理小结
- 任务执行前: 预先将程序和数据输入到输入井中
- 任务运行时:使用数据时,从输入井中取出
- 任务运行时: 输出数据时,把数据写入输出井
- 任务运行完: 外设空闲时将输出全部数据和信息
SPOOLing特点
- "提高"了I/O速度
- 将独占设备改造为"共享设备
8.3 Linux模块机制
8.3.1 Linux 模块机制
Linux内核模块
Loadable Kernel Module: LKM
解决单体内核机制的不足
- 一种未经链接的可执行代码
- 经过装载(即链接)成为内核一部分
- 可以动态加载或卸载
Linux模块概念
8.3.2 Linux驱动程序
应用程序通过驱动程序间接访问设备
用户态和内核态
- Linux的两种运行模式: 内核态;用户态
- 驱动程序工作在内核态
Linux设备的分类
字符设备
- 以字节为单位逐个进行I/O操作,如串口设备
块设备
- 块设备的存取是通过buffer, cache来进行
- 可以进行随机访问,如,IDE硬盘设备
- 支持可安装文件系统
网络设备
- 通过BSD套接口访问(Socket)
设备文件
- 硬件设备作为文件看待:设备文件
- 用文件接口来完成设备的操作. 打开,关闭,读写,I/O控制等操作
- 字符设备和块设备通过设备文件访问
- Linux文件系统中可以找到设备文件
主设备号和次设备号
主设备号
- 标识该设备种类,标识驱动程序
- 主设备号范围:1-255
- Linux内核支持动态分配主设备号
次设备号
- 标识同一设备驱动程序的不同硬件设备
- 次设备号只在驱动程序内部使用,系统内核直接把次设备号传递给驱动程序,由驱动程序去管理
功能完整的LDD结构
- 设备的打开
- 设备的释放
- 设备的读操作
- 设备的写操作
- 设备的控制操作
- 设备的中断和轮询处理
- 驱动程序的注册
- 驱动程序的注销
8.3.3 Windows驱动程序
Windows声明驱动的入口/退出函数
- Windows固定采用DriverEntry作为入口函数
- 给pDriverObject -> DriverUnload 赋值退出函数指针
Linux声明驱动的入口/退出函数
module_init(my_init);
module_exit(my_exit);
驱动程序开发工具,推荐DDK.