# Linux 核心設計課程期末自評 ## 簡介 法定姓名: 林育丞 Github: [Cheng5840](https://github.com/Cheng5840) ## 成果發表和貢獻 分數: 6 分 ## 作業/隨堂測驗 分數: 8 分 [linux2025-homework1](https://hackmd.io/@buobao/linux2025-homework1) [linux2025-homework2](https://hackmd.io/@buobao/linux2025-homework2) [linux2025-homework3](https://hackmd.io/@buobao/linux2025-homework3) [linux2025-homework4](https://hackmd.io/@buobao/linux2025-homework4) [linux2025-homework5](https://hackmd.io/@buobao/linux2025-homework5) ## 期末專題 分數: 8 分 [Linux 核心專題: 透過 Netfilter 自動過濾廣告](https://hackmd.io/@sysprog/HJGg_XKbll) * 整合 eBPF 與 Netfilter,實作 TLS 封包應用層特徵檢測與阻擋 * 使用 eBPF 的 `uprobe` 掛載至 `SSL_write()`,在使用者空間傳出 TLS Application Record 前即攔截明文資料 * 透過 `bpf_perf_event_output` 傳送資料至 perf ring buffer,實現核心 ➜ 使用者單向傳輸 * 結合 Netfilter 的 `NF_INET_POST_ROUTING` hook,配合使用者回報的結果阻擋應用層封包 * 設計雙向溝通管道,讓使用者程式能回傳判斷結果至核心模組 * 自行建立 `/dev/adbdev` 字元裝置節點,實作 write 操作以供使用者程式將判斷結果回傳核心 * 透過 `order_head` 與 `verdict_head` 雙佇列搭配時間戳與 PID 精準對應封包與回應結果,提升正確性與可追蹤性 * 理解與運用核心中各類同步與佇列機制 * 學習並應用 `mutex`, `wait_queue`, `list_head`, `ktime` 等核心同步機制 * 對 kernel-space 中延遲回應、主動等待、tasklet 非同步通知等行為有實務掌握 * 掌握 eBPF 程式開發與使用者互動全流程 * 實際撰寫 eBPF C 程式,並透過 `bpftool` 及 `libbpf` 架設 uprobe hook * 熟悉 `perf_buffer__poll()` 與 ring buffer 映射行為,理解 mmap 背後的 low-overhead 傳輸架構 * 使用 `skeleton.h` + BPF CO-RE(Compile Once Run Everywhere)模式編譯與部署 * 測試與調試工具鏈的實作與驗證 * 建立多個廣告測試情境並觀察 DROP 效果 * 學習使用 `pr_info()` 追蹤核心事件並觀察 `/sys/kernel/debug` 中的 log 行為 心得與反思: 這次專題不僅實作出具有實際應用潛力的廣告封包攔截模組,更讓我深入理解 Linux 核心模組與使用者空間之間的互動細節。透過實作 perf ring buffer 傳輸、task\_struct 的使用、以及 uprobe 的掛載機制,我對核心同步、記憶體佈局與封包流程有更深入的掌握。 此外,透過設計 `/dev/adbdev` 裝置並自行處理同步佇列,我逐漸掌握核心模組中多工、多使用者的資料設計難題,最有挑戰的部分在於,如何精確控制使用者判斷結果與核心模組之間的時序與對應關係,尤其在非同步處理下保持資料一致性與正確性。在這段過程中,我深刻體會到資料結構與時間控制也是 kernel module 中關鍵的技術挑戰。 ## 與授課教師的互動 分數: 8 分 [課堂問答](https://hackmd.io/l4--gpsZQBiEI5LKS1lDvg#Cheng5840) 在這次作業中,我學到了如何善用函式抽象化來簡化程式碼設計。原本的 q_swap() 是透過逐一調整節點位置,將鏈結串列中每兩個相鄰節點交換;而 q_reverseK() 則是更一般化的操作,它將整條鏈結串列以每 K 個節點為一組進行反轉。透過觀察與比較,我發現 swap 實際上就是 reverseK 在 K=2 的一種特例,兩者本質上是相同邏輯的不同範圍應用。 這樣的體會不只是程式技巧上的進步,更是邏輯抽象能力的提升。我學會了將特例歸納為通則的一部分,並透過程式重構讓原本重複的邏輯可以更一致、可維護性更高。實作上,只需將 q_swap() 改寫成呼叫 q_reverseK(head, 2),便能達到完全相同的功能,程式碼也因此更加簡潔與清晰。 這次期末專案也讓我看到 list_head 實際的用途,有了更進一步的體會! [一對一討論(5/14)]() 首先,老師讓我釐清了 select() 是屬於 level-triggered (LT) 的觸發模式。透過查閱 man page 的 open(2) 文件,我們注意到 O_NONBLOCK 與 O_NDELAY 實際上是同義設定,當檔案系統或裝置允許時,open() 將以非阻塞模式開啟該檔案描述元。然而,這個 flag 對 poll()、select() 或 epoll() 等系統呼叫無直接影響,這些機制僅回報該描述元是否「準備好」 接著,我們也提到了 io_uring 的機制,它是在 Linux kernel v5.1 開始正式引入、真正具備效能優勢的非同步 I/O 架構,其實作邏輯類似於 CMWQ,並建議參考 [ktcp](https://hackmd.io/@sysprog/linux2025-ktcp)。 ## 所見所聞所感 分數: 10 分 閱讀〈因為自動飲料機而延畢的那一年〉的啟發: 大多數人害怕失敗,教育更強化此恐懼,導致逃避嘗試,但在追求真理的路上,即使看似徒勞,但只要能再站起,就能抵達任何地方。 這不是傳統的勵志文,而是血淋淋的紀實。專案未商業化,但經驗無價。每一次挫折與掙扎都讓作者更精進,體現真實人生中,成長勝於結果。作者強調,教育應教導學生如何面對失敗,而非逃避,這才是打破惡性循環的出路。 這門課程給我帶來極大的衝擊與反思。從一開始的 select 機制與非同步 I/O、到後來深入的 Netfilter 與 eBPF 實作,每次作業都像是一場對理解力與耐心的考驗。透過參考他人心得,我深深體會到老師不只是傳授技術,更是提醒我們如何誠實面對自己的不足。過去以為自己懂的理論,實際動手時才發現漏洞百出,這讓我理解打好基本功的重要性。 課程也讓我重新思考「學以致用」的真義。老師不斷強調現實世界中的應用,讓我們從「寫程式」提升到「寫對社會有意義的程式」。對於「面對國家與社會,我們是否已具備責任能力?」這樣的提問,讓我重新省思自身定位與未來方向。 儘管每週教材繁重、作業壓力龐大,但每次重讀資料都有新收穫,而期末專題中的實作錯誤,更成為我理解理論與現實差距的契機。這門課也許是我在成大以來最投入、最誠實的一門課,它不只改變了我的技能,更改變了我面對技術與未來的態度。 ## 自我評分 方案 B: 1 + floor(8) = 9