读书频道 > 系统 > windows > Windows内核原理与实现
6.1.1 现代计算机系统的I/O
2013-05-18 16:03:30     我来说两句 
收藏    我要投稿   

本文所属图书 > Windows内核原理与实现

本书从操作系统原理的角度,详细解析了Windows如何实现现代操作系统的各个关键部件,包括进程、线程、物理内存和虚拟内存的管理,Windows中的同步和并发性支持,以及Windows的I/O模型。在介绍这些关键部件时,本...  立即去当当网订购

按照传统的分类方法,I/O 设备可以分为块设备和字符设备。像磁盘、光盘是典型的块设备,寻址和读写操作都是以块为单位进行的。另一类是字符设备,它们接收或发送的数据是字节流,而不是数据块。典型的字符设备有键盘和鼠标。这种分类方法以设备数据的组织单元为基础,它显然适用于单纯以传输数据作为交互方式的设备。然而,有些外部设备,比如时钟发生器、电源控制器等,显然既不能归为字符设备,更不会是块设备。

尽管这种分类方法并不能恰当地涵盖所有可能的设备,但是,它至少将块设备作为一种类别提了出来。现代操作系统往往针对块设备使用专门的软件结构,比如设计文件系统时只须考虑抽象的块设备(诸如块的大小、总数等可以由特定的配置参数来控制),而实际的块设备读写过程则由更低层的驱动程序来处理。

处理器往往只跟设备的控制器打交道,而不直接操纵设备。处理器与控制器之间通过总线进行通信,而控制器与设备之间的通信则往往通过专门的接口进行,如图6.1所示。这些控制器的功能可能非常简单,比如像键盘控制器,它只处理键盘扫描码以及与系统进行简单的通信;有些控制器的功能可能非常复杂,比如现代的硬盘控制器,除了最基本的控制磁头读写数据的能力以外,还提供了校验数据的功能,以及不小的缓存空间。上一章中介绍的中断控制器也是一种控制器,其特殊之处在于,通过给处理器的一个管脚加上电信号,从而打断处理器当前的运行。许多设备利用中断控制器来通知处理器某些事情的发生,比如设备驱动程序请求的数据已经准备就绪。在上一章中我们已经看到了Windows如何利用Intel x86 处理器的中断机制来实现统一的中断处理。


 

设备控制器中往往有一些状态寄存器或者命令寄存器,因而处理器可以通过操纵这些寄存器,从而控制相应的设备,比如告诉控制器发送数据、接收数据、打开或关闭某些特定的功能。所以,操作系统的任务是根据设备的工作模式,读或写这些寄存器,从而达到控制外部设备的目的。

控制器中除了状态寄存器或者命令寄存器以外,可能还包含了可供处理器读写的数据缓冲区,例如块设备需要一个双方都可以访问的缓冲区用于传输数据;视频适配器往往有一段视频内存地址范围,允许处理器操纵显示器的屏幕输出结果。

我们来看一下Intel x86 处理器提供的设备接口功能。首先,Intel x86 处理器除了内存地址空间以外,另外定义了一个I/O 端口(port )空间,指令in 和out 用于操纵端口空间中的数据单元。例如,在下面的汇编指令中:

out 21h, al

0x21是8259A 中断控制器的中断屏蔽寄存器(IMR ,Interrupt Mask Register ),该指令将Intel x86 处理器的al 寄存器中的值写到中断控制器的控制寄存器中,从而达到屏蔽某些中断信号的目的。类似地,在下面的汇编指令中:

in al, 20h

0x20是8259A 中断控制器的正在服务寄存器(ISR ,In Service Register ),该指令将此寄存器中的状态值传递到处理器的al 寄存器中。在 Intel x86 处理器中,in 和out 指令的I/O端口操作数可以是8 位或16位(使用 dx寄存器),而I/O 端口的值可以是8 位、16位或32位。

设备控制器中的寄存器除了通过I/O 端口来访问以外,也可以被映射到系统内存空间。这种访问方案称为内存映射I/O(memory-mapped I/O)。例如,APIC中断控制器中的寄存器被映射到4 KB 大小的APIC寄存器地址空间,而APIC寄存器地址空间又被映射到系统内存中,其基地址可以通过 APIC基寄存器(即 IA32_APIC_BASE ,是 Intel x86 处理器中的一个MSR寄存器)来设定,默认为0xfee00000 。

一旦设定了内存映射I/O 的地址范围以后,当处理器寻址到此地址范围时,它实际上访问的就不再是原始内存空间中的存储单元,而是设备映射的数据单元。Intel x86 处理器既支持I/O 端口地址空间,也支持内存映射 I/O。另一个典型的内存映射 I/O 的例子是,视频缓冲区被映射到内存地址空间中,因而软件可以直接访问屏幕上显示的像素。在早期的IBM PC 中,从640 KB至1 MB 之间的地址专门保留给设备的数据缓冲区,其中包括单色和彩色VGA的显示缓冲区。

因此,处理器可以通过 in/out 指令或者直接读写内存的方式与各种控制器打交道,那么,设备在执行任务时,如何将任务的状态反馈给处理器呢?一种做法是,设备控制器提供一个状态寄存器,因而处理器可以定期或者用忙等待(busy-wait )的方式检查此寄存器。然而,除非要等待的时间预计不是很长,否则忙等待的做法应该避免。另外一种做法是,设备用中断的方式来通知处理器。当处理器接收到中断信号时,它可以根据中断的设置或者设备寄存器的状态,来作相应的处理。

对于少量的数据交换,或者像VGA显示缓冲区这样固定地址范围的数据映射,使用上述做法是合适的。但是,对于像磁盘这样需要大量动态数据交换的设备,如果处理器使用I/O 寄存器逐个内存单元进行访问,或者通过固定地址范围的数据映射,则不仅存取效率不高,而且处理器操作也极为不便。对于这种情形,现代计算机通常采用一种称为直接内存访问(DMA,Direct Memory Access)的方案。DMA需要硬件的支持,它也是一种控制器。既可以整个系统共享一个DMA控制器,也可以让一个设备,比如磁盘,有单独的DMA 控制器,这取决于硬件的设计。DMA 控制器通过系统总线来传输数据,但是它在传输数据时不占用处理器的指令周期,所以,使用DMA可以将处理器解放出来。当数据传输完成时,DMA 控制器以中断的方式通知处理器。图6.2 显示了通过DMA控制器来读写硬盘数据的硬件结构。


 

处理器通过DMA控制器中的寄存器对数据传输进行设置,指定所读写数据在内存中的地址、数量,以及传输方向。如果不使用 DMA控制器,那么处理器必须自己逐个字节或逐个字地在硬盘控制器和内存之间传输数据,数据的传输通过总线来完成。而使用了DMA 控制器以后,DMA 控制器代替处理器来做同样的事情,它逐个字节或逐个字地向硬盘控制器发送命令,同样地通过系统总线来完成数据传输。当数据传输完成以后,它中断处理器,因此,当处理器接收到中断时,就知道数据已经在内存中指定的地方,或者已经写到硬盘控制器中了。

DMA控制器接到了处理器的读取硬盘数据的命令时,会首先告诉硬盘控制器,将要读取的数据先放到硬盘控制器的缓冲区中。从硬盘到硬盘控制器之间的数据传输是通过专用接口完成的,不需要使用系统总线,此通信完全不受硬件系统其他模块的影响。当数据到达硬盘控制器的缓冲区中,并且通过了校验和验证以后,DMA传输就可以进行了,接下来的数据传输需要用到系统总线。

当DMA控制器通过总线向硬盘控制器发出读请求时,磁盘控制器既不知道也不关心此请求来自处理器还是DMA控制器,由于要写的内存地址已经在总线的地址线上了,所以,磁盘控制器从内存缓冲区中取出当前要传输的字,将它送到总线上。这样就完成了一个字的传输。DMA控制器用这种方法,将处理器指定要读取的所有字逐个地传输到内存中。然后向处理器请求中断。向硬盘写数据的过程类似,只是方向相反,这里不再介绍。

简单小结一下,在现代计算机体系结构中,处理器通过 I/O 端口或者内存映射I/O 的方式与硬件设备的控制器打交道,而非直接操纵硬件设备。Intel x86 处理器提供了in/out指令来访问I/O 端口空间,并且也支持内存映射I/O。为了在内存与设备之间传输大量数据,现代计算机往往采用DMA结构,以便将处理器从数据传输任务中解脱出来。当DMA数据传输完成时,DMA控制器以中断的方式通知处理器。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:6.1 I/O 概述
下一篇:6.1.2 I/O 软件技术
相关文章
图文推荐
3.4.4 进程生命期管
3.4.2 Windows应用商
3.4.1 Windows应用商
3.4 进程生命期管理
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站