[ 導讀 ]清華大學直博面試的一則簡歷上了知乎熱榜:“實現了在自己寫的CPU上執行自己寫的作業系統,以及自己實現的編譯器生成的程式”。簡歷主人是清華計算機系本科生周聿浩同學,他順利拿到直博名額,清華劉知遠老師也表示讚賞。
最近,一個來自福州的男生突然火了,原因是知乎上一個熱帖《清華大學計算機專業本科的這位同學是什麼水平?》:
https://www.zhihu.com/question/345718537
提問者說,他在微博上看到清華劉知遠教授的一條微博,對劉教授口中這個優秀同學產生了興趣:
我看到微博很多人都說很牛逼,連劉知遠老師都稱讚,但是我好像不怎麼能體會到(估計是我自身水平太低了),能有人做一個形象的比喻嗎?
Miskcoo 本名周聿浩,畢業於福州一中,目前在清華大學計算機系就讀。他曾經是一名 OIer,第一次參賽就拿到了省一。在個人部落格簡介上,他描述自己“感興趣的是人工智慧中偏理論方面的內容,以及一部分分析方向的數學。”
而且他本人也非常低調虛心。面對大家的一片讚譽,自己則表示獲得劉知遠教授認可的專案,單靠自己是做不出來的,特別要感謝一起戰鬥的小夥伴,包括陳晟祺、劉曉義等。
除了rCore on MIPS這個專案外,Miskcoo簡歷中另一個受到好評的專案經歷是“NonTrivialMIPS - 十級流水雙發射 MIPS 處理器”,這是清華計算機系團隊在第三屆 “龍芯杯” 全國大學生系統能力培養大賽中獲得特等獎的專案。這是一個系統類的比賽,要求自己設計一個 CPU,在其上設計 SoC,執行作業系統等。在這個專案中,miskcoo 負責寫 CPU(這次稱為 NonTrivialMIPS),劉曉義寫 cache,陳晟祺負責 Vivado 和 CI ,最終成功奪得特等獎!
我們先看引起討論的“在自己寫的CPU上執行自己寫的作業系統”這個專案:
rCore on MIPS - Rust 語言實現的 Linux 相容作業系統 2019年4月-2019年6月
作業系統課程專案。rCore 是用 rust 編寫的作業系統。支援了x86_64,RISCV,AArch64 三個平臺。本專案主要將其移植到 MIPS32上,最終可以在組成原理課程編寫的 MIPS32處理器上執行。
實現了在自己寫的CPU上執行自己寫的作業系統,以及自己實現的編譯器生成的程式。
編譯器、作業系統、CPU是三個幾乎像無底洞一樣大的方向,實現了“在自己寫的CPU上執行自己寫的作業系統,以及自己實現的編譯器生成的程式”究竟有多厲害,知乎使用者霍華德言簡意賅地評價道:
miskcoo本人則在知乎回覆,強調這些工作離不開與團隊的合作:
我想多說一句,因為劉老師打碼的原因可能大家沒有注意到,這些東西實際上是我和另外幾個同學一起做的。他們都十分厲害,在前面一個龍芯杯的參賽作品的 CPU、SoC、Linux 移植以及其它一些東西里面我主要做的是 CPU 的部分。如果沒有他們的話一個暑假完成這樣一件事情在我的能力範圍內是不太可能的。
清華大學劉知遠老師補充道:
劉知遠老師提到的另一段專案經歷,即“NonTrivialMIPS”這個專案,在第三屆 “龍芯杯” 全國大學生計算機系統能力培養大賽,陳晟祺、周聿浩、劉曉義和陳嘉傑四位同學組成的清華大學計算機系代表隊(指導教師:計算機系陳康、李山山)以效能分數和綜合成績第一的表現獲大賽唯一的特等獎。
該大賽由龍芯中科公司提供技術支援,參賽隊伍需在龍芯公司提供的 FPGA 開發板上,自行設計 CPU 核心及 SoC,並在上面執行測試程式。清華計算機系學生代表隊設計並實現了雙發射 10 級流水線 CPU,支援執行最新版 Linux 核心,啟動 X11 圖形介面,這在大賽歷史上屬於首次。現場答辯環節上,同學們的優異成果得到專家們的一致好評。
清華大學計算機系對系統原理非常重視,從教學到課程專案都非常硬核。而且近期清華計算機系的系統類課程(包括組成原理、網路原理、編譯原理等)都在進行比較大的改革,miskcoo表示,團隊能夠寫出這個專案的部分原因也是由於這些課程的安排較為合理。
下面是清華大學電腦科學與技術專業本科培養方案中的專業主修課程內容:
rCore for MIPS32這個專案已經在GitHub上開源,感興趣的讀者可以去研究一下:
Github:https://github.com/rcore-os/rCore
rCore for MIPS32 - Linux 相容的 rust 編寫的作業系統(with:陳晟祺)
這是作業系統的課程專案,rCore 是用 rust 編寫的一個作業系統,也是由清華的同學編寫的。在我們加入之前支援了 x86_64, RISCV32/64, AArch64 三個平臺。我們主要將其移植到 MIPS32 上。它最終可以在組成原理課程編寫的 MIPS32 處理器上執行。
環境:
Rust toolchain at nightly-2019-03-05 Cargo tools: cargo-xbuild QEMU >= 3.1.0 bootimage (for x86_64) RISCV64 GNU toolchain (for riscv32/64) AArch64 GNU toolchain (for aarch64) musl-cross-make (for userland musl, or download prebuilt toolchain from musl.cc) libfuse-dev (for userland image generation) See Travis script for details.
如何執行:
$ rustup component add rust-src llvm-tools-preview $ cargo install cargo-binutils $ cargo install cargo-xbuild --force $ cargo install bootimage --version 0.5.7 --force $ git clone https://github.com/rcore-os/rCore.git --recursive$ cd rCore/user $ make sfsimg arch={riscv32,riscv64,x86_64,aarch64,mipsel} # requires $(arch)-linux-musl-gcc$ cd ../kernel $ make run arch={riscv32,riscv64,x86_64,aarch64,mipsel} mode=release $ make run arch=x86_64 mode=release pci_passthru=0000:00:00.1 # for ixgbe real nic, find its pci (bus, dev, func) first
miskcoo的其他專案還包括:
NonTrivialMIPS - 十級雙發射順序 MIPS32 處理器
(with:陳晟祺,劉曉義,陳嘉傑)
這是參加 “龍芯杯” 的作品,獲得特等獎。我們自己實現了一個十級雙發射順序 MIPS32 處理器,包含 32 位浮點單元和一個 AES 加速單元。在其上自行設計了 SoC 同時移植了 Linux 作業系統。可以執行圖形介面(X 服務)以及 Python 等一大類程式,在 OpenSSL 上利用 AES 單元加速後吞吐率大約為 10MBps(CPU 主頻 80MHz,在 i7-8750H 上不利用 AESNI 指令的實現吞吐率大約為 100MBps)。同時浮點單元能夠較快地繪製 Mandelbrot 集的影像,我們還實現了通過變分自編碼器(VAE)生成手寫數字影像等。
Github: https://github.com/miskcoo/nontrivial-mips
TrivialMIPS - 五級雙發射順序 MIPS32 處理器
(with:陳晟祺,姚沛然)
這是大三上學期組成原理、軟體工程的聯合實驗,在組成原理的 ThinPad 實驗板上編寫的 MIPS32 處理器。由於僅有 SRAM,處理器不帶有 Cache,和 “龍芯杯” 的相比較為簡陋。不過,加上之後作業系統和編譯原理的成果,還是實現了在自己寫的 CPU 上執行自己寫的作業系統,同時執行自己寫的編譯器生成的程式。
Github: https://github.com/trivialmips/trivialmips
FPGA Console - 硬體實現的 VT220 相容終端
(with:陳晟祺)
這是大二下學期數字邏輯設計的專案,也是我的第一個 FPGA 專案。主要是通過 FPGA 接受鍵盤的輸入,將輸入轉化為控制命令通過串列埠輸出給計算機。同時也通過串列埠接受計算機傳回的控制命令名且解析、執行,修改對應位置的字元,再將字元進行渲染通過 VGA 輸出到螢幕。支援 VT220 以及部分 xterm-256color 的控制序列。
TrivialDB - 簡易 SQL 資料庫引擎
這是資料庫系統概論的課程專案,用 C++ 實現的一個 SQL 資料庫引擎。實現了大部分常見的 SQL 語句和型別。同時支援多表連線、複雜表示式運算、多主鍵約束、外來鍵約束、CHECK 約束、UNIQUE 和 DEFAULT 約束、聚集查詢、利用 B + 樹索引的查詢優化,同時,它支援任意長度的 VARCHAR 型別。
rubik-cube - 快速魔方解算器
大學後的第一個課程專案,利用 Kociemba 演算法實現的三階魔方求解器。大約能夠在 1 秒內通過不多於 32 步復原一個三階魔方。另外,還實現了 Krof 演算法,可以計算最少復原方案,不過這需要很長的時間。同時,我利用 OpenGL 對復原過程進行了動畫展示。
Github: https://github.com/miskcoo/rubik-cube
其它專案(較為簡單,部分沒有公開。有需要程式碼可以聯絡我)
Mandelbrot-Render,一個高精度 Mandelbrot 渲染器。
SimpleTomasulo - Tomasulo 演算法模擬器。
SimilaritySearch - 近似查詢 / 近似連線演算法,以及一個 “網際網路叫車” 應用。
OfficeOnline - 線上審批系統。
RIPRouter - 支援 RIP 協議的路由器。
TrivialNews - Java 實現的 Android 新聞閱讀器。
數獨 - Qt 編寫的數獨,可生成及求解不同難度數獨。
國際跳棋 - Qt 編寫的雙人國際跳棋遊戲。
人物資訊檢索 - Python 編寫的爬蟲,可以抓取 Wikipedia 的人物資訊並且顯示。
最後,Miskcoo同學的主頁請收好:
討論地址:
https://www.zhihu.com/question/345718537