从DEC到Intel:70年代的小型机和微型机
计算机最初是从大型机开始发展起来的,主要面向科学计算领域或者是统计和字符处理工作。随着集成电路的发展,计算机市场开始细分,出现了面向中小企业的小型机和面向个人用户的微型机。小型机的典型代表是DEC公司,从组建到被收购,DEC公司一直从事小型机的研发。而微型机的典型代表则是Intel公司。从1971年的4004到1978年的8086,Intel逐步调整微处理器的架构,并开始了40年多年的兼容之路。
DEC的小型机情怀
DEC公司一直致力于小型机的研发工作,1970年推出的16位小型机PDP-11是此前饱受赞誉的PDP-8的后续版本。PDP系列计算机是CISC的典型代表,其指令包含至多四个操作数,分别表示指令的两个源操作数、一个目的操作数和下一条指令的地址[15]。这样的设计使得PDP-11可以模拟零地址、单地址、两地址、三地址的指令,深受高校和计算机学习者的喜爱。与此同时,PDP-11还支持多种类型的访存方式,这给编程带来了极大的便利。PDP-11的Cache大小为1024KB,两路组相联,每个块包含2个字,使用写不分配策略和随机替代算法。基于真实trace的模拟结果表明命中率高于90%[16]。
1978年,DEC推出了PDP-11的虚拟地址扩展VirtrualAddressExtension计算机VAX-11[17]。VAX-11的地址总线有32位,为了保证市场的平稳过渡,早期的VAX-11计算机使用兼容模式运行16位程序,但是性能上要比新的32位地址程序慢。在市场逐渐适应了这样的设计之后,再移除这样的模式,从而不至于造成大量的客户流失。值得一提的是,在量化一书中的,标记Moore’sLaw的起点的就是VAX-11/780计算机[1]。此时距离UNIX操作系统和C语言的发明已经过去近十年,VAX-11中能够看到许多明显为操作系统设计的硬件,例如堆栈寄存器、分页和硬件TLB、中断、用户态核心态访问权限控制、机器状态字、上下文切换等,许多我以前以为是Intel专有的东西在这里也看到了类似的实现。VAX-11延续了许多PDP-11的设计,例如UNIBUS、Cache,也有为性能增加的额外的浮点单元和预译码技术。作为CISC的一员,VAX-11使得程序员可以根据自己的直接需要编写指令,编译器负责生成最短的指令长度,并将一连串的常见指令编译成一条指令。这些策略在后来的Intel微处理器也能看到类似的结构,将X86预译码成uop,再融合成Macro-up。VAX-11的强大功能引起了一系列细致的性能分析工作[18–25],这些工作推动了计算机体系结构的发展。
在1976年的一篇回顾性文章[26]中,DEC的工程师详细的总结了PDP-11研发过程中遇到的种种困难,包括已经克服的和没能克服的。文中提出了小型机的9个弱点,包括:1.有限的地址空间;2.有限的寄存器;3.没有硬件堆栈;4.有限的中断能力和上下文切换的能力;5.有限的字符处理能力;6.无法使用ROM;7.有限的IO能力;8.有限的扩展能力;9.较大的编程难度。在半导体工艺尚无法达到那么高集成度的时候,这些9条限制确实只能在更大的计算机系统中实现。PDP-11克服了这些困难,获得良好的市场赞誉,并且在80年代逐渐到达市值的顶峰。但是,随着集成电路技术的发展,微处理器上已经可以支持更多硬件资源。另一方面,DEC公司忽视了市场昂贵的计算机价格下压抑着的巨大的个人计算机的需求。虽然小型机继续在发展,但历史的潮流已经开始转向了个人计算机。随着Altair8800、IBMPC、Apple-II等个人计算机的推出,DEC公司也逐渐式微。不由得想起上学期《计算机体系结构》里胡伟武老师的一句话:“历史上比Intel技术先进的计算机差不多都已经消失了。”下次我们再见到DEC公司,是他推出Alpha21264的时候了,那个时候的DEC公司已经走到了它最后的岁月。有关DEC和小型机的故事还在继续,但是现在我们要把目光转向未来世界的宠儿,Intel公司。
Intel一系列兼容芯片的源头:8086
目前最新的Intel的芯片可以兼容到最早的8086微处理器,相信每个写过汇编程序的人都会被它或多或少的折磨一段时间。8086作为Intel一系列前向兼容的微处理器的源头,它也不是一下子凭空冒出来的。文献[27]详细介绍了从4004到8086架构的演变,可以帮助我们更好的理解8086的体系结构。
Intel第一款微处理器芯片4004诞生于1971年,仅有2000多个晶体管的它几乎和ENIAC具有同样的计算能力。但这次人们不是用它来计算弹道,而是用它构建了一台BCD码手持计算器,4004也只支持4位的指令。
次年8008诞生了,这是一款为CRT终端设计的8位微处理器。8008通过复用两次8位输出信号产生一个14位的地址和2位有效位,尽管8008只能寻址16K的内存,但却给了编程人员自己管理内存空间的权利。8008的栈只有8个入口,因此最多只能支持8层的函数嵌套。在端口分配上,输入端口有8个,输出端口有24个,因为架构师认为输出比输入更重要。8008的寄存器包括一个累加器A,6个寄存器BCDEHL,和一个伪寄存器M。M其实是由H和L定义的一个内存地址,尽管在程序员看起来像个寄存器,通过这种方式沟通寄存器和主存。此外,8008还有四个Flags寄存器。控制流指令包括jump、call和return,而Halt指令使得处理器暂停工作等待中断。no-op指令将A寄存器的值移动到A寄存器,从而不产生任何影响。8008仅支持至多8个中断,对应的中断处理程序在内存的固定位置。值得注意的是,8080没有屏蔽中断的指令,也没有中断发生时的保存任何寄存器的指令。
1974年,半导体工艺的发展给了8008进一步改进的空间,这造就了16位的8080。8080可寻址的范围为64K,不再使用有效位,同时重新调整了寄存器的结构,以满足16位的要求。栈空间不再受到限制,理论上可以使用整个内存空间,Call指令会导致自动压栈,而Return指令会自动弹出。同时,StackPointer也可以被程序员直接引用,而原本的M寄存器寻址指令替换为3B的生成地址访问指令,由HL寄存器提供地址。Flag值被放入到一个8为的寄存器当中,并保留了一些位,这就是日后eflags寄存器的雏形。在指令集上加入了Load/Store指令、新的寄存器指令、Carry指令、扩展IO指令和中断指令。
1978年,我们的8086终于出现了。8086在设计上要求在完全兼容8080的寄存器和指令集,并且性能要高出一个量级,同时支持可重入代码、位置无关代码和动态可重定位代码。在内存结构上,8086支持1M内存的寻址,这些地址空间划分为一系列段,每个段包含64K的空间,微处理器可以直接访问当前的代码段、数据段、栈段和额外段。寄存器文件逻辑上被分为三组:通用寄存器,指针和索引寄存器和段寄存器。8086一共有13个16位寄存器和9个flag位,其中增加了4个flag,分别用于指示溢出、地址方向、中断开关和调试。指令集被扩展到133条,支持8位和16位有符号和无符号数的计算,并且支持五种访存模式。外部接口方面,8086可以支持64个IO接口。
当时的16位微处理器并不只有Intel的8086一家,还有Zilog公司的Z8000以及Motorola公司的MC68000。文献[28]比较了这三者,结果显示性能最好的是Z8000。尽管如此,IBM在1981年推出IBMPC的时候,仍然选择了Intel的8088微处理器,同时还有MicroSoft的MS-DOS操作系统。
不管怎样,微处理器的历史已经开始了,接下来我们将聚焦那些着重提升微处理器性能的技术。下次讨论具体的微处理器,就到了1996年了。
[15] G. Bell, R. Cady, H. McFarland, B. Delagi, J. O’Laughlin, R. Noonan, and W. Wulf. A new architecture for mini-computers: the dec pdp-11. In Proceedings of the May 5-7, 1970, spring joint computer conference, page 657–675. Association for Computing Machinery.
[16] William D. Strecher. Cache memories for pdp-11 family computers. In Proceedings of the 3rd annual symposium on Computer architecture, page 155–158. Association for Computing Machinery.
[17] W. D. Strecker. Vax-11/780 - a virtual address extension to the dec pdp-11 family. In AFIPS National Computer Conference, volume 47, pages 967–980. IEEE Computer Society.
[18] Douglas W. Clark. Cache performance in the vax-11/780. ACM Trans. Comput. Syst., 1(1):24–37, 1983.
[19] Cheryl A. Wiecek. A case study of vax-11 instruction set usage for compiler execution. In Proceedings of the first international symposium on Architectural support for programming languages and operating systems, page 177–184. Association for Computing Machinery.
[20] Martin L. De Prycker. A new index mode for the vax-11. SIGARCH Comput. Archit. News, 9(2):10–11, 1981.
[21] Douglas W. Clark and Henry M. Levy. Measurement and analysis of instruction use in the vax-11/780. In Proceedings of the 9th annual symposium on Computer Architecture, page 9–17. IEEE Computer Society Press.
[22] Joel S. Emer and Douglas W. Clark. A characterization of processor performance in the vax-11/780. In Proceedings of the 11th annual international symposium on Computer architecture, page 301–310. Association for Computing Machinery.
[23] Joel S. Emer and Douglas W. Clark. Retrospective: characterization of processor performance in the vax-11/780. In 25 years of the international symposia on Computer architecture (selected papers), page 37–38. Association for Computing Machinery.
[24] Douglas W. Clark and Joel S. Emer. Performance of the vax-11/780 translation buffer: simulation and measurement. ACM Trans. Comput. Syst., 3(1):31–62, 1985.
[25] Stephen Tolopka. An event trace monitor for the vax 11/780. In Proceedings of the 1981 ACM SIGMETRICS conference on Measurement and modeling of computer systems, page 121–128. Association for Computing Machinery.
[26] Gordon Bell and William D. Strecker. Computer structures: What have we learned from the pdp-11? In Proceedings of the 3rd annual symposium on Computer architecture, page 1–14. Association for Computing Machinery.
[27] Morse, Raveiel, Mazor, and Pohiman. Intel microprocessors–8008 to 8086. Computer, 13(10):42–60, 1980.
[28] R. K. Bell, W. D. Bell, T. C. Cooper, and T. K. McFarland. The big three - today’s 16-bit microprocessor. In Proceedings of the 13th annual workshop on Microprogramming, page 126–138. IEEE Press.