## 簡介 * 國立成功大學—資訊工程研究所 114 級 * [GitHub](https://github.com/jason50123) * [HackMD](https://hackmd.io/@jason50123) ## 2024 Linux 核心實作 春季班 自我評量 ### 1.成果發表和貢獻: 參加 [2024 CTHPC](https://sites.google.com/view/cthpc2024/program?authuser=0) 研討會,並以講者的身份在上面發表 `Runtime Memory Borrowing on UPMEM Near-Memory Processing Servers` 一文,該論文主要對於 UPMEM 這個 near-memory processing 架構中,對於這種特殊硬體架構的記憶體調度不夠彈性,所以提出了一個機制 `membo`,來解決這個問題,並藉由修改 linux kernel 中 buddy system 、 zone fallback list,以及 upmem 的 driver 以及 library 等,來提供使用者在此硬體架構下有更彈性的方式來調度這些記憶體資源,並從實驗結果可以得到,運用 `membo` 的結果可以大幅度的降低 page swapping 的次數,以及相對於 baseline 的throughput 更有著 3.43 倍的增長。 至於上課所用的書本部分,目前我尚未有任何貢獻。 但因為上面這個經歷, 我給自己在這個項目的評分為 **9** 分。 ### 2.作業/隨堂測驗: **作業** [2024q1 Homework1 (lab0)](https://hackmd.io/@jason50123/linux2024-homework1) 這是除了期末專題外,我花費最多心力的作業,我認為自己從這個作業之中,了解到自身能力不足的地方,並藉由這個機會來提升自己,列舉如下: 1. 對 C 語言的掌握度提升:由於在大學時期沒有碰過 C 語言的情況下,導致在一開始寫這份作業的時候對於 define、macro 以及 malloc 等都完全不知道是甚麼東西,更甚至對於 link-list 的相關操作都不慎了解,但為了完成此作業,我從李根逸博士的 C 語言入門開始學習,並透過授課老師的「你所不知道的 C 語言系列講座」從 0 開始學習 C 語言,也因此對於 C 語言有了初步的認識,而也正是因為這次的功課,我也對於一些 linux kernel 中的 link-list 相關的 API 以及 struct 都有了部分的理解。 2. 學習良好的程式碼撰寫習慣:在這次的作業中,我才了解到除了 vscode 裡面內建 extension 提供的程式碼排版工具以外,還可以利用 clang-format 並配合 github action 來程式碼在多人共編的環境下可以達到排版的一致性。 3. 學習版控工具:學習到 git 這個工具,並學習到裡面的 rebase 以及 merge 等特殊用法的指令,而在這堂課程中,授課老師也對於如何撰寫一個好的 commit message 一事非常在意,也因此在觀看了授課老師提供的上課文件 [how to write a good commit message](https://cbea.ms/git-commit/) 後,了解到,這個東西是要寫給所有開發人員看的,而不是寫給自己看的,並體會到這個工具的強大,在妥善的運用這種版控工具後,對於後續追蹤程式碼的變化,以及和他人的合作也變得相對容易。 [2024q1 Homework2 (quiz1+2)](https://hackmd.io/@jason50123/linux2024-homework2) 在這個作業我學習到 graphviz 這個將圖形描述語言轉成可視畫圖片的工具 ,但整體完程度不太理想,僅將對應資料結構的圖示利用 graphviz 繪製在共筆中。 在作業的項目完程度不是很高的情況下,但卻從中學習到許多開發程式碼需要的工具,就是在寫作業過程中最大的收穫。 **測驗** 每週我都會參加測驗,但有幾次我得了 0 分。剛開始這讓我感到非常沮喪,甚至一度懷疑自己的能力。然而,這些挫敗感也讓我認識到自己還有很多需要改進和提升的地方。我開始更加努力地學習,仔細檢討每一次錯誤,找出問題的根源並加以改進。 幸運的是,這些錯誤發生在求學階段,而不是在未來的面試中。透過這些經驗,我學會了如何在失敗中吸取教訓,提升自己。如果在面試中表現不佳,那對我來說將會是重大挫折,甚至影響到我的職業發展。因此,我感謝這些錯誤發生在這個時期,讓我有機會在真正的重要場合到來之前,做好充分的準備。 在作業/隨堂測驗這個項目,我給自己的評分為 **5** 分 ### 3.期末專題 在這次期末專題中我做的是 [simplefs](https://hackmd.io/@sysprog/r1e08fg7A) 這個專案,但最後還沒有完成預期的進度,所以會在這幾個禮拜繼續將其完成,期末專題並不是某堂課的終點,而是從中找到自己不足的地方以及對自己能力的一個檢視。 在這個專案中我除了貢獻以下兩個 commit 外 1. [commit fcac769](https://github.com/sysprog21/simplefs/commit/fcac769284e3bbe40019e64e601b6c1e54da9b33) 讓 simplefs 可以在 v6.8 環境下執行 2. [commit d0dbe63](https://github.com/sysprog21/simplefs/commit/d0dbe63ac31478f2ad46b1ad3ec5c873cf9b398a) 讓 simplefs 可以 mount/umount external journal device 也學習到如何使用 gdb + qemu 的方式來 debug kernel module,以及學習如何編譯 kernel module,還有去學習如何調整 linux kernel 的 config 檔來提供自己所需的功能像是 `debug kernel` 、 `jbd2 debug` 等,還有了解部分的 Makefile 語法,還有運用 ftrace 來確認說自己寫的 function flow 是否有正確被呼叫。 在這邊我學到除了怎麼用 gdb 的各種指令,像是 `bt` 來看目前的 function stack,或是 `info locals` 來看目前的區域變數,或透過`set` 來把目前的變數暫時性的改掉,確認錯誤的點以及原因在哪邊外,也從這個過程中意識到 gdb 功能的強大,並對其產生了不少的興趣,相信之後也會在這種除錯工具中下功夫,來讓自己可以在開發相關專案中可以更加順利。 在這個項目,我給自己的評分為 **9** 分 ### 4.與授課老師的互動 第一次一對一討論:2024/05/02 AM11:30 在這次討論中,和授課老師討論的過程中發現,對於原本自己以為已經很熟的 SSD 相關的知識像是為何要做 wear-leveling 或是 FTL 是在做什麼的,諸如此類的問題,我的回答都僅僅停留在表層而已,像是 FTL 就是把 logical address 轉成 physical address 然後去找到對應位置回傳 data 給 host 端,像這樣的回答也被授課老師點出這是十分危險的,因為我並沒有比其他可能用 chatgpt 的回答還要好,也回答的不夠專業,也因此意識到其實自己相關的專業知識還是需要去將其深入探討,來凸顯自己和其他人的不同之處。 第二次一對一討論:2024/05/20 PM5:00 完成第一次面談的題目後,我和學長再次聯繫授課老師進行面談。這次面談中,先是確立 simplefs 過去的相關問題,以及細節改進,並了解到要先去看一些原先具備 journal 特性的檔案系統設計如 `Ext4`、 `ocfs2` 等,先觀摩其他已在 linux kernel 運行之檔案系統,並加以學習並融入到此項專案中。 第三次一對一討論:2024/06/13 AM10:00 在經歷了第二次面談之後,我閱讀了相關的 `jbd2` 文獻像是 [jbd2 documentation](https://www.kernel.org/doc/html/latest/filesystems/ext4/journal.html)、[jbd2 APIs](https://docs.kernel.org/filesystems/journalling.html),但發現裡面對於整個 journal 以及 transaction 的運作都跟我想像中的不太一樣,而尤其是其中的 `internal journal(journal in inode)`,更甚至對整個 disk 的 layout 描述的沒有到很清晰,而導致我們在實作進度上出現了一定的困難度,也因此跟授課老師討論,並決定先從 external 的 journal device 來下手。 在這個項目,我熱切地跟授課老師聯繫,我給自己的評分為 **10** 分。 ### 5.所見所聞所感,務必提及閱讀〈因為自動飲料機而延畢的那一年〉和回顧自身在本課程的投入狀況 然後我發現一個原本以為只有在資工系發生的現象,那就是「資工系的學生不會寫程式,機械系的學生不會做機械」 - 對於這段話很有感觸,在大多數的時候,我們會過度強調一些理論上的項目,而去忽視了具體是如何實現的,就像在恐龍本中,我們都知道檔案系統中的 `inode` 以及 `data block` 等結構之間的關係,但在當我真正實作的時候才發現,書上所寫的跟實際的情況大相逕庭,要開始修改以及撰寫檔案系統的相關程式不單單只要看這一層而已,更甚至要去看 vfs 層,以及從 user space 還有 system call 等相關 function flow 都要先去了解,所以從書本上面獲取的知識是相當不夠的,還需要搭配一些額外的實際運用,來讓我們跟 「現實」 可以接軌。 你最大的問題在太害怕失敗了,既然都已經決定要延畢做飲料機了,那就要好好做,才不會辜負當初自己的期望。 * 從這句話中,我意識到許多事情,無論是當初選了這個實驗室,抑或是選了這門課程,既然都已做出選擇了,那就是勇敢的去面對這個選擇的結果,更同理,在未來研究所或是在求職的路上,一定都會遇到許許多多原本預想以外的事情會發生,但我們只有去正向的面對它,並誠實的面對自己,才有辦法跨越那個鴻溝以及障礙。 事情如果太順利代表絕對有問題,而問題永遠會從意想不到的地方冒出來。 * 這就跟在期末專題遇到的情況很像,一路上都覺得要在 simplefs 中實作具 journal 的特性很簡單,但殊不知隨著 linux kernel 版本的更迭,在一開始沒有的 feature ,像是 journal_bmap 等 function 的更動,而導致整個超出原本的預估,也以為在建立 qemu + gdb 的 debug 環境的時候,只要跟著做就可以了,但也沒有想到,隨著部分軟體的更新,某些步驟也需要加上對應的修改,才能讓整個環境可以執行起來,這都是在一開始沒有預想過的事情。 回顧我在本課程的投入狀況,我覺得我還有可以努力的地方,尤其在作業的部分,許多的測驗都跟數學的特性綁在一起,但在這部分不擅長的我也因此受到了些許的阻礙,期末專題的進度我也不是很滿意,所以在這段時間還是會持續地投入,但這絕對是我來成大後最用心投入的一門課,跟學期初的我相比,我很滿意自己對於這些開發工具以及 C 語言的熟悉程度,都有了大幅度的成長,能看到這樣的結果,我很慶幸有修這堂課。 在這個項目,我給自己的評分為 **10** 分。 ### 6.每月發給實驗室指導教授的學習回顧 二月份學習回顧 * 寄信日期:2024/03/01 AM10:53 * 信件內容簡述:描述我在撰寫 lab-0 時,所遇到的困難,以及從中學習到的C 語言相關內容。 我僅有在一開始的時候發回顧信,但在後續的 meeting 中,也有和教授口頭報告在這堂課上的所見所聞。 在這個項目,我給自己評分為 **4** 分。 ### 7.使用GEOMEAN 來計算上述 (1) 到 (6) 各項的幾何平均 * 採用方案 B: 1 + floor(GEOMEAN) 計算後的分數為:**8** 分