软硬件融合技术内幕 基础篇(3) —— CPU外面有什么? (中)

2022-09-08 17:16:05 浏览数 (1)

前期我们介绍了经典的8位处理器——理光6502。与此同时,Intel也设计了8008,8051等应用广泛的8位处理器。1976年,Intel推出了新一代处理器8086。

8086是所谓的16位寄存器,也就是每次读写内存或读写IO外设的操作可以为16bit。

让我们回顾一下上期6502的引脚图:

6502有40根引脚,其中16根为地址线,8根为数据线。而8086的数据位宽为16位,地址为20位。显然,40根引脚是不够的。

因此,8086采取了地址/数据线复用的方式,也就是AD0-AD15的16条地址线和数据线进行复用:

当8086需要读写内存或外部IO设备的时候,先在AD0-AD15的这16条线上放出地址的低0-15位,同时A16-A19放出地址的16-19位,组成20位的地址后,再通过AD0-AD15放出或读取数据。

那么,问题来了:

内存芯片的地址线和数据线是分离的,如下图所示:

图中,A0-A14代表15条地址线,而IO0-IO7代表8条数据线。而8086处理器的16条地址线和数据线是复用的。那么,内存芯片是如何理解8086处理器在AD0-AD15上先发送地址,再收发数据的时序呢?

工程师们早就想到了这个问题。

如果有一颗芯片,可以将CPU在AD0-AD15上放出的16位的地址暂时记住(锁存),并连接到RAM的地址线。然后,AD0-AD15也直连到RAM的数据线,在AD0-AD15上放出或读取数据的时候,CPU可以从RAM的数据线上读写数据。

当然,CPU会通过电路通知锁存器:我要把AD0-AD15从输出地址切换为读写数据了,你现在锁存住地址!

有了锁存器后,CPU和内存的连接关系如下图:

图中的AD0-AD15,就是后来出现的CPU FSB(Front Side Bus)的前身,而锁存器后来也逐渐进化成为了北桥(North Bridge)…

8086还有几个好搭档:

第一个是8259。

在计算机系统中,一个很重要的概念叫中断(Interrupt)。中断是异步的,会让计算机停止现在正在执行的程序,转到预置的中断处理程序地址进行中断处理。一般地,在中断处理程序中,会保存中断现场(包括程序指针IP和其他重要寄存器),方便返回被中断的程序。

中断的触发依赖于中断引脚上收到的电信号。在8086中,实际上只有一个电信号能够触发中断。那么,当计算机中有键盘、鼠标、游戏摇杆、软盘驱动器、硬盘驱动器和串行口等多个IO设备的时候,如何让每个设备都可以触发处理器的中断呢?

这就依赖于8259(可编程中断控制器)了。在8259的帮助下,8086可以扩展出多个中断源:

如图,8253支持8个中断源,任意一个中断源发生中断 (从高电平跳变到低电平)的时候,8253会通过IRQ引脚向8086 CPU发起中断。CPU从D0/D7读取8253的状态寄存器,就可以得知实际上是哪个引脚产生的中断 (有可能是多个中断,想一想,这时候CPU应当如何处理?)

第二个搭档是8237。

8237是可编程DMA控制器。

什么是DMA呢?

如果我们需要从软盘驱动器(这个家伙,“保存”图标的来历)

读取一个扇区 (512字节)的数据的时候,CPU向软盘驱动器的寄存器写入了读取指令后,随着软盘驱动器的吱吱声,会循环发生3个动作:

  1. 软盘驱动器的磁头会逐字节地读取软盘的内容;
  2. 每读取一个字节,都会向CPU发起一个中断;
  3. CPU在中断处理程序里面,从软盘驱动器控制器中读取这个字节。

以上3个动作会重复512次。

这种工作方式对CPU的消耗是可想而知的。

因此,工程师们需要一种新的工作模式——DMA。

DMA指的是外设直接读取或写入RAM的内容,如软盘驱动器读取一个扇区以后,将这个扇区内容写入指定的RAM地址,然后通过中断通知CPU。

8237就是承担这一职责的协处理器,能够帮助外设向CPU申请DMA。CPU收到DMA申请的时候,会暂时封锁内存总线(暂停从内存总线上发送地址和数据),把总线让渡给外设暂时使用,如下图:

在进行DMA传输的时候:

CPU暂停地址/数据在总线上的传输,外设直接向SRAM的地址线发送地址,并通过数据线读写数据。8237的作用,就是协调多个外设的DMA请求,对其进行排序调度以后通知到CPU。

第三个搭档是8253。

8253的作用是产生固定频率的时钟脉冲,以及在预定的时间到了的时候发起中断(也就是闹钟功能)。

我们在《虚拟化与云计算技术硬核内幕 (19) —— 时间管理大师(上)》里面提到过,多任务操作系统是所谓的“时间管理大师”,需要一个时钟中断,把CPU的时间划分为时间片,分配给多个任务。即使是DOS这样的单任务操作系统也需要一个定期发生(默认是55毫秒一次)的时钟中断,来让游戏一类实时应用开发者能够有一个时间基准。

8253经过编程,就可以按一定的周期向CPU发起中断(如Linux下是1ms),帮助CPU成为了“时间管理大师”。

此外,还有串口控制器8250(连接最早的键盘和鼠标),并口控制器8255(连接最早的打印机)等。

在这些外部协处理器芯片的帮助下,才能构建一个微型计算机系统。最早的8086计算机(PC-XT)就是由它们组成的,直到新一代286处理器的诞生,这些协处理器才被整合成为南桥芯片(IO Hub)。

16位计算机能够访问更多的内存(如8086是1MB,80286是16MB),而计算的位宽也从8bit扩展到了16bit,因此,使用16位机能够有更好的工作和娱乐体验:

下期,我们再看看计算机从“古代”到我们熟悉的样子的进化。

0 人点赞