--- title: vacantron (陳孟鴻) categories: User --- ## 簡介 - 國立成功大學 電機工程學系學士班 112 級 (2019 ~ 2024) - [NCKU STUDY 成大學業心得網](https://nckustudy.com) 協作者 - 相關連結 - [GitHub](https://github.com/vacantron) - [HackMD](https://hackmd.io/@vacantron) ## 2022 Linux 核心設計 春季班 自我評量 ### 作業共筆 - HW1 - [開發記錄 (lab0)](https://hackmd.io/@vacantron/linux2022-lab0) / [GitHub](https://github.com/vacantron/lab0-c) - [quiz1](https://hackmd.io/@vacantron/linux2022-quiz1) - HW2 - [quiz2](https://hackmd.io/@vacantron/linux2022-quiz2) - HW3 - [開發記錄 (fibdrv)](https://hackmd.io/@vacantron/linux2022-fibdrv) / [GitHub](https://github.com/vacantron/fibdrv) - 期末專題 - [Linux kernel 中的 /dev/mem 裝置](https://hackmd.io/@vacantron/linux2022-dev_mem) ### 修課心得 在選課的時候看到了這門特別的課 ( 課程要求:懂得 C 語言、對於作業系統、計算機結構有足夠的認識 ) ,想了一下大一時修過計算機概論應該算懂 C 語言、大二時修過計算機組織及資料結構應該勉強符合資格吧,而編譯系統及作業系統也剛好是在這學期修。事實證明,我會的那些僅只是皮毛而已,而我對於 Linux kernel 的認知如同一張白紙 第一次的作業是實作 linked list ,一開始以為是像資料結構課教得那樣的簡單的作業,後續在參閱其他同學們的作業時才發現到除了實作 linked list 外還有許多可以再深入的議題,像是如何切割串列讓 merge sort 能更有效地利用 cache 進而獲得更好的效能等。這讓我明白一個道理:如果覺得一個東西簡單,要不是已經成為大師,不然就是因為自己無知。因為我從來沒有去想過那些問題,思考範圍只停留在議題的表面,自然覺得沒有問題存在 在這門課前我沒什麼寫共筆的經驗,因為以前做筆記都是寫給自己看的所以只要自己看得懂就好,直到現在才發現原來要把自己的想法、理解統整起來,然後用通順的中文表達出來讓其他人能看懂、理解也不是一件容易的事。而課堂中的小考的模式也是以前從未體驗過的,要在時間內要抓到程式的脈絡、重點,對沒有經驗的我來說難度也不低 透過這門課程真的學到了許多新東西,若我沒有來修這門課,可能有些東西這輩子都不會有機會接觸到。而課程中大量的資料在短時間內消化不完,還需要再花更多時間整理、完善 ### 自我評量 (1 ~ 10 分) 我給自己 7 分。 第一堂課所說的一週投入 18 小時真的遠遠不夠,光是看、理解、整理就需要耗費大量時間了,更不用提在實作過程中還會遇到各式各樣的問題待解決,在宿舍中挑燈夜讀是家常便飯。儘管從中間開始就發現自己程度太差跟不上進度,但在看完預錄影片跟共筆後多少還是能得到一些概念,後續在找參考資料時也能有個大致的方向而不至於到處撞牆 ## 2024 Linux 核心實作 春季班 自我評量 ### 成果發表和貢獻 - CTHPC 2024 : Accelerate RISC-V Instruction Set Simulation by Tiered JIT Compilation - COSCUP 2024 : 從零開始建構 C 語言最佳化編譯器 - [sysprog21/shecc](https://github.com/sysprog21/shecc) - [pull/114](https://github.com/sysprog21/shecc/pull/114) : 在目前的架構下,shecc 會馬上將內容被改變的全域變數 (global variable) 儲存回堆疊 (stack) 中而沒有參與 SSA (static single assignment) 的變數重新命名 (variable renaming) 步驟,因此若我們對全域變數進行共同表示式消除而沒有重新從堆疊中載入的話會得到過時的內容。 - [sysprog21/rv32emu](https://github.com/sysprog21/rv32emu) - [pull/376](https://github.com/sysprog21/rv32emu/pull/376) : 消除潛在的 stack overflow 問題。 - [pull/384](https://github.com/sysprog21/rv32emu/pull/384) : 省略「將未被覆寫的暫存器儲存回堆疊中」的行為,降低 rv32emu 在直譯器與 JIT 編譯器間切換的開銷。 - [pull/395](https://github.com/sysprog21/rv32emu/pull/395) : 設定 `cmv` 指令的目標暫存器的 `dirty` 旗標 (可以將 `cmv` 指令視為 `addi rd, rs, 0`),確保在切換至直譯器時暫存器中的內容符合預期。 - [pull/418](https://github.com/sysprog21/rv32emu/pull/418) : 為 rv32emu 的 JIT 編譯器引入 linear-scan register allocation 演算法,增加主機實體暫存器的使用效率。 我給自己 10 分。起初只是覺得在資訊系修的編譯系統很有趣想再多加深掘,而想起一年多前曾被介紹過的 shecc 專案並加入開發;而後續也藉由 rv32emu 將對 JIT 編譯器的理解從概念提升為實際的實作與驗證。 ### 作業/隨堂測驗 - lab0-c : [GitHub](https://github.com/vacantron/lab0-c) / [HackMD](https://hackmd.io/@vacantron/linux2024-homework1) 我給自己 1 分,除了作業 1 外並未投入太多的時間。 ### 期末專題 - [RISC-V 最佳化編譯器實作](https://hackmd.io/@sysprog/H11Da3FQA) 我給自己 3 分,主要為修正內文、回覆問題與 code review。 ### 與授課教師的互動 - 06/28 : - 引入 [dstogov/ir](https://github.com/dstogov/ir) 作為 LLVM IR 的替代選擇 - 改善 rv32emu 的 JIT 編譯器遇到 RISC-V 的 `jalr` 指令時的行為。 - 將測試與性能評估程式遷移至 [rv32emu-prebuilt](https://github.com/sysprog21/rv32emu-prebuilt) 儲存庫中。 我給自己 8 分。在討論中我更加地體認到作為一位學生、研究生亦或是工程師的表達能力的重要,唯有清楚的闡述自己的想法才能與他人建立有效率的溝通。 ### 所見所聞所感 我給自己 8 分。也許是因為時空背景相異、亦或是生活圈不同,我鮮少遇到如同 [〈因為自動飲料機而延畢的那一年〉](https://blog.opasschang.com/the-story-of-auto-beverage-machine-1/) 的作者般有熱情並持續堅持的人,大多數人由於升學制度的影響都被迫向分數看齊,而錯過能無後顧之憂一展長才的黃金時間;此外,雖然在開發各項專案時也不時遇到撞牆期,但這些 trial-and-error 的經驗也能成為鋪墊自己基礎的踏腳石,當然前提是沒有半途而廢。 ### 自我評量 (1 ~ 10) 方案 A : 8 + floor(0.3 * pow(10 * 1 * 3 * 8 * 8, 0.2)) = 8 + 1 = 9