CPU 是如何与外围设备通信的
2021-12-03 17:35:59 最后更新: 2021-12-03 17:35:59 访问数量:398
2021-12-03 17:35:59 最后更新: 2021-12-03 17:35:59 访问数量:398
此前的文章中,我们通过向地址 B8000h 写入数据来实现在显示器上输出彩色的文本,我们介绍说这是“彩色字符模式”,并且介绍了它的用法:
可是,你是否好奇这一切是为什么,CPU 是如何与这些硬件连接并进行处理的呢?
本文我们就来探究这其中的奥秘。
如果你接触过单片机电路的设计,你会将作为 CPU 的单片机的各个管脚直接与外围设备进行连接,最早的计算机架构正是这样的。
将每个设备连接到固定的管脚,然后通过 IO 指令直接操作对应管脚上的设备,这是最简单的计算机架构组织方式了。但这样发展下去,很快就会发现 CPU 的管脚完全不够用了。此时,使用一套抽象的外围设备管理和操作方式就显得至关重要了。
现代操作系统中,所有外围设备都被一个抽象的设备 -- 总线作为桥梁与 CPU 的核心线路连接在一起。
所有设备都被编排到一个地址空间中,设备与设备之间的区别仅在于他们所处的地址不同,当 CPU 需要操作某个设备时,只需要根据先前约定的设备所在的地址,通过 IO 指令操作地址引脚,借由一块 74LS373 锁存芯片将地址信号发往总线,同时,CPU 再操作数据引脚,借由一块 74LS245 芯片与总线进行数据通信。
总线收到请求后,就会根据地址编码找到对应的设备,将从数据引脚收到的数据发送到对应的设备,从而实现对相应设备的操作。
如图所示,整个线路由核心的一块 8284A 时钟芯片发出周期性的时钟信号,CPU 通过 8288、74LS373、74LS245 三块芯片实现与总线的通信,分别实现控制总线、地址总线、数据总线的功能。
除此以外,图中级联在 CPU 上的两片中断控制器 8259A 我们已经有过详细的介绍了。
通过这套架构,我们就可以直接向先前约定好的 B8000h 写入指定格式的数据,就像操作普通的内存一样,就可以实现显示器设备的操作了,其他的诸如硬盘、声卡等设备也都被简化为这样的操作逻辑。
可以看出这样的抽象架构下,计算机核心的软硬件系统实现了极大地通用性和便捷性,外围设备经过抽象,也可以实现相当灵活的可扩展性。
但上图中还有一块 8237A 芯片,这又是什么呢?接下来我们就来详细介绍一下。
内存与硬盘作为两个存储设备,承载了与 CPU 最为频繁的通信。
经过前面的文章介绍,我们已经非常清楚,保护模式下,通过内存数据中特权级的保护,实现了不同内存读写、执行等权限的管理,从而避免了操作系统特权级的反复切换。
但硬盘则不然,由于硬盘数据具有持久性,所以不可能做到针对单条数据授予操作系统不同特权级的访问权限,这意味着,操作系统的每次对硬盘进行读写操作,都必须切换到内核态才可以进行,而由于硬盘读写速度的限制,当 CPU 向总线发起读写请求,需要阻塞一段时间后才能够真正收到标志着完成时间的中断信号,这时,CPU 又要需要保存执行上下文,陷入到中断响应函数中,进行大量的拷贝工作,从而完成从硬盘到内存的数据接收。
显然,这一过程会极大地拖慢系统的响应能力,这是操作系统无法容忍的。
DMA 是 Direct Memory Access 的缩写,它通过引入一块与 CPU 级联的 8237A 芯片代理 CPU 的中断响应以及大量数据拷贝工作,这块芯片也就是 DMA 控制芯片,他的存在让 CPU 与磁盘的交互从:
变成:
这样,CPU 便从持久的阻塞状态与繁重的拷贝工作中解放了出来:
上述通过 DMA 芯片进行的硬盘读写过程需要进行四次特权级切换和四次拷贝操作。
如果能够减少这些特权级切换和拷贝操作,系统性能必然会大幅提升。
从这一思路出发,“零拷贝”技术就这样诞生了,那么,大名鼎鼎的“零拷贝”技术到底是出于什么样的思路设计,又有哪些实现呢?敬请期待下一篇文章,为您详细解读。