硬件存储体系
寄存器
处理器内部定义的存储体,它们除了存储功能,往往还兼有其他的能力,比如参与运算,地址解析,指示处理器的状态,等等。寄存器是由处理器内部专门的触发器电路实现的,处理器往往只有少量的寄存器,其存储能力不超过几百字节,而且一旦系统断电,则寄存器的内容随之丢失。
L1缓存
这是靠近处理器的缓存,它存放的时处理器最近访问过的内存数据。缓存通常是由SRAM(静态随机访问寄存器)来实现,而系统的主内存则是由DRAM(动态随机访问寄存器)来实现的。从技术上来讲,SRAM比DRAM要快,但是它的集成度地,需要更多的晶体管。SRAM只要有电就能持续保持其状态,所以不需要刷新;DRAM不同,他需要定时刷新,读出来再写回去,才能保持其状态。
L1缓存工作原理时,当处理器指令访问内存时,它使用虚拟地址来引用内存单元,首先检查L1缓存中是否有该内存单元,若有则无须再访问物理内存,而是直接读或写L1缓存中的单元。如果L1缓存中没有该内存单元。那么,首先计算出对应的物理地址,然后检查L2缓存中是否有该内存单元。若L2缓存中有,则将该单元复制到L1缓存中,否则需要从物理内存中获得该内存单元。
L2缓存
L2缓存也是由SRAM来实现的,只不过更加靠近系统的主内存而不是处理器。与L1缓存不同的是,L2缓存是用物理地址来寻址的。当L1缓存需要物理内存单元时,它会检查L2缓存,并使用其中的存储单元,若有必要,则从物理内存复制到L2缓存中。在实践中增加L2华纳从对于许多软件都会有显著的性能提升。因此,处理器厂商在平衡成本开销的同时,应尽可能地加大L2缓存。
主内存
在物理上,内存是由DRAM来实现地,它比L1和L2缓存慢,但容量要大得多。一个系统中当前正在使用地数据,包括系统本身地数据,以及各个应用程序用到地数据,都存放在内存中。内存是易失的,一旦系统断电,内存也会随之丢失。
本地一级存储设备和远程存储设备
这一层的存储设备是永久存储体,系统掉电以后其数据不会丢失。操作系统或应用程序若要访问这些存储体上的代码或数据,必须通过文件系统和设备驱动程序,将代码或数据载入到内存中,然后处理器才可以访问
本地二级存储和远程二级存储
为了保障数据安全或提供更大空间的存储能力,有些系统还配备了二级永久存储设备,比如用磁带设备来备份一个系统中的数据,或者通过索引库来访问一个包含大量光碟的影像资料库。二级存储也可能是远程的,比如将数据导入到一个分布式存储系统中,或者链接一个网络文件系统。
Windows I/O硬件
Intel X86处理器除了内存地址空间以外,另外定义了一个I/O端口空间,指令in和out用于操纵端口空间中的数据单元。例如:out 21h,al,该指令将Intel X86处理器的al寄存器中的值写到中断控制器的控制寄存器中,从而达到屏蔽某些中断信号的目的。在Intel X86处理器中,in和out指令的I/O端口操作数可以是8位或16位,而I/O端口的值可以是8位,16位或32位。
设备控制器中的寄存器除了通过I/O端口来访问以外,也可以被映射到系统内存空间。这种访问方案被称为内存映射I/O。例如,APIC中断控制器中的寄存器被映射到4KB大小的APIC寄存器地址空间,而APIC寄存器地址空间又被映射到系统内存中,其基地址可以通过APIC基寄存器来设定,默认为0xfee00000。
一旦设定了内存映射I/O的地址范围以后,当处理器寻址到此地址范围时,它实际上访问的就不再是原始内存空间中的存储单元,而是设备映射的数据单元。Intel x86处理器既支持I/O端口地址空间,也支持内存映射I/O。另一个典型的内存映射I/O的例子时,视频缓冲区被映射到内存地址空间中,因而软件可以直接访问屏幕上显示的像素,在早期的IBM PC中,从640KB到1MB之间的地址专门保留给设备的数据缓冲去,其中包括单色和彩色VGA的显式缓冲区。
设备在执行任务时,如何将任务的状态反馈给处理器呢?一种做法是,设备控制器提供一个状态寄存器,因而处理器可以定期或者用忙等待的方式检查此寄存器。然而,除非要等待的时间预计不是很长,否则不应该用忙等待的做法。另一种做法是,设备用中断的方式来通知处理器。当处理器接收到中断信号是,它可以根据中断的设置或者寄存器的状态,来作相应的处理。
如果对于磁盘这样需要大量动态数据交换的设备,通常采取直接内存访问(DMA)的方案。DMA需要硬件的支持,它也是一种控制器。既可以整个系统共享一个DMA控制器,也可以让一个设备有单独的DMA控制器。DMA控制器通过系统总线来传输数据,但是它在传输数据时不占用处理器的指令周期。所以,使用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控制器以中断的方式通知处理器。
Windows I/O 软件
设备的软件组件通常被称为设备驱动程序,驱动程序通常运行在处理器的特权模式下,其代码与操作系统的内核代码有同样的特权。而与设备关联的驱动程序,其最基本的功能时,将操作系统的功能请求,解释成针对该设备的请求,然后操纵设备以完成该请求,最后将结果以指定的方式返回给调用者,在此过程中有些事项是驱动程序必须要考虑的。与设备通信是同步或异步的方式,缓冲区的管理,共享和独占设备。
Windows I/O 系统结构
Windows I/O系统由五个部分组成:I/O管理器,即插即用管理器,电源管理器,WMI例程,以及设备驱动程序,其中I/O管理器是整个I/O系统的核心,它定义了一个非常通用的框架,运行各种功能的设备驱动程序容纳于其中。
I/O管理器除了支持与设备相关的驱动程序以外,它也允许与设备无关的驱动程序加入到内核中。这一类驱动程序并不操纵任何硬件设备,它们进入到内核中以后,将变成内核的一部分,一旦经过I/O管理器的初始化,便与内核融为一体。因此,设备驱动程序也是内核扩展的一种形式。
Windows I/O系统非常依赖注册表,例如,设备与驱动程序的很多配置信息都保存在注册表中,包括与硬件有关的一些描述信息,以及驱动程序初始化所需要的信息等。