加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

我这小我私人不懂什么CPU,于是我用代码模仿出了一个

发布时间:2019-05-24 13:06:39 所属栏目:移动互联 来源:杜伟、张倩、李泽南编译
导读:芯片的计划到底有多灾?想要答复这个题目最好照旧先本身实践一下。最近,来自 BBC 的一名资深软件工程师 Daniel Harper 行使 Go 说话乐成模仿出了一个 CPU 的全部成果,并把本身的经验写成了博客,引起了人们的热议。这篇文章也汇报我们:完备地相识计较机
副问题[/!--empirenews.page--]

我这小我私人不懂什么CPU,于是我用代码模仿出了一个

芯片的计划到底有多灾?想要答复这个题目最好照旧先本身实践一下。最近,来自 BBC 的一名资深软件工程师 Daniel Harper 行使 Go 说话乐成模仿出了一个 CPU 的全部成果,并把本身的经验写成了博客,引起了人们的热议。这篇文章也汇报我们:完备地相识计较机的事变道理是何等重要。

Daniel 的经验在交际收集上不只被好奇的群众点赞,也激发了大学芯片相干课程的门生和助教们的共识。假如你不知道 L1/L2 缓存的意义,以为本身没有搞清晰英特尔、ARM 芯片上闻名的 Meltdown、Spectre 裂痕的意义,此刻是时辰开始进修了。

我这小我私人不懂什么CPU,于是我用代码模仿出了一个

让我们看看 Daniel 是怎样做到模仿 CPU 的:

几个月前,我其实不领略计较机如安在靠山事变,也不清晰当代计较机的事变道理。之后,我读了 J. Clark Scott 的书本《But How Do I Know?》,这本书报告了一台与非门(NAND gate)8 位计较机,包罗寄存器、RAM 以及 CPU、ALU 和 I/O 的位元,于是我想用代码举办模仿。

我对电路学常识的乐趣不大,而这本书只是简朴概述了一些基本常识,包罗接线以及在没有必备电气工程常识的环境下位元如安在计较体系中移动。对我而言,从这本书中得到的常识不多,以是必需切身实践,并从不行停止的错误中汲取履历教导,这样使我可以或许有层次地用代码编写电路。

  • 相干成就的 GitHub 地点为:https://github.com/djhworld/simple-computer

这台简朴的计较机可以用来计较。

我这小我私人不懂什么CPU,于是我用代码模仿出了一个

示例措施

这是一个相等整洁的小对象,CPU 代码被实现为一个开闭的门,但它奏效了,我已经举办了测试,以此证明它可以或许运行。

该措施操控键盘输入,并将文本泛起给表现器,个中行使了一套全心建造的字形作为专业字体,我将其定名为「Daniel Code Pro」。独一作弊的一点是获取键盘输入并表现输出内容,为此我必需通过 GLFW 与外界通讯,但剩余部门是模仿电路。

我乃至编写了一个简朴的汇编措施,这令人大开眼界。这并不是美满的,现实上有点胡扯。可是,我相识到了其他人许多年前已包办理了的题目,并以为本身的这项事变更好。

为什么要做这个?

我曾看到一个 13 岁的孩子在 Minecraft 中做这项事变,以是等你用电报继电器建造出一个真正的 CPU 时再来质问我吧!

我心中的计较模子还逗留在计较机科学低级教科书的层面,而且驱动我在 2013 年所编写的 Gameboy Emulator 的 CPU 与现今计较机运行的 CPU 完全差异。乃至可以说,模仿器只不外是一种状态机(state machine),它没有从逻辑门(logic gate)层面描写 CPU。仅行使 switch 语句即可以实现大大都 CPU 且可以或许存储寄存器状态。

我不知道 L1/L2 缓存(cache)和 pipelining 是什么,也完全不确定本身是否领略 Meltdown 和 Spectre 裂痕论文,以是想要更深入地相识这些对象。一些人汇报我,他们正在优化代码以更好地操作 CPU 缓存,而我却不知道怎样验证真假,只能选择信托他们。我真的不确定 x86 指令是什么。我不相识人们怎样可以或许将事变交给 GPU 或 TPU 处理赏罚,也不清晰什么是 TPU,更不清晰怎样行使这些 SIMD 指令。

但全部这统统都必要具有相干的基本常识,以是我只有在阅读相干书本后才气对此有所相识。这意味着我必要回到基本常识和道理上面,并从一些简朴的措施上手。《But How Do I Know?》一本书中的「Scott 计较机」就很简朴,也是我选择它的缘故起因。

成果强盛的 Scott 计较机!可以运行的!

Scott 计较机是一个附有 256 字节 RAM 的 8 位处理赏罚器,并通过 8 位体系总线毗连。该计较机拥有 4 个通用寄存器,可以或许执行 17 个呆板指令。一些人搭建了一个很酷的视觉模仿器(visual simulator),无法想象必要耗费多长时刻才气跟踪所有的接线状态!

我这小我私人不懂什么CPU,于是我用代码模仿出了一个

构成 Scott CPU 的全部组件图解

《But How Do I Know?》这本书将带你从一个不起眼的与非门开始,然后是内存和寄存器,最后继承对这些组件分层,直到你得出与上述相同的功效。这本书对相干内容做了很是好的概述,以是我积极保举各人阅读,纵然你已经认识了相干观念。我不提议各人在 Kindle 上阅读,由于书中的一些图偶然很难在屏幕上放大和识别,这是 Kindle 的一大破绽。独一差异的一点是我将计较机进级到了 16 位,由于仅存储 ASCII 表的字形就令书中所描写的大大都 8 位呆板无法做到,因此留给有效代码的空间就不多了。

我的开拓之旅

开拓进程现实上只是阅读文本、查找图表、然后实行行使通用编程说话代码(而不是行使为集成电路开拓而计划的代码)来翻译。

之以是用 Go 说话来写,是由于我对 Go 相识一点。杠精们也许会说,我不信你没有将时刻花在学 VHDL、Verilog 或 LogSim 上,但我当时已经编写好了我的位元、字节和 NAND,我陷得太深了。大概我接下来会学那些对象。

从全局来看,大大都计较机只是转达一堆布尔值,以是任何对布尔值友爱的说话都可以完成这项事变。

将模式应用于这些布尔值可以或许辅佐措施员得到其寄义,任何人都要做的最大决定是确定体系将行使哪种字节次序(endianness),并确保全部组件都以正确的次序在总线之间转达信息。

这绝对是实现中潜匿的痛点之一。从偏移量上看,我选择了较小的字节次序。但在测试 ALU 时,我就碰着贫困了。我试图找出为什么出来的数字是错误的。许多许多打印语句都产生在这个上面。

开拓简直花了一些时刻,约莫是一两个月的业余时刻。但一旦乐成搭建出 CPU 并用它执行 2 + 2 = 5,我照旧感想很欣慰。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读