本文經(jīng)機(jī)器之心(微信公眾號(hào):almosthuman2014)授權(quán)轉(zhuǎn)載,禁止二次轉(zhuǎn)載
選自Fueled by Coffee,作者:Takaya Saeki,編輯:Panda
前段時(shí)間,中國(guó)科學(xué)院大學(xué)的「一生一芯」計(jì)劃引發(fā)熱議,五位本科生帶著自己設(shè)計(jì)的處理器芯片正式畢業(yè),被稱為「最硬核畢業(yè)證」。其實(shí),東京大學(xué)信息科學(xué)系也有一個(gè)自制 CPU 的實(shí)踐課程。近日,微軟軟件工程師 Takaya Saeki 刊文回顧了五年前他們小組的 CPU 實(shí)驗(yàn)項(xiàng)目:不僅通過(guò)自學(xué)自制了 CPU、C 編譯器,還成功移植了一個(gè)類 Unix 操作系統(tǒng)(Xv6)。雖然回顧的是五年前的往事,但這篇文章應(yīng)該也能為芯片和操作系統(tǒng)人才培養(yǎng)工作帶來(lái)一些啟發(fā)。
所有這一切都源自一個(gè)學(xué)生實(shí)驗(yàn)項(xiàng)目:CPU Experiment(CPU 實(shí)驗(yàn))。首先說(shuō)說(shuō)這個(gè) CPU 實(shí)驗(yàn)是什么。
CPU 實(shí)驗(yàn)是東京大學(xué)信息科學(xué)系一個(gè)小有名氣的實(shí)踐課程,通常在大三的冬季進(jìn)行。在該實(shí)驗(yàn)中,學(xué)生會(huì)被分成小組,每組四、五個(gè)人。每一組都要設(shè)計(jì)一種自己的 CPU 架構(gòu),在 FPGA 上實(shí)現(xiàn)它,為該 CPU 構(gòu)建一個(gè) OCaml 子集編譯器,然后在該 CPU 上運(yùn)行一個(gè)給定的光線追蹤程序。通常來(lái)說(shuō),CPU、FPU、CPU 模擬器和編譯器都各由一兩個(gè)人負(fù)責(zé)。我負(fù)責(zé)第 6 組的 CPU 部分。
這個(gè)實(shí)踐課程的有名之處在于對(duì)自學(xué)能力的高度期望。導(dǎo)師向?qū)W生們下達(dá)了任務(wù)目標(biāo):「把這個(gè)用 OCaml 寫的光線追蹤程序運(yùn)行在你們用 FPGA 實(shí)現(xiàn)的 CPU 上」,然后就下課了。對(duì)于編寫 CPU 和編譯器的具體步驟,他不會(huì)多說(shuō)。學(xué)生需要自己學(xué)習(xí)如何將學(xué)過(guò)的有關(guān) CPU 和編譯器的一般知識(shí)轉(zhuǎn)化成實(shí)際成品,這將涉及到實(shí)際的電路和代碼。是的,這個(gè)實(shí)踐課程確實(shí)很難,但也很激動(dòng)人心且極具教育意義。
在我們自己的 CPU 上運(yùn)行操作系統(tǒng)
你可能已經(jīng)注意到了,我還沒(méi)談到操作系統(tǒng)。我來(lái)稍微解釋一下。
通常來(lái)說(shuō),這個(gè)實(shí)驗(yàn)會(huì)這樣進(jìn)行。首先,做出一個(gè)能可靠工作的 CPU,不管計(jì)算速度如何。如果做出了 CPU 并成功運(yùn)行了那個(gè)光線追蹤程序,就能得到這個(gè)實(shí)踐課程的學(xué)分。之后,你的團(tuán)隊(duì)就自由了。通常來(lái)說(shuō),這些自由時(shí)間會(huì)被用于 CPU 提速。在過(guò)去的實(shí)驗(yàn)中,學(xué)生做出過(guò)亂序 CPU、VLIEW CPU、多核 CPU 甚至超標(biāo)量 CPU,確實(shí)很了不起。
但是,有些團(tuán)隊(duì)則把更多精力放到了一些有趣任務(wù)上,比如運(yùn)行游戲或?qū)?CPU 與揚(yáng)聲器連接來(lái)播放音樂(lè)。我們第 6 組也是一個(gè)熱愛(ài)娛樂(lè)的小組,而我們決定將目標(biāo)設(shè)定為運(yùn)行一個(gè)操作系統(tǒng)。
結(jié)果,其它一些小組也對(duì)這個(gè)想法產(chǎn)生了興趣。于是,一個(gè)包含 8 個(gè)人的聯(lián)合小組——Group X 成立了。我們的目標(biāo)是:「在我們自己的 CPU 上運(yùn)行 OS!」
盡管我負(fù)責(zé)第 6 組的 CPU 創(chuàng)建工作,但這一次我選擇當(dāng) Group X 的領(lǐng)導(dǎo)者。因此,本文主要是從 OS 團(tuán)隊(duì)角度寫作的,不過(guò)我也會(huì)介紹 Group X 的整體成果。
Xv6
對(duì)于要移植的 OS,我們選擇了 Xv6,這是一個(gè)由 Unix v6 啟發(fā)的簡(jiǎn)單操作系統(tǒng),是 MIT 為教育目的構(gòu)建的。不同于 Unix v6,Xv6 是用 ANSI C 編寫的,而且運(yùn)行在 x86 架構(gòu)上。Xv6 是一款教育用 OS,所以功能有些簡(jiǎn)陋,但作為一款簡(jiǎn)單的類 Unix 操作系統(tǒng),功能已經(jīng)足夠了。有關(guān) Xv6 的更多信息可訪問(wèn)其 GitHub 代碼庫(kù):https://github.com/mit-pdos/xv6-public
挑戰(zhàn)
在移植 Xv6 時(shí),光是軟件方面就有一大堆難題,因?yàn)槲覀冊(cè)趪L試從頭開(kāi)始構(gòu)建一切。
1. 用于 Xv6 的 C 編譯器和工具鏈。
在 CPU 實(shí)驗(yàn)中,我們通常會(huì)創(chuàng)建一個(gè) ML 編譯器。很自然,這樣無(wú)法編譯 Xv6 的 C 代碼。
2. 操作系統(tǒng)需要 CPU 具備哪些功能?
特權(quán)保護(hù)?虛擬地址?中斷?是的,我們?cè)谡n堂上已經(jīng)獲得了對(duì)操作系統(tǒng)的整體理解,但那時(shí)候我們對(duì)各個(gè) CPU 功能的具體作用還沒(méi)有真正的切身體會(huì)。
3. 模擬器呢?
我們已經(jīng)在 CPU 實(shí)驗(yàn)的核心任務(wù)部分做了一個(gè)模擬器,但那個(gè)模擬器很簡(jiǎn)單,只能逐一執(zhí)行指令,而且沒(méi)有中斷和虛擬地址轉(zhuǎn)換。
4.Xv6 的可移植性差
Xv6 很難移植。舉個(gè)例子,它假設(shè) char 是 1 個(gè)字節(jié),而 int 是 4 個(gè)字節(jié),并會(huì)大量操作堆棧。好吧,我猜 Xv6 這個(gè)名字實(shí)際上來(lái)自 x86 和 Unix v6,所以這種設(shè)計(jì)當(dāng)然很自然。
我們有過(guò)很多擔(dān)憂,但還是在 12 月份開(kāi)始了 Group X 的 OS 移植項(xiàng)目。
接下來(lái),我將大致按時(shí)間順序編寫我們的工作經(jīng)歷。這個(gè)過(guò)程會(huì)有一點(diǎn)長(zhǎng),所以如果你想快些看到結(jié)果,請(qǐng)?zhí)D(zhuǎn)至「三月」部分。
十一月下旬:開(kāi)始開(kāi)發(fā)編譯器
我們找到答案的第一個(gè)問(wèn)題是編譯器和工具鏈。有點(diǎn)意外的是,我們決定從頭開(kāi)始寫 C89 編譯器。說(shuō)老實(shí)話,我之前沒(méi)想到我們會(huì)選這條路。我記得我和 Yuichi(后來(lái)負(fù)責(zé) Group X 的 CPU)一開(kāi)始討論過(guò)移植 gcc 或 llvm。
但是,一位團(tuán)隊(duì)成員 Keiichi 突然說(shuō)他已經(jīng)寫好了一個(gè) C 編譯器并向我們展示了一個(gè)編譯器原型,其帶有一個(gè)簡(jiǎn)單的解釋器和發(fā)射器。從頭開(kāi)始寫工具鏈似乎更有意思,因此我們決定自己寫一個(gè)編譯器。
來(lái)自第 3 組的 Yuichi 和 Wataru 已經(jīng)結(jié)束了那一年 CPU 實(shí)驗(yàn)的核心任務(wù),于是他們加入了 Keiichi,組成了 Group X 的編譯器團(tuán)隊(duì)。后來(lái)我們將我們的編譯器命名為 Ucc。
十二月中旬:OS 團(tuán)隊(duì)上線!
十二月初,我完成了自己的 CPU,第 6 組完成了 CPU 實(shí)驗(yàn)的核心部分。于是我們開(kāi)始做有趣的部分:Group X 的 OS 移植任務(wù)。這時(shí)候,第 6 組的我和 Shohei 開(kāi)始了 Group X 的工作并組成了 OS 團(tuán)隊(duì)。Masayoshi 也在那時(shí)候加入了進(jìn)來(lái)。
實(shí)驗(yàn)的核心任務(wù):編寫一個(gè) CPU
順便一提,我猜沒(méi)多少軟件工程師親自寫過(guò) CPU,所以我也談?wù)勅绾螌?CPU。
現(xiàn)如今,制作 CPU 并不意味著要在面包板上連接各種跳線,你可以完全使用硬件描述語(yǔ)言(HDL)編寫電路。然后你可以使用 Vivado 或 Quartus 將 HDL 合成到真實(shí)電路中。這個(gè)過(guò)程叫做邏輯綜合(logic synthesis),而不是編譯。
HDL 與編程語(yǔ)言既有相似之處,也有一些差異。你可以將其視為一個(gè)將寄存器的信號(hào)狀態(tài)映射成另一個(gè)信號(hào)狀態(tài)的函數(shù),其可由時(shí)鐘或輸入信號(hào)觸發(fā)。如果你想體驗(yàn)真正的反應(yīng)式編程,我建議你試試 HDL。同時(shí)請(qǐng)務(wù)必記住,在寫 HDL 時(shí)要一直注意你寫的 HDL 的信號(hào)傳播會(huì)在某個(gè)時(shí)鐘切實(shí)地終止。否則,人類將難以理解你的電路的行為。
實(shí)際開(kāi)發(fā)過(guò)程中最艱難的部分就是邏輯綜合,其所需的時(shí)間多得離譜。在開(kāi)始執(zhí)行綜合之后,我們往往需要等上多達(dá) 30 分鐘時(shí)間。所以開(kāi)始綜合之后,我常常與其他也在等著綜合結(jié)束的 CPU 團(tuán)隊(duì)成員玩《任天堂明星大亂斗 DX》。隨便說(shuō)一下,我的角色是 Sheik。
十二月下旬到一月中旬:通過(guò)將 Xv6 移植到 MIPS 來(lái)學(xué)習(xí)
我們開(kāi)始找到「操作系統(tǒng)需要 CPU 具備哪些功能?」這個(gè)問(wèn)題的答案。
OS 團(tuán)隊(duì)誕生之后,我們開(kāi)始每周聚會(huì),閱讀 Xv6 源代碼。
與此同時(shí),我開(kāi)始將 Xv6 移植到 MIPS。這樣做的部分原因是學(xué)習(xí) OS 在實(shí)現(xiàn)層的工作方式,部分原因是似乎還沒(méi)人將 Xv6 移植到 MIPS 過(guò)。我在大約一周內(nèi)完成了移植工作,直到調(diào)度器過(guò)程開(kāi)始。在這個(gè)移植過(guò)程中,我花了大量精力研究 MIPS,并且為了了解 Xv6 的工作方式還大量研究了 x86。得益于此,我理解了中斷的相關(guān)機(jī)制以及實(shí)現(xiàn)層的內(nèi)存管理單元(MMU)。這時(shí)候,對(duì)于 Xv6 所需的 CPU 功能,我已經(jīng)有了扎實(shí)的理解。
另外,在一月中旬,我們也開(kāi)始努力通過(guò)注釋掉各個(gè)部分來(lái)編譯 Xv6 的整體代碼。結(jié)果是在我們自制架構(gòu)的模擬器上,Xv6 在引導(dǎo)順序中顯示出了第一條消息:
xv6.。.cpu0: starting.。。
與此同時(shí),這意味著這時(shí)候 Ucc 已經(jīng)成長(zhǎng)到足以編譯大部分 Xv6 代碼了。真是太棒了!
二月:我們的 CPU GAIA 誕生!
在 MIPS 移植過(guò)程中,我完成了 PIC 的初始化,這個(gè)過(guò)程很痛苦。另外,我還完成了實(shí)現(xiàn)中斷處理程序的任務(wù)。結(jié)果,Xv6 向 MIPS 的移植工作剛完成,第一個(gè)用戶程序就開(kāi)始開(kāi)發(fā)了。
在這一經(jīng)歷的基礎(chǔ)上,我為我們的自制 CPU 編寫了中斷和虛擬地址轉(zhuǎn)譯的規(guī)范草稿。為了簡(jiǎn)單,我們決定忽略 Ring 保護(hù)等硬件特權(quán)機(jī)制。至于虛擬地址轉(zhuǎn)譯,我們決定使用 x86 那樣的硬件頁(yè)面游走法(hardware page-walking method)??雌饋?lái)可能很難在硬件中實(shí)現(xiàn)這個(gè)功能,但我們認(rèn)為如果我們犧牲掉速度并忽視 TLB 實(shí)現(xiàn),可能就不會(huì)那么難。畢竟 Yuichi 后來(lái)做了一個(gè)很棒的 CPU 內(nèi)核,不過(guò)它一開(kāi)始就安裝了 TLB。
Yuichi 完成了我們的 CPU 的 ISA(指令集架構(gòu))的整體設(shè)計(jì)。他將我們的 CPU 命名為 GAIA。在典型的 CPU 實(shí)驗(yàn)項(xiàng)目中,我們既不會(huì)實(shí)現(xiàn)中斷,也不會(huì)實(shí)現(xiàn) MMU。但是,Yuichi 開(kāi)始為 Xv6 實(shí)現(xiàn)它們,他是基于第 3 組的 CPU 的重構(gòu)版本開(kāi)發(fā)的。
接下來(lái),進(jìn)度加快了,所以我將開(kāi)始按周進(jìn)行說(shuō)明。
第一周
Masayoshi 開(kāi)始為我們的 CPU 實(shí)現(xiàn)真正的初始化,而不只是將引導(dǎo)順序注釋掉;而 Shohei 將 Xv6 的 x86 匯編重寫進(jìn)了我們自制的架構(gòu)中。我為我們的模擬器添加了中斷模擬,而這個(gè)模擬器是 Wataru 在 CPU 實(shí)驗(yàn)的核心任務(wù)部分開(kāi)發(fā)的;另外我還完成了對(duì)虛擬地址轉(zhuǎn)譯的支持。這能讓模擬器有足夠的功能來(lái)運(yùn)行 OS。
第二周
我為我們的架構(gòu)構(gòu)建了一個(gè)原語(yǔ)鏈接器,以集成 Xv6 及其 binary blobs。Shohei 正在實(shí)現(xiàn)中斷處理程序,這部分很難。中斷很難理解,難以弄清流程、難以調(diào)試、難以開(kāi)發(fā)。
當(dāng)我將 Xv6 移植到 MIPS 時(shí),我有 GDB,所以還能應(yīng)付,但我們自己的模擬器沒(méi)有任何調(diào)試功能,所以調(diào)試起來(lái)肯定非常難。
Shohei 也頂不住這樣的難度,所以他為模擬器添加了一個(gè)反匯編器和調(diào)試 dump 函數(shù)。之后,OS 團(tuán)隊(duì)又對(duì)這個(gè)模擬器的調(diào)試功能進(jìn)行了快速升級(jí),最后得到的模擬器看起來(lái)是這樣:
第三周
克服了許多困難之后,Xv6 的移植工作有所進(jìn)展,但 Xv6 還是無(wú)法工作。
尤其是 Ucc 的規(guī)范為 char 和 int 都是 32 位,這帶來(lái)了許多問(wèn)題。這不是 Ucc 的錯(cuò)。事實(shí)上,C 規(guī)范僅要求 sizeof(char) == 1 且 sizeof(char) 《= sizeof(int),因此這是符合規(guī)范的。
但是,Xv6 是為 x86 編寫的,所以它假設(shè) sizeof(int) == 4 并會(huì)將常量添加到指針的值,這會(huì)導(dǎo)致大量不一致。由這個(gè)問(wèn)題帶來(lái)的漏洞很難查找,而且數(shù)量也很多,所以最后我們決定將 Ucc 的 char 規(guī)范改為 8 位。
在將 char 32 位問(wèn)題委托給 Ucc 團(tuán)隊(duì)之后,我為首次進(jìn)入階段寫了初始化頁(yè)面,并嘗試通過(guò)試錯(cuò)方法讓中斷能夠有效工作。
最重要的是,我們努力解決了第 4 個(gè)難題:Xv6 的可移植性差。
2 月 27-28 日
當(dāng)我回頭看 Slack 時(shí),我發(fā)現(xiàn)這一天我們進(jìn)展頗豐。在 Ucc 團(tuán)隊(duì)很快完成將 char 改為 8 位的工作之后,我們進(jìn)行了大量調(diào)試。最后,我們的第一個(gè)用戶程序 init 可以工作了!
之后,我們?cè)谝浦灿脩暨^(guò)程應(yīng)用方面的成果越來(lái)越多,這是我在移植到 MIPS 時(shí)沒(méi)有做過(guò)的事情。在這個(gè)過(guò)程中,很多漏洞都很難重現(xiàn),中斷規(guī)范之中的不足之處也顯現(xiàn)了出來(lái),但我們最終克服了困難,找到并修復(fù)了這些漏洞。
我們修復(fù)的一個(gè)有趣問(wèn)題是緩存別名問(wèn)題。GAIA CPU 選擇了虛擬地址作為緩存索引,而非物理地址。這讓 CPU 在查找緩存時(shí)能夠跳過(guò)虛擬地址轉(zhuǎn)譯。但是,由于這樣的設(shè)計(jì),我們發(fā)現(xiàn)緩存之間會(huì)出現(xiàn)不一致問(wèn)題,因?yàn)樘摂M地址的多個(gè)緩存可以指向同一個(gè)物理地址。當(dāng)一個(gè)虛擬地址的緩存更新之后,其它指向同一物理地址的虛擬地址的緩存卻沒(méi)有更新。
這個(gè)漏洞很難在硬件層面上低成本地修復(fù),所以為了解決它,我們?yōu)槲覀兊?Xv6 引入了 Page Coloring。這會(huì)為每個(gè)緩存行引入「顏色」并重新分配頁(yè)面,使得指向同一物理地址的虛擬地址總會(huì)有一樣的顏色。這意味著指向同一物理地址的虛擬地址總是僅有一個(gè)緩存。這能讓 Xv6 確保 GAIA 永遠(yuǎn)不會(huì)讓多個(gè)緩存共用同一個(gè)物理地址。
三月:Xv6 跑起來(lái)!
3 月 1 日,Xv6 移植工作完成。現(xiàn)在 Xv6 已經(jīng)運(yùn)行在模擬器上了!
娛樂(lè)少不了
一開(kāi)始,移植 Xv6 是因?yàn)檫@很有趣,現(xiàn)在 Xv6 已經(jīng)成功運(yùn)行在模擬器上,那我們就要加把勁讓它更有趣。
首先,Masayoshi 用大約 4 個(gè)小時(shí)做了一個(gè)小火車以及運(yùn)行在 Xv6 上的 sl 命令。
Shohei 則想做一個(gè)掃雷游戲。
在這期間,Yuichi 完成了 Group X 的 CPU 實(shí)現(xiàn)工作。真正的 CPU 的運(yùn)行速度比模擬器快多了,這能讓我們更輕松地玩耍和開(kāi)發(fā)游戲。這時(shí)候,我們創(chuàng)建了一個(gè)非常高質(zhì)量的應(yīng)用:2048。
這個(gè) 2048 的質(zhì)量很高。Yuichi 老是在玩。順便提一句,這個(gè) 2048 使用的是 non-line buffering 輸入,這是 Xv6 原本沒(méi)有的功能。為了支持這一功能,ioctl 被添加進(jìn)來(lái)作為 read 和 write 之外的另一個(gè) devsw 動(dòng)作,另外還添加了用來(lái)控制 ICANON 和 echo 的與 termios 相關(guān)的新功能。因此,唯一能以如此高的完成度玩 2048 的 Xv6 就運(yùn)行在 GAIA 上。
另外,畢竟 Xv6 是由 Unix v6 啟發(fā)的,因此我猜想,添加 gtty 和 stty 系統(tǒng)調(diào)用是更像 Unix v6 的方法。不過(guò),因?yàn)?Xv6 沒(méi)有 tty 的概念,所以我采用了 ioctl;而且事實(shí)上 Unix v7 就引入了 ioctl,所以這與歷史情況也接近。
現(xiàn)在,更酷的是,Keiichi 又為 Xv6-GAIA 做了一個(gè)小型匯編器,Shohei 還做了一個(gè) mini vi。想想看你能用這兩個(gè)工具做什么。
這就是基于 FPGA 的交互式編程!這是 CPU 實(shí)驗(yàn)的一個(gè)出色演示,因?yàn)槠渲幸话悴话ㄈ魏谓换ナ匠绦颉?/p>
最棒的演示
CPU 實(shí)驗(yàn)實(shí)踐課程的原始任務(wù)是「在自制 CPU 上運(yùn)行給定的光線追蹤程序」?,F(xiàn)在我們的 CPU 上有操作系統(tǒng)了,你知道該怎么做了嗎?我們決定在我們的 CPU 的 OS 上運(yùn)行這個(gè)光線追蹤程序。我們遇到了一些問(wèn)題,但我們?cè)谧罱K展示前一個(gè)小時(shí)里成功解決了它們。
因此,我們做了我們這個(gè)系的學(xué)生開(kāi)玩笑時(shí)說(shuō)的話:在一個(gè) CPU 上運(yùn)行一個(gè)操作系統(tǒng),然后再在上面運(yùn)行光線追蹤程序。
來(lái)自 2020 年的回顧
這段故事發(fā)生在 2015 年,本文也是我自己的博文的翻新稿。盡管現(xiàn)在讀來(lái),我看到了當(dāng)時(shí)自身技術(shù)經(jīng)驗(yàn)的不足,但我們當(dāng)時(shí)做的事情實(shí)在很激動(dòng)人心。
另外,你現(xiàn)在也可以在你的瀏覽器中體驗(yàn)我們的 Xv6:https://nullpo-head.github.io/emcc-gaia-simu/xv6.html
實(shí)驗(yàn)之后,我將我們的 GAIA 模擬器通過(guò) Emscripten 移植到了 JavaScript。去試試看我們的 sl、掃雷和 2048 吧。
xv6.。.cpu0: startinginit: starting sh$
還要說(shuō)一下,Xv6 向 MIPS 的移植工作在 CPU 實(shí)驗(yàn)期間并沒(méi)有完成,而是在實(shí)驗(yàn)之后一個(gè)月完成的。GitHub 代碼庫(kù)在這里:https://github.com/nullpo-head/xv6-mips
在我們 2015 年寫文介紹了 Group X 的工作之后,后來(lái)的學(xué)生繼續(xù)攻堅(jiān)有關(guān) OS 的新挑戰(zhàn)。
2018 年,一些學(xué)生在自制的 CPU 上運(yùn)行了他們自己開(kāi)發(fā)的 OS;2019 年,一組學(xué)生運(yùn)行了他們開(kāi)發(fā)的 OS,同時(shí)采用了 RISC-V 作為他們自制 CPU 的 ISA。此外,2020 年的一個(gè)小組終于在自制 CPU 上成功運(yùn)行 Linux,同時(shí) ISA 也采用了 RISC-V。
我相信未來(lái)還會(huì)有更多故事,也讓我們保持期待。從個(gè)人角度看,我很期待某天能看到某人在自己的 ISA 上運(yùn)行 Linux,或在上面運(yùn)行虛擬機(jī)。
人們常說(shuō)要避免重新造輪子,但這個(gè)過(guò)程確實(shí)能讓人學(xué)到很多東西。這讓我認(rèn)識(shí)到,我對(duì)它的理解其實(shí)沒(méi)有那么深,無(wú)法從頭開(kāi)始實(shí)現(xiàn)它。而且,我推薦這個(gè)故事的另一個(gè)原因是這真的非常有趣!
我們的 CPU 實(shí)驗(yàn)故事就到此為止了。如果你也有興趣重新發(fā)明輪子,可以試試自制 CPU 并移植 OS。
原文標(biāo)題:東京大學(xué)版「一生一芯」:自制CPU、C編譯器,還成功運(yùn)行了類Unix系統(tǒng)
文章出處:【微信公眾號(hào):人工智能與大數(shù)據(jù)技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
cpu
+關(guān)注
關(guān)注
68文章
10807瀏覽量
210853 -
UNIX
+關(guān)注
關(guān)注
0文章
296瀏覽量
41393 -
編譯器
+關(guān)注
關(guān)注
1文章
1617瀏覽量
49017
原文標(biāo)題:東京大學(xué)版「一生一芯」:自制CPU、C編譯器,還成功運(yùn)行了類Unix系統(tǒng)
文章出處:【微信號(hào):TheBigData1024,微信公眾號(hào):人工智能與大數(shù)據(jù)技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論