思想积累 读书 网络 生活 精神力量 正能量 读自己的内心

“不懂 CPU 工作原理又如何,直接用代码模拟一个!”

2019-06-10  本文已影响51人  有用教育

近日,一位来自 BBC 的软件工程师 Daniel Harper 从浅入深,分享了以代码的方式来实现 CPU 所有功能的可行性,希望对大家了解计算机的内容原理有所帮助。

几个月前,我突然意识到自己并不真正理解计算机内部的工作原理。我仍然不明白现代计算机具体是怎么工作的。

然而,我读了J. Clark Scott撰写的一本叫《But How Do It Know? 》的书,书中描述了一个简单8位计算机,从与非门(NAND gate)到寄存器、RAM、CPU、ALU和I / O的细节。此书使我产生了在代码中实现一个CPU的渴望。

我对电路的物理实现方面并不感兴趣,好在本书只是蜻蜓点水一般地给出了简单的介绍,使读者对电路方面有个大体的了解,而无需具备电气工程相关知识也能理解比特流是如何在这个体系中移动的。但是对我而言,纸上得来终觉浅,我必须要亲眼看到它是如何工作的,并经历一个不可避免的从自己错误操作中吸取教训的历程。史诗般的历程就从这个想法开始了,我画下一幅航海图,用以在波涛汹涌的“代码复现电路”的大海上扬帆。而今日忆起往昔种种,百感交集,简直要禁不住泪湿青衫了。

我此次大航海之旅的成果可以在“简单计算机”上看到; 是一台“简单”的计算机,而且是可以“计算”点东西的。

这是一个很酷的小东西,CPU代码通过海量的电门的开和关来实现,但它是好使的,我已经进行过单元测试了,我们都知道单元测试是证明某些东西好使的无可辩驳的证据。

它处理键盘输入,并使用我呕心沥血设计的字形集将文本呈现给显示器,用了我称之为“Daniel Code Pro”的专业字体。唯一走捷径的地方是,为了让键盘输入和显示器输出正常工作我必须用go channel才能通过GLFW与外界通信,但其余部分就都是模拟出来的电路了。

我甚至写了一个原始的汇编程序,至少可以说是使我大开眼界。它并不完美。实际上有点烂,但它让我清楚的了解了那些许多许多年前前人们早已解决的问题,我认为通过这个过程我变成了更好的自己。或者也有可能变得更差了,这取决于你问谁…

但你为什么那样做?

 “我已经见过十三岁的孩子在Minecraft中做这样的事情了,当你用电报继电器建造一个真正的CPU时再说。”

我头脑中的的计算机模型还停留在cs入门级教科书上那种层次,而支持我在2013年所写gameboy模拟器的CPU实际上也与当今人们使用的CPU完全不同。即使这样说了,模拟器也只是一个状态机,它也没有描述逻辑门级别的东西。您只需使用switch语句并存储寄存器的状态即可实现大部分功能。

所以我在尽力地去更好地理解这些东西,因为我不知道L1 / L2 cache是什么,我不知道流水线是什么,我不完全确定我理解Meltdown和Spectre漏洞文件。有人告诉我他们正在优化代码以好好利用CPU cache的时候,我也不知道如何去验证所以只好相信他们的话。我不太确定x86指令的含义是什么。我不明白人们如何利用GPU或TPU工作。我甚至不知道TPU是个什么东西。我也不知道如何使用SIMD指令。

但所有这些都是建立在你需要的知识基础之上,所以如果只是先看看地图,我就没法最终到达目的地。这意味着要回归基础并从简单的东西开始动手实操。书中描述的“斯科特计算机”很简单。这就是我选择它的原因。

伟大的斯科特!它活过来了!

斯科特计算机是一个连接到256字节RAM的8位处理器,全部通过8位的系统总线连接。它有4个通用寄存器,可以执行17个机器指令。有人为它做了一个网页端的视觉模拟器,这真的很酷,我都不敢想象跟踪所有接线状态需要多长时间!

一个Scott CPU所有组件的示意图

本书将带您从简陋的与非门,到内存位,到寄存器,然后继续逐层深入,直到您最终得到类似于上面图表的一个CPU。我真的建议您阅读它,即使您已经熟悉这些概念,因为这本书给出了一个非常好的概述。我不建议使用Kindle版本,因为图表有时难以在屏幕上放大和显示。根据我的经验,这是用Kindle看书过程中的一个老大难问题。

我的计算机唯一与之不同的是我将其升级到16位以便有更多的内存可供使用,因为甚至只存储ASCII表的字形就会使本书中描述的大多数8位机器捉襟见肘,就没有多少剩下的空间可用于有用的代码了。

上一篇 下一篇

猜你喜欢

热点阅读