[TOC]
内容
设备管理概述
缓冲技术
设备分配
I/O设备控制
设备驱动程序
重点
理解缓冲的作用
理解SPOOLING技术
掌握设备驱动程序的开发过程
1.按交互对象分类
人机交互设备:显示设备、键盘、鼠标、打印机
与CPU等交互的设备:磁盘、磁带、传感器、控制器
计算机间的通信设备:网卡、调制解调器
2.按交互方向分类
输入设备:键盘、扫描仪
输出设备:显示设备、打印机
双向设备:输入/输出:硬盘、软盘、网卡
3.按外设特性分类
使用特征:存储、输入/输出
数据传输率:低速(键盘)、中速(打印机)、高速(网卡、磁盘)
信息组织特征:字符设备(如打印机), 块设备(如磁盘),网络设备
4.按信息组织特征分类
字符设备:传输的基本单位是字符,像键盘、串口。
块设备:块是设备存储和传输的基本单位。
网络设备:采用socket套接字接口访问、在全局空间有唯一名字,如eth0、eth1
设备管理的目标
提高设备的利用率
提高设备读写效率
提高CPU与设备并行程度
为用户提供统一接口
实现设备对用户透明
功能
1)状态跟踪
2)设备分配
3)设备映射
4)设备控制/设备驱动
5)缓冲区管理
设备控制块(Device Control Block,DCB)
记录设备的基本属性、状态、操作接口以及进程与设备之间的交互信息等
按一定策略安全地分配和管理各种设备
按相应分配算法把设备分配给请求该设备的进程,并把未分配到设备的进程放入设备等待队列
【物理设备不好记,于是映射逻辑设备(有友好名的设备)
友好名:用户编程时使用的名字】
设备独立性
用户使用逻辑设备的统一接口去访问设备,而不用考虑物理设备复杂而特殊的物理操作方式和结果。
设备无关性
Windows:
Linux:
对物理设备进行控制,实现I/O操作。
把应用服务请求(读/写命令)转换为I/O指令。
向用户提供统一的设备使用接口
1.read/write
2.把外设作为特别文件处理
设备驱动程序的特点
设备驱动程序与硬件密切相关。
每类设备都要配置特定的驱动程序
驱动程序一般由设备厂商根据操作系统要求编写。
I/O缓冲区管理
开辟和管理I/O缓冲区
提高读写效率
1)连接不同数据传输速度的设备
例子:设备驱动与控制器串行工作。
改进:控制器增加缓冲
2)协调数据记录大小的不一致
两个设备或设备与CPU之间记录的大小不一致
例:网络消息的包和帧
3)正确执行应用程序的语义拷贝
提前读与延后写
磁盘类的块设备
提高进程与外部设备之间的数据传输效率。
减少访问目标设备次数,提高设备访问的效率。
进程需要从外设读取的数据事先已被提前读取到了缓冲区中,不需要继续启动外设执行读取操作。
进程向外设写入的数据先缓存起来,延迟到特定事件发生或足够时间后,再启动外设,完成数据真正写入
4种缓冲形式
内存开辟,应用广泛,使用灵活
提前读/延后
单缓冲
双缓冲
环形缓冲
缓冲池
缓冲区仅有1个单元
缓冲区有2个单元
在双缓冲的基础上增加了更多的单元,并让首尾两个单元在逻辑上相连
多个缓冲区
可供若干个进程共享
可以支持输入,也可以支持输出
提高缓冲区的利用率,减少内存浪费的情况
设置内存高速缓冲区。
缓冲块中保存最近访问磁盘的数据。
读块设备前,先搜索和读缓冲区。
写块设备时,先写入缓冲区。
典型的块设备
硬盘、软盘、RAM DISK等
硬盘最小寻址单元是扇区。
块(block)是文件系统数据传输单位
块数倍于扇区大小。
Linux block是1024Byte
高速缓冲区被划分为缓冲块
每个缓冲块与一个磁盘块对应。每个缓冲块都用一个叫缓冲头buffer_head的结构体来描述。
设备分配方法
独享(设备的)分配
共享(设备的)分配
虚拟分配
独占设备
不可抢占设备(包括所有字符型设备)
每次只供一个进程使用,如键盘、打印机等,只有进程释放它们之后才能被别的进程申请到。
共享设备
可抢占设备,允许多个作业或进程同时使用。(包括所有块型设备)
CPU,内存(空分复用) ,存储设备(空分复用)
虚拟设备
借助虚拟技术,在共享设备上模拟独占设备
指进程使用设备之前先申请,申请成功开始使用,直到使用完再释放。
若设备已经被占用,则进程会被阻塞,被挂入设备对应的等待队列等待设备可用之时被唤醒。
共享设备一般采用共享分配方式。(硬盘就是典型的共享设备。)
当进程申请使用共享设备时,操作系统能立即为其分配共享设备的一块空间,不会让进程产生阻塞。
共享分配使得进程使用设备十分简单和高效,随时申请,随时可得。
虚拟技术
在一类物理设备上模拟另一类物理设备的技术
通常借助辅存部分区域模拟独占设备,将独占设备转化为共享设备。
虚拟设备
虚拟分配
当进程需要与独占设备交换信息时,采用虚拟技术将与该独占设备所对应的虚拟设备(部分辅存)分配给它。
首先,采用共享分配为进程分配虚拟独占设备;
然后,将虚拟设备与指定的独占设备关联。
进程运行过程中,直接与虚拟设备进行交互,传输速度快,进程推进速度得到了提高。
SPOOLing是虚拟技术和虚拟分配的实现
外部设备同时联机操作
假脱机输入/输出
【进程将所需要传输的数据先放在虚拟设备(辅存)】
结构
【预输出/入程序模拟脱机系统的卫星机
用户进程将输出数据先传送到输出井,当输出设备空闲时,再将输出井中的数据送到输出设备中(延后写),同理输入】
说明:
SPOOLing系统原理小结
任务执行前:预先将程序和数据输入到输入井中
任务运行时:使用数据时,从输入井中取出
任务运行时:输出数据时,把数据写入输出井
任务运行完:外设空闲时输出全部数据和信息
SPOOLing优点
“提高”了I/O速度(指不容易阻塞)
将独占设备改造为“共享”设备:实现了虚拟设备功能
I/O数据控制方式
无条件传送方式(同步传送)
查询方式(异步传送,循环测试I/O)
中断方式
通道方式
DMA(直接内存访问)方式
工作过程
进行I/O时无需查询外设状态,直接进行。
主要用于外设时钟固定而且已知的场合。
当程序执行I/O指令【IN/OUT/MOV】时,外设必定已为传送数据做好了准备。
基本原理
传送数据之前,CPU先对外设状态进行检测,直到外设准备好才开始传输。
工作原理
外设数据准备好或准备好接收时,产生中断信号
CPU收到中断信号后,停止当前工作,处理该中断事情:完成数据传输。
CPU处理完毕后继续原来工作
特点
CPU和外设并行工作
CPU效率提高
缺点
设备较多时中断频繁,影响CPU的有效计算能力。
CPU数据吞吐小(几个字节),适于低速设备。
概念
通道是用来控制外设与内存数据传输的专门部件。
通道有独立的指令系统,既能受控于CPU又能独立于CPU。
I/O处理机
特点
有很强I/O能力,提高CPU与外设的并行程度
以内存为中心,实现内存与外设直接数据交互。
传输过程基本无需CPU参与
【这里是printk,意思是输出到内核缓冲区中】
【可见安装、删除模块会分别调用module_init()和module_exit()】
设备驱动概念
程序访问设备有两种典型的方法
方法一:直接通过I/O指令操作硬件
方法二:通过系统调用间接控制硬件
设备驱动程序(Device Driver)
硬件设备的接口程序,直接控制硬件各种操作。
向上为文件系统接口提供服务
向下执行I/O指令控制硬件设备工作
面向用户程序的接口
面向I/O管理器的接口
面向设备的接口
设备的打开与释放
设备的读写操作
设备的控制操作
设备的中断处理
设备的轮询处理
注册函数:insmod
注销函数:rmmod
必需的数据结构
实现与设备相关一系列的端口操作
无条件传送
查询传送
中断传送
DMA传送
主设备号
标识该设备种类,标识驱动程序
主设备号的范围:1-255
Linux内核支持动态分配主设备号
次设备号
标识同一设备驱动程序的不同硬件设备
【红色的和蓝色的结构必须实现】
例子:
【使用了宏:增加使用计数和减少使用计数】
【功能分析:buffer的值传给led_status,当其值为1时,点亮LED,不为1时,关闭LED】
【将我们自己写的函数与文件标准函数对应】
【对应之后我们可以用这样的格式调用我们自定义的函数了】
动态加载
通过insmod等命令
调试过程
1.什么是设备映射?
物理设备是指实际安装的设备,逻辑设备是指应用软件使用的设备(逻辑名)。物理设备是逻辑设备的实例,逻辑设备是物理设备的抽象。设备管理模块将逻辑设备映射到物理设备。
2.什么是设备的独立性?
物理设备对用户透明,用户使用统一规范的方式使用设备。用户编程时使用设备逻辑名,由系统实现逻辑设备到物理设备的转换。(统一接口、设备无关性)
3.什么是虚拟分配?什么是Spooling技术
虚拟分配是指,当进程需要与独占设备交换信息时,采用虚拟技术将与该独占设备所对应的虚拟设备分配给它。
Spooling系统是虚拟技术与虚拟分配的一种实现:输入井和输出井是磁盘上开辟的两个存储区域,模拟脱机输入输出时的磁盘;输入缓冲区和输出缓冲区是内存中开辟的存储区域,暂存输入输出数据,便于将来传入输入井或输出设备;输入输出监控进程模拟脱机输入输出的卫星机
4.SPOOLing系统的工作原理是什么
任务执行前,预先将程序和数据输入到输入井;
任务运行时,要使用数据,从输入井取出,要输出数据,写入输出井;
任务运行完,外设空闲时输出全部数据和信息
5.Linux设备主要有哪三类,各有和特点?
字符设备:以字节为单位逐个进行I/O操作
块设备:块设备的存取是通过buffer、cache来进行,可以进行随机访问,支持可安装文件系统。
网络设备:通过BSD套接口访问(SOCKET)
6.什么叫设备文件,如何读写,有何作用
所有的设备都是以文件的形式描述,这类文件称为设备文件。
要操作一个设备,就是对一个对应的文件进行读写。可以按照文件一样对设备文件进行 open / read / write 等操作。当应用程序对一个设备文件调用这些系统调用时,驱动将收到这个操作的请求,然后调用相对应的操作进行处理,这样就可以和kernel层的dev设备关联起来。
7.Linux中如何把驱动程序中自定义的接口与文件操作的标准接口关联起来?
在结构file_operations里,指出了设备驱动程序所提供的入口点位置,设备驱动程序所提供的入口点在设备驱动程序初始化的时候向系统进行登记,以便系统在适当的时候调用。
通过在file_operations结构体中为open、write、release等变量赋值,可以将自定义接口与标准接口相关联。
8.给出Windows中应用程序访问设备对象的一种方法
驱动程序中创建设备对象并命名(用IoCreateDevice),应用程序通过符号链接访问设备对象(用IoCreateSymbolicLink)。
1.操作系统公司会不会去专门花精力编写外设的控制程序/驱动程序呢
不会,操作系统公司只需要做好接口标准就行,外设的驱动程序交给外设生产商去做。毕竟外设种类样式繁多。
2.什么是LINUX模块机制
LINUX模块机制就是把功能模块化,外部代码经过装载即可成为内核的一部分,模块也可以动态卸载、动态加载、动态更新。