成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我這個(gè)人不懂什么CPU,于是我用代碼模擬出了一個(gè)

新聞 前端
最近,來(lái)自 BBC 的一名資深軟件工程師 Daniel Harper 使用 Go 語(yǔ)言成功模擬出了一個(gè) CPU 的所有功能,并把自己的經(jīng)歷寫(xiě)成了博客,引起了人們的熱議。

[[266215]]

芯片的設(shè)計(jì)到底有多難?想要回答這個(gè)問(wèn)題最好還是先自己實(shí)踐一下。最近,來(lái)自 BBC 的一名資深軟件工程師 Daniel Harper 使用 Go 語(yǔ)言成功模擬出了一個(gè) CPU 的所有功能,并把自己的經(jīng)歷寫(xiě)成了博客,引起了人們的熱議。這篇文章也告訴我們:完整地了解計(jì)算機(jī)的工作原理是多么重要。

Daniel 的經(jīng)歷在社交網(wǎng)絡(luò)上不僅被好奇的群眾點(diǎn)贊,也引發(fā)了大學(xué)芯片相關(guān)課程的學(xué)生和助教們的共鳴。如果你不知道 L1/L2 緩存的意義,認(rèn)為自己沒(méi)有搞清楚英特爾、ARM 芯片上著名的 Meltdown、Spectre 漏洞的意義,現(xiàn)在是時(shí)候開(kāi)始學(xué)習(xí)了。

讓我們看看 Daniel 是如何做到模擬 CPU 的:

幾個(gè)月前,我實(shí)在不理解計(jì)算機(jī)如何在后臺(tái)工作,也不清楚現(xiàn)代計(jì)算機(jī)的工作原理。之后,我讀了 J. Clark Scott 的書(shū)籍《But How Do I Know?》,這本書(shū)講述了一臺(tái)與非門(mén)(NAND gate)8 位計(jì)算機(jī),包括寄存器、RAM 以及 CPU、ALU 和 I/O 的位元,于是我想用代碼進(jìn)行模擬。

我對(duì)電路學(xué)知識(shí)的興趣不大,而這本書(shū)只是簡(jiǎn)單概述了一些基礎(chǔ)知識(shí),包括接線以及在沒(méi)有必備電氣工程知識(shí)的情況下位元如何在計(jì)算系統(tǒng)中移動(dòng)。對(duì)我而言,從這本書(shū)中獲得的知識(shí)不多,所以必須親身實(shí)踐,并從不可避免的錯(cuò)誤中吸取經(jīng)驗(yàn)教訓(xùn),這樣使我能夠有條理地用代碼編寫(xiě)電路。

  • 相關(guān)成果的 GitHub 地址為:https://github.com/djhworld/simple-computer

這臺(tái)簡(jiǎn)單的計(jì)算機(jī)可以用來(lái)計(jì)算。

示例程序

這是一個(gè)相當(dāng)整潔的小東西,CPU 代碼被實(shí)現(xiàn)為一個(gè)開(kāi)閉的門(mén),但它奏效了,我已經(jīng)進(jìn)行了測(cè)試,以此證明它能夠運(yùn)行。

該程序操控鍵盤(pán)輸入,并將文本呈現(xiàn)給顯示器,其中使用了一套精心制作的字形作為專業(yè)字體,我將其命名為「Daniel Code Pro」。唯一作弊的一點(diǎn)是獲取鍵盤(pán)輸入并顯示輸出內(nèi)容,為此我必須通過(guò) GLFW 與外界通信,但剩余部分是模擬電路。

我甚至編寫(xiě)了一個(gè)簡(jiǎn)單的匯編程序,這令人大開(kāi)眼界。這并不是完美的,實(shí)際上有點(diǎn)胡扯。但是,我了解到了其他人很多年前已經(jīng)解決了的問(wèn)題,并認(rèn)為自己的這項(xiàng)工作更好。

為什么要做這個(gè)?

我曾看到一個(gè) 13 歲的孩子在 Minecraft 中做這項(xiàng)工作,所以等你用電報(bào)繼電器制作出一個(gè)真正的 CPU 時(shí)再來(lái)質(zhì)問(wèn)我吧!

我心中的計(jì)算模型還停留在計(jì)算機(jī)科學(xué)初級(jí)教科書(shū)的層面,并且驅(qū)動(dòng)我在 2013 年所編寫(xiě)的 Gameboy Emulator 的 CPU 與現(xiàn)今計(jì)算機(jī)運(yùn)行的 CPU 完全不同。甚至可以說(shuō),模擬器只不過(guò)是一種狀態(tài)機(jī)(state machine),它沒(méi)有從邏輯門(mén)(logic gate)層面描述 CPU。僅使用 switch 語(yǔ)句即可以實(shí)現(xiàn)大多數(shù) CPU 且能夠存儲(chǔ)寄存器狀態(tài)。

我不知道 L1/L2 緩存(cache)和 pipelining 是什么,也完全不確定自己是否理解 Meltdown 和 Spectre 漏洞論文,所以想要更深入地了解這些東西。一些人告訴我,他們正在優(yōu)化代碼以更好地利用 CPU 緩存,而我卻不知道如何驗(yàn)證真假,只能選擇相信他們。我真的不確定 x86 指令是什么。我不了解人們?nèi)绾文軌驅(qū)⒐ぷ鹘唤o GPU 或 TPU 處理,也不清楚什么是 TPU,更不清楚如何使用這些 SIMD 指令。

但所有這一切都需要具有相關(guān)的基礎(chǔ)知識(shí),所以我只有在閱讀相關(guān)書(shū)籍后才能對(duì)此有所了解。這意味著我需要回到基礎(chǔ)知識(shí)和原理上面,并從一些簡(jiǎn)單的程序上手。《But How Do I Know?》一本書(shū)中的「Scott 計(jì)算機(jī)」就很簡(jiǎn)單,也是我選擇它的原因。

功能強(qiáng)大的 Scott 計(jì)算機(jī)!可以運(yùn)行的!

Scott 計(jì)算機(jī)是一個(gè)附有 256 字節(jié) RAM 的 8 位處理器,并通過(guò) 8 位系統(tǒng)總線連接。該計(jì)算機(jī)擁有 4 個(gè)通用寄存器,能夠執(zhí)行 17 個(gè)機(jī)器指令。一些人搭建了一個(gè)很酷的視覺(jué)模擬器(visual simulator),無(wú)法想象需要花費(fèi)多長(zhǎng)時(shí)間才能跟蹤全部的接線狀態(tài)!

組成 Scott CPU 的所有組件圖解

《But How Do I Know?》這本書(shū)將帶你從一個(gè)不起眼的與非門(mén)開(kāi)始,然后是內(nèi)存和寄存器,最后繼續(xù)對(duì)這些組件分層,直到你得出與上述類似的結(jié)果。這本書(shū)對(duì)相關(guān)內(nèi)容做了非常好的概述,所以我極力推薦大家閱讀,即使你已經(jīng)熟悉了相關(guān)概念。我不建議大家在 Kindle 上閱讀,因?yàn)闀?shū)中的一些圖有時(shí)很難在屏幕上放大和辨認(rèn),這是 Kindle 的一大弊端。唯一不同的一點(diǎn)是我將計(jì)算機(jī)升級(jí)到了 16 位,因?yàn)閮H存儲(chǔ) ASCII 表的字形就令書(shū)中所描述的大多數(shù) 8 位機(jī)器無(wú)法做到,因此留給有用代碼的空間就不多了。

我的開(kāi)發(fā)之旅

開(kāi)發(fā)過(guò)程實(shí)際上只是閱讀文本、查找圖表、然后嘗試使用通用編程語(yǔ)言代碼(而不是使用為集成電路開(kāi)發(fā)而設(shè)計(jì)的代碼)來(lái)翻譯。

之所以用 Go 語(yǔ)言來(lái)寫(xiě),是因?yàn)槲覍?duì) Go 了解一點(diǎn)。杠精們可能會(huì)說(shuō),我不信你沒(méi)有將時(shí)間花在學(xué) VHDL、Verilog 或 LogSim 上,但我那時(shí)已經(jīng)編寫(xiě)好了我的位元、字節(jié)和 NAND,我陷得太深了。也許我接下來(lái)會(huì)學(xué)那些東西。

從全局來(lái)看,大多數(shù)計(jì)算機(jī)只是傳遞一堆布爾值,所以任何對(duì)布爾值友好的語(yǔ)言都可以完成這項(xiàng)工作。

將模式應(yīng)用于這些布爾值能夠幫助程序員獲得其含義,任何人都要做的最大決策是確定系統(tǒng)將使用哪種字節(jié)順序(endianness),并確保所有組件都以正確的順序在總線之間傳遞信息。

這絕對(duì)是實(shí)現(xiàn)中隱藏的痛點(diǎn)之一。從偏移量上看,我選擇了較小的字節(jié)順序。但在測(cè)試 ALU 時(shí),我就遇到麻煩了。我試圖找出為什么出來(lái)的數(shù)字是錯(cuò)誤的。很多很多打印語(yǔ)句都發(fā)生在這個(gè)上面。

開(kāi)發(fā)的確花了一些時(shí)間,大約是一兩個(gè)月的業(yè)余時(shí)間。但一旦成功搭建出 CPU 并用它執(zhí)行 2 + 2 = 5,我還是感到很欣慰。

書(shū)中討論了 I/O 特性,設(shè)計(jì)了一個(gè)簡(jiǎn)單的鍵盤(pán)和顯示界面,這樣你就可以把東西放進(jìn)機(jī)器或拿出來(lái)。我給自己設(shè)定了一個(gè)目標(biāo),那就是能夠在鍵盤(pán)上輸入一些東西,并在顯示器上顯示這些字母。

外設(shè)

在這里,外設(shè)使用的是適配模式,充當(dāng) CPU 和外部世界之間的硬件接口。這里并不難猜,肯定是軟件設(shè)計(jì)模式獲取靈感的地方。

I/O 適配器是如何連接到 GLFW 窗口的

通過(guò)分離關(guān)注點(diǎn),使用 GLFW 將鍵盤(pán)輸入的內(nèi)容輸出到屏幕是非常簡(jiǎn)單的過(guò)程。事實(shí)上我只是從模擬器中提取了大部分代碼并整形了一下,使用 go 通道作為進(jìn)出機(jī)器的信號(hào)。

讓它跑起來(lái)

這可能是最難的一部分,至少也是最麻煩的。用如此有限的指令集編寫(xiě)程序集真的很糟糕。使用我編寫(xiě)的粗糙的匯編程序編寫(xiě)程序集更糟糕,因?yàn)槟愎植坏脛e人。

最大的問(wèn)題在于同時(shí)處理這 4 個(gè)寄存器并跟蹤它們,將它們作為臨時(shí)存儲(chǔ)存儲(chǔ)到內(nèi)存中。在這個(gè)過(guò)程中,我記得 Gameboy CPU 有一個(gè)堆棧指針寄存器,這樣你就可以推送和彈出狀態(tài)。不幸的是,這臺(tái)電腦沒(méi)有這么奢侈,所以我主要是在定制的基礎(chǔ)上對(duì)內(nèi)存里的東西進(jìn)行移進(jìn)移出操作。

我唯一花時(shí)間實(shí)現(xiàn)的偽指令是 CALL,以幫助調(diào)用函數(shù)。這可以讓你運(yùn)行一個(gè)函數(shù),然后在函數(shù)被調(diào)用后返回到該點(diǎn)。由于沒(méi)有堆棧,你只能調(diào)用一層的深度。

由于機(jī)器不支持中斷,為獲取鍵盤(pán)狀態(tài)等函數(shù),你必須實(shí)現(xiàn)糟糕的輪詢代碼。書(shū)中的確提到了實(shí)現(xiàn)中斷的步驟,但那需要寫(xiě)更多代碼。

無(wú)論如何,我最終編寫(xiě)出了四個(gè)程序,其中多數(shù)程序使用一些共享代碼來(lái)繪制字體、獲取鍵盤(pán)輸入等。雖然與操作系統(tǒng)還有一定的距離,但它確實(shí)讓我意識(shí)到一個(gè)簡(jiǎn)單的操作系統(tǒng)也可能提供一些服務(wù)。

但這其實(shí)并不容易,文本編寫(xiě)程序最棘手的部分是計(jì)算出何時(shí)轉(zhuǎn)到新行,或當(dāng)你按回車鍵時(shí)發(fā)生了什么。

  1. <code>main-getInput:</code> 
  2. <code>    CALL ROUTINE-io-pollKeyboard</code><code>    </code> 
  3. <code><code>    </code>CALL ROUTINE-io-drawFontCharacter</code><code>    </code> 
  4. <code><code>    </code>JMP main-getInput</code> 

上述文本編寫(xiě)程序的主要循環(huán)。

我也沒(méi)有抽出時(shí)間來(lái)實(shí)現(xiàn)退格鍵或其他任何修改鍵。這讓我意識(shí)到制作文本編輯器需要做多少工作,這項(xiàng)工作可能是多么乏味。

反思

這個(gè)項(xiàng)目對(duì)我來(lái)說(shuō)非常有趣,也很有收獲。在用匯編語(yǔ)言編程的過(guò)程中,我基本上放棄了底層的 NAND、AND 和 OR 門(mén)。我上升到了上面的抽象層。雖然我做的這個(gè) CPU 很簡(jiǎn)單,距離電腦里的 CPU 還很遠(yuǎn),但通過(guò)這個(gè)項(xiàng)目我學(xué)到了很多,如:

  • 位元如何在使用總線的所有組件之間移動(dòng)

  • 一個(gè)簡(jiǎn)單的 ALU 是如何工作的

  • 一個(gè)簡(jiǎn)單的 Fetch-Decode-Execute 循環(huán)是什么樣的

  • 沒(méi)有堆棧指針寄存器的機(jī)器+堆棧的概念很糟糕

  • 沒(méi)有中斷的機(jī)器很糟糕

  • 匯編程序是什么、如何工作

  • 外圍設(shè)備如何與一個(gè)簡(jiǎn)單的 CPU 通信

  • 簡(jiǎn)單字體的工作原理和在顯示器上顯示它們的方法

  • 一個(gè)簡(jiǎn)單的操作系統(tǒng)會(huì)是什么樣子

相關(guān)課程

如果你對(duì)于芯片的工作原理非常有興趣,先上一些在線課程也是一個(gè)好方法。這一 Udacity 免費(fèi)課程《高性能計(jì)算架構(gòu)》源自佐治亞理工:

  • https://cn.udacity.com/course/high-performance-computer-architecture--ud007

原文地址:https://djhworld.github.io/post/2019/05/21/i-dont-know-how-cpus-work-so-i-simulated-one-in-code/

責(zé)任編輯:張燕妮 來(lái)源: 機(jī)器之心
相關(guān)推薦

2023-11-28 12:00:22

應(yīng)用程序API

2013-08-14 10:23:22

創(chuàng)業(yè)個(gè)人創(chuàng)業(yè)互聯(lián)網(wǎng)創(chuàng)業(yè)

2017-07-13 12:33:15

戴爾

2022-11-10 09:28:40

框架開(kāi)發(fā)

2015-12-31 17:54:30

惠普

2019-12-23 11:03:07

抽象MOVJava

2018-11-06 21:00:09

Python編程語(yǔ)言人臉識(shí)別

2013-05-21 09:32:11

ChromebookChrome OS

2023-11-02 08:27:29

2025-03-06 13:10:32

2015-10-15 09:58:26

HRMMMicroservic微服務(wù)

2022-03-07 05:53:41

線程CPU代碼

2012-09-18 15:35:45

云計(jì)算創(chuàng)意大賽微軟

2017-10-23 12:42:42

2015-09-16 10:35:33

創(chuàng)業(yè)創(chuàng)業(yè)想法

2024-03-13 08:21:53

冒泡排序動(dòng)畫(huà)

2022-11-03 17:33:40

JavaString 類型

2019-12-02 10:51:11

Redis存儲(chǔ)系統(tǒng)

2020-07-15 15:09:21

Python掃雷游戲Windows

2020-05-08 13:28:53

新擬物UI設(shè)計(jì)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 超碰97人人人人人蜜桃 | 久久高清精品 | 伦理片97 | 日本三级电影在线观看视频 | 久久综合色综合 | 日韩高清成人 | 日韩一级精品视频在线观看 | 亚洲精品日韩综合观看成人91 | 伊人久久精品 | 亚洲精品一区二区网址 | 一级欧美日韩 | 日韩国产中文字幕 | 最新国产精品视频 | 黄频视频 | 亚洲视频免费在线观看 | 色一级 | 亚洲精品久久久一区二区三区 | 精品国产一区二区三区久久久蜜月 | 国产成人高清 | 亚洲国产成人精品女人久久久 | 久久躁日日躁aaaaxxxx | 国产三级 | 欧美自拍另类 | 日韩欧美一区二区三区 | 日韩一级电影免费观看 | av在线免费网 | 亚洲精品一区二区三区在线 | 中文字幕 国产 | 99热精品久久 | 日韩一区精品 | 97成人在线 | 99国产精品99久久久久久 | 成人久久久 | 二区三区在线观看 | 国产精品久久久久久久久久妞妞 | 国产精品成人一区 | 一区在线播放 | av中文字幕网 | 日韩欧美在线播放 | 中日韩欧美一级片 | av色站|