otischung (鍾博丞)
簡介
2025 Linux 核心實作 春季班 自我評量成績計算
自評分數: 9 分
- 方案 B: 1 + floor(GEOMEAN)
\(GM = \sqrt[5]{x_1 \cdot x_2 \cdot x_3 \cdot x_4 \cdot x_5}\)
\(score = 1 + \lfloor GM \rfloor = 1 + \lfloor 8.16 \rfloor = 9\)
成果發表與貢獻
自評分數: 8 分
作業/隨堂測驗
自評分數: 7 分
作業筆記:
我在進行第一份作業的時候,讓我印象深刻的有以下所列
- Linux kernel 的 linked list 只有鏈結,沒有內容,包含內容的 list node
會包含
struct list_head,走訪到想要的節點後,再利用container_of這個 macro 得到包含內容的 list node。 - 善用 pointer to pointer 的技巧。
- Pre-commit hook 的檢查,包含:排版格式 (clang-format)、拼字檢查 (aspell) 等,排版格式不同一直是我以前與其他人協作困擾的地方,常常因為排版格式不一致導致不必要的 change logs。有了這項工具,即可大幅減少此類 change logs 的產生。
接著,進行第三份作業時,正式接觸 Linux kernel module,在與授課老師第一次一對一討論之後,我確定了期末專題題目為改進 kvm-host 並且使其可以在 arm64 平台上運作,並且以完成期末專題為本學期之課堂主要目標。
期末專題
自評分數: 8 分
我在開發 kvm-host 中,嘗試了解 PCI 設定方法的官方文件與實作的方法,在閱讀到設定 Base Address Register 的部分,發現原本的設定僅針對 MMIO 的方式實作,因此,在 commit c4b325e 拓展其使用場景,使用者可以自行設定 MMIO 或 IO 模式,如果是 MMIO 模式,還可設定 32 或 64 位元模式,與是否 prefetchable,此項修正在 PR#41 中提交。
接著,我正確設定 VirtIO-NET 在 Arm Generic Interrupt Controller (GIC)
上的 Device Tree (DT),成功使得該 Shared Peripheral Interrupt (SPI)
可以正確地被 Guest OS 使用。接著,在 Guest OS kernel image 的
defconfig 開啟網路相關的設定。最後,在 Host OS 中設定
bridge 使得 Host 的 TAP 裝置成功轉送封包 (Packet
Forwarding),達成期末專題的目標,此項功能在 PR#40
中提交。
此專案還有很多可以改進的空間,例如:設定 DHCP 使得 Guest OS
可以不再侷限於連接到 bridge 上的固定 IP,還有修正在程式碼裡面列出
FIXME 之處。也期許自己可以持續貢獻。
與授課教師的互動
自評分數: 9 分
課堂問答日期:
2025.06.17 (Tue.)
2025.06.24 (Tue.)
一對一討論日期:
2025.04.17 (Thu.) 10:30 - 11:00
2025.05.09 (Fri.) 16:00 - 16:30
我在第一次一對一討論中確認了期末專題的題目:改進 kvm-host 使其可以在 RPI 等 arm64 的架構上運行,並確保網路裝置可以運作。並且發現我有很多之前學過的知識的片段記憶,但是缺少關聯性,於是第二次一對一討論中,了解到真實世界的複雜程度,這些教材與閱讀書目,真的沒有一個明確的閱讀先後順序。
於是,我在閱讀教材的同時,閱讀 KVM: Linux 虛擬化基礎建設 並且尋找理論與 kvm-host 實作上的關聯,從虛擬化技術開始,學習 x86-64 與 arm64 開機流程與設定的不同之處、PCI 是什麼、Configuration Space Access Mechanism #1 的實作細節、TUN/TAP 的運用方式等。
在兩次課堂問中,透過像面試一樣的互動,讓我了解到當我在研究這些細節的時候,我忽略了大方向,例如 Linux KVM 主要功能是什麼、kvm-host 主要功能是什麼、Linux KVM 與 kvm-host 是如何配合運作的、Guest OS 網路封包傳出去的流程等,讓我更加清楚整個 project 的脈絡,避免一直困在例如 PCI 如何設定這樣的細節上面,而忽略了大方向。
最後,非常感謝老師願意花時間與同學一對一討論,及早提醒學生哪些部分不熟,需要補上。
所見所聞所感
自評分數: 9 分
我覺得「解決真實世界的問題」是本課程讓我收穫最多的一句話,這不僅限於系統軟體設計,乃至於所有的產業,都是在解決問題,我意識到為什麼 Linux 對於 linked list 為什麼要把鏈結本身與所儲存的資料分開,其背後的核心思想;在因為自動飲料機而延畢的那一年,我意識到這個世界所謂的理所當然,是前人耗費無數心血的結晶,不用說解釋一隻手機為何能上網有多麽複雜,就是請我們自己做一支價值 10 元的原子筆都很難做到。
從國小到研究所,學過的事物已不算少,大多數學過的理論知識,在學的當下像是一個獨立的知識點,直到之後的 project 需要用到的時候,記憶已模糊,只好再回去重新複習,我認為我們在學習知識的時候,也要一起思考這些知識可以用在哪裡,這樣不只是學以致用,更可以讓我們在學習的時候,以好奇心驅動學習新的事物,知識更活用且記得更久。
