【操作系统】【计算机组成原理】从总线理解IO子系统

本文从总线的角度入手,讲解IO层的内容。

三总线结构

总线是计算机各种功能部件之间传送信息的公共通信干线,按照传输内容的不同可以有很多分类方法。本文介绍的是三总线模式,即在计算机系统各部件之间采用三条总线,分别是贮存总线、IO总线和DMA总线。
主存总线负责CPU和内存之间传送地址、数据和控制信息,IO总线负责CPU和外设接口的通信,这就涉及到了IO接口的问题。DMA则是专门负责DMA通信,DMA则是一种特殊的IO控制方式。
在以上三总线的模式下,我们就可以来研究对应的IO系统如何工作。

内核、IO系统和IO硬件

IO层是操作系统一个很重要的子层,因此IO层在内核,并且和硬件联系。在IO层上有文件系统,或者说是虚拟文件系统(这是因为VFS就是抽象出的管理不同文件系统的层级)会发出IO请求,对应到具体的代码就是系统调用,这也印证了对IO的控制操作是在内核态完成的。而IO层在不同的架构中也会分为多种不同的层级,当我们把IO的软件层视为整体时,其下层就是设备驱动和硬件,可以供用户使用。对文件系统的详细描述见:从Ucore分析OS文件系统
在这里插入图片描述
根据上文所述,对于IO,可以粗略的认为IO=IO硬件+IO软件。IO硬件包括外设、IO接口和总线。IO软件则由设备独立性软件、设备驱动程序和中断处理程序组成。

IO外设

外设可以有很多种分类方式,按速度可以是高速外设(例如磁盘、显卡)和低速设备(鼠标、键盘,每秒几个到数百字节)。

IO控制器

CPU无法直接控制IO设备,需要有一个中介,即IO控制器。故IO控制器负责CPU与设备之间的控制信息发送和接收、状态识别和报告、数据交换和地址识别等。
在这里插入图片描述
由于需要进行控制信息、数据、地址信息和状态信息的交换,故控制器内设置了对应的寄存器;为了和设备连接则设置了接口;为了接受和识别CPU的各种命令(如地址译码,并发出对应命令,则设置了IO逻辑部件。IO端口是指IO接口(IO控制器)中的寄存器。其编制方式分为独立编址和统一编址。独立编址是为每个寄存器分配单独的地址,用户无法访问,只有依靠特殊的IO指令次啊能访问。例如内存从0-N,而IO端口的地址也是从0开始。统一编址又称为内存映射IO,IO端口在内存中分配独属的地址空间,例如内存是从0-n,IO端口是从n+1开始。

总线

和之前提到的三总线一样,低速设备就使用普通的IO接口,高速且大量交换数据的设备则可以使用DMA接口。在现代计算机中可能使用四主线结构,但在这里不主要说明。而通道控制方式是二总线的,其实相当于进程间通信,不与CPU产生关系。

软件

软件分为三层,设备独立性软件、设备驱动程序和中断处理程序。在设备独立性软件之上的就是用户程序(用户进程),用户进程向设备独立性软件层发出IO请求,即对应的系统调用,根据请求设备的不同会选择不同的输入输出接口。(这是由于不同设备的逻辑不同,需要的系统调用也不同。为了向下一层屏蔽这种差异,就针对不同的设备使用不同的输入输出接口,使得接口向下传输的数据可以统一匹配设备独立性软件层。)具体的输入输出接口如图所示,其区别在于传输的内容(字节还是块,或者是网络消息,即socket通信。而socket通信是在socket的一系列操作后,选择对应的OS协议,经由驱动程序控制网卡进行通信)

设备独立性软件层

什么是设备独立性软件呢?设备独立性软件,也可以称为与设备无关的软件,即其执行的工作都是和设备的具体细节无关的,如下图所示:
在这里插入图片描述
(1)IO的调度(例如磁盘调度算法,look、scan等)。调度可以是使用scheduler进行调度,现在的Linux里还加入了多级队列的概念。但其本质仍未对IO顺序的调度。
(2)设备保护。基于万物皆文件的思想,外设也是特殊的文件,设备也会有对应的FCB,故也会涉及到访问权限,因此实现设备保护。
(3)设备的分配与回收
设备分为独占设备、共享设备,独占设备是一个时段只能把设备分配给一个进程,而共享设备则是宏观上可以共享,但某一时刻仍为交替使用的,例如磁盘。独占设备的分配往往是静态分配,即运行前就分配好全部资源。与之对应的是动态分配,是在运行过程中进行设备的分配。但若分配算法出现问题则可能出现死锁。虚拟设备则是使用磁盘作为缓冲,让每个进程都觉着是自己独占了设备,这里不详细赘述。
(4)缓冲区管理
并非所有设备都要使用DMA方式,对于普通的外设,如何提高其与CPU的并行能力和效率也是需要考虑的问题。为此,引入缓冲区和磁盘高速缓存(disk cache或者page cache)。
注意缓冲和缓存的区别。缓存(cache)是存储副本,例如内存和cache,如果要查找内容则先查找缓存,没有所需内容再去内存中查找。而缓冲是为了平衡速度的不平衡。例如CPU速度快于普通的IO设备,则可以先让设备把传输内容传进缓冲区,CPU再进行处理。
所谓高速缓存,则是使用内存的一片区域存放正在运行的进程的数据,因此可以提高IO效率。而缓冲区则是在内存开辟一片区域当作缓冲,以外设输入为例,外设花费时间T输入数据至缓冲区,再进行中断报告,CPU则缓冲区内容取到工作区,花费时间M,再进行处理,花费时间C。
引入缓冲区(buffer)的原因有:缓和速度矛盾、减少中断频率(biffer一般比register更大,可以存储更多内容,因此放缓了中断的频率)、解决粒度不匹配问题(统一数据块的大小)、提高CPU与IO设备的并行(放缓中断就可以认为是提高了并行)。 常用的方法有单缓冲、双缓冲、循环缓冲和缓冲池(buffer pool)。

除此之外还有差错检测、逻辑名到物理名的映射等功能。
总而言之,这一层就是完成了管理和分配设备,并使得数据进入驱动程序的时候是合规的、无错的。

驱动设备

每个厂商的产品都不尽相同,甚至同一厂商不同型号的产品也会存在差异。由于这种差异性,OS不可能对每一种产品都个性化管理,因此设备驱动层就是对应的不同设备的驱动程序,有了对应的驱动程序,设备才能明白上一层发出的操作是什么意思,转化为该设备独有的操作。
这里所说的驱动层是粗略的一层,实际上驱动层还会根据IO设备的不同再细分为不同的层次,大致了解即可。

中断处理

中断分为外中断和内中断。或者说是广义的中断和狭义的中断。外部中断指的是外设中断或人工干预(强行终止进程),响应这种中断是在每条指令的执行末尾会进行中断检测,若检测到中断则会进行中断处理:
在这里插入图片描述
上图的中断周期实际上是中断隐指令,是由硬件完成的。而中断服务子程序的开中断则是使用开中断指令完成的,是软件行为。
内部中断分为三类:陷入、故障和终止。陷入往往是人为设定的,例如进行系统调用时,程序会由用户态陷入到内核态,进而去处理问题。故障是由错误条件引起的,可能会被处理程序修复的错误。例如缺页中断,这显然是一种可以被修复的错误。终止是不可恢复的错误,引发程序停止运行。例如除零。

IO控制方式

1.程序控制
程序控制是当产生了IO命令后,CPU不断查询IO控制器的状态,即检测其状态寄存器,检测数据寄存器是否填充完成。当填充完成后,CPU则将数据与存储器交互。这种方式十分低效,因为CPU若想要得知IO寄存器内的内容状态,或者说任务是否完成,则需要主动查询,IO没有办法可以通知CPU是否完成任务。
2.中断方式
相比较与程序查询方式,可以认为中断是一种报告的方法。在程序查询方式中,由于IO设备缺少能够主动通知CPU完成工作的方式,就需要CPU不断的查询IO设备是否完成工作,进而进行下一次工作,即下一次查询。而中断方式的出现,使得设备有了通知CPU其以及完成一次任务的方式,因此释放了CPU,使其可以转而去执行其他内容。CPU需要做的就是在得到中断通知后,将数据与存储器交互。
3.DMA,direct memory access,直接存储访问
不难发现,中断方式仍需要CPU来进行数据的传输,这在面对高速设备时仍会占用大量的CPU资源。因此出现了DMA方式,可以让IO存储器在得到CPU允许的情况下直接传送数据,进一步释放了CPU。值得一提的是,DMA方式往往对应的是高速IO设备,因此其IO控制器也升级为DMA控制器,以应对高速设备。DMA方式只会在发出DMA请求时告知CPU,并在完成数据传输之后使用中断的方式报告CPU。因此,在IO设备工作的过程中,中断是一种结束任务的报告方式,也就只有结束时才会中断。只有程序查询不涉及中断,需要CPU主动查询状态。

整体的执行流程

这是最重要的,能否理解好IO系统就在于理解下图:
在这里插入图片描述
首先是发出IO请求,实际上是对应的系统调用。系统根据设备类型选择合适的输入输出设备,并将处理结果传递至下一层,向驱动程序发送IO请求。驱动程序收到请求后进行IO处理,即针对对应设备做出处理。控制信息发向IO控制器(并不会触发中断,因为此时设备还未进行操作),IO控制器传递数据等内容给设备,设备进行操作,再返还给IO控制器。而此时就需要启动中断,需要CPU处理中断信号,最终的返回结果就是系统调用成功,返回对应的返回值。
但对于想键盘这样的通过中断方式工作的IO设备,敲击键盘会触发的是中断服务程序,CPU获取到键盘输入的信息,并进行处理。
因此对于不同的IO设备,处理的过程不尽相同。对于通过用户程序操作的设备就会像图中所给流程一样进行处理,而键盘、鼠标这样的设备就会先触发中断程序。
这种分层思想和计算机网络的分层是一样的。在用户看来(详细说应当是用户进程),只是调用了系统调用并得到了返回值,下层如何处理,设计什么协议等问题均为透明的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值