以前说过,计算机各设备通过总线连接,各总线有自己的规格和协议。
现在说一下无论采取什么总线都必须面对的一个问题:通信时机。
1,轮询,感觉没什么好说的,CPU不断的来设备控制器读数据,有就处理数据,没有就返回继续原来的工作
2,中断,中断用白话文来讲就是,外设有数据需要处理时,设备控制器告诉CPU一下,CPU就过来处理了。
在I/O设备中断方式下,中央处理器与I/O设备之间数据的传输步骤如下:
⑴在某个进程需要数据时,发出指令启动输入输出设备准备数据
⑵在进程发出指令启动设备之后,该进程放弃处理器,等待相关I/O操作完成。此时,进程调度程序会调度其他就绪进程使用处理器。
⑶当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转向预先设计好的中断处理程序,对数据传送工作进行相应的处理。
⑷得到了数据的进程,转入就绪状态。在随后的某个时刻,进程调度程序会选中该进程继续工作。
其中第一第二步可以不存在,比如说键盘和网卡的中断,就没有第一第二步。所谓的中断处理程序是设备驱动程序的一部分(工作在处理器的中断模式下)。
在硬件上必须要CPU支持中断,而且现在一般都会有个中断控制器,各个外设先向中断控制器发送信号,中断控制器经过处理后(屏蔽或者挑选中断优先级最高的)再把信号发送给CPU,CPU收到这个信号之后就会直接在硬件上跳转到中断处理程序(即不需要代码来实现,但会保存现场)。所以软件工程师只需要设计中断处理程序,还有设置中断控制器的寄存器(即设置中断信号处理方式),但这一切都需要有硬件支持。
3,DMA,数据在内存与I/O设备间直接进行成块传输。DMA工作过程
⑴当进程要求设备输入数据时,CPU把准备存放输入数据的内存起始地址以及要传送的字节数分别送入DMA控制器中的内存地址寄存器和传送字节计数器。
⑵发出数据传输要求的进行进入等待状态。此时正在执行的CPU指令被暂时挂起。进程调度程序调度其他进程占据CPU。
⑶输入设备不断地窃取CPU工作周期,将数据缓冲寄存器中的数据源源不断地写入内存,直到所要求的字节全部传送完毕。
⑷DMA控制器在传送完所有字节时,通过中断请求线发出中断信号。CPU在接收到中断信号后,转入中断处理程序进行后续处理。
⑸中断处理结束后,CPU返回到被中断的进程中,或切换到新的进程上下文环境中,继续执行。
总的来说就是DMA控制器有了原来CPU的一部分功能(读外设数据存取到内存)而且把这部分功能给改造过了。
4,通道方式。
输入/输出通道是一个独立于CPU的,专门管理I/O的处理机,它控制设备与内存直接进行数据交换。它有自己的通道指令,这些通道指令由CPU启动,并在操作结束时向CPU发出中断信号。
输入/输出通道控制是一种以内存为中心,实现设备和内参内直接交换数据的控制方式。在通道方式中,数据的传送方向、存放数据的内存起始地址以及传送的数据块长度等都由通道来进行控制。
另外,通道控制方式可以做到一个通道控制多台设备与内存进行数据交换。因而,通道方式进一步减轻了CPU的工作负担,增加了计算机系统的并行工作程度。
在通道控制方式中,I/O设备控制器(常简称为I/O控制器)中没有传送字节计数器和内存地址寄存器,但多了通道设备控制器和指令执行部件。CPU只需发出启动指令,指出通道相应的操作和I/O设备,该指令就可启动通道并使该通道从内存中调出相应的通道指令执行。
通道相当于一个功能单纯的处理机,它具有自己的指令系统,包括读、写、控制、转移、结束以及空操作等指令,并可以执行由这些指令编写的通道程序。
采用通道方式后,输入/输出的执行过程如下:
CPU在执行用户程序时遇到I/O请求,根据用户的I/O请求生成通道程序(也可以是事先编好的)。放到内存中,并把该通道程序首地址放入CAW中。
然后,CPU执行“启动I/O”指令,启动通道工作。通道接收“启动I/O”指令信号,从CAW中取出通道程序首地址,并根据此地址取出通道程序的第一条指令,放入CCW中;同时向CU发回答信号,通知“启动I/O”指令完成完毕,CPU可继续执行。
通道开始执行通道程序,进行物理I/O操作。当执行完一条指令后,如果还有下一条指令则继续执行;否则表示传输完成,同时自行停止,通知CPU转去处理通道结束事件,并从CCW中得到有关通道状态。
总之,在通道中,I/O运用专用的辅助处理器处理I/O操作,从而剪径了主处理器处理I/O的负担。主处理器只要发出一个I/O操作命令,剩下的工作完全由通道负责。I/O操作结束后,I/O通道会发出一个中断请求,表示相应操作已完成。
现在外设的速度越来越快,通道似乎不常见了。但我在很小的时候就有的CPU只能去内存中读取数据的错误观念可能就是由此知识点被人误解后传到我耳朵中的吧。
最常见的是DMA和中断。有关中断,我觉得还是多写几句把他稍微说清楚点吧。
讲到具体细节时,我只能以arm为例了。中断分为硬件中断和软件中断,这里只说硬件中断。不同的arm支持不同个数个中断源,三四十个是正常的,中断控制器可以识别是哪个中断源,然后通过中断控制器的寄存器的数据告诉CPU是哪个中断。中断控制器可以通过编程把中断分为三类,快速中断(FIQ),向量IRQ,非向量IRQ。优先级为FIQ>向量IRQ>非向量IRQ。如果是向量IRQ,还要在中断控制器中设置,向量IRQ中断级别。他们都需要设置ISR地址。向量中断就是不同的中断有不同的入口地址,非向量中断就只有一个入口地址,进去了在判断中断标志来识别具体是哪个中断。向量中断实时性好,非向量中断简。
所谓的向量中断表就是:
ARM只对不同的中断类型提供了一个地址,但是这些地址里面是不够存放用户编写的中断处理程序的。用户自己写了中断处理程序,然后把中断处理程序的入口放在系统预定义的中断地址处,这样在发生中断后就会跳转到用户编写的中断处理程序处。 最近就讲这些了,得先努力学习一段时间再发博文了。
阅读(2463) | 评论(0) | 转发(0) |