前期我们介绍了经典的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个动作:
以上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位机能够有更好的工作和娱乐体验:
下期,我们再看看计算机从“古代”到我们熟悉的样子的进化。