User/Cheng5840
Linux 核心設計課程期末自評
簡介
法定姓名: 林育丞 Github: Cheng5840
成果發表和貢獻
分數: 6 分
作業/隨堂測驗
分數: 8 分
期末專題
分數: 8 分 Linux 核心專題: 透過 Netfilter 自動過濾廣告
整合 eBPF 與 Netfilter,實作 TLS 封包應用層特徵檢測與阻擋
- 使用 eBPF 的
uprobe掛載至SSL_write(),在使用者空間傳出 TLS Application Record 前即攔截明文資料 - 透過
bpf_perf_event_output傳送資料至 perf ring buffer,實現核心 ➜ 使用者單向傳輸 - 結合 Netfilter 的
NF_INET_POST_ROUTINGhook,配合使用者回報的結果阻擋應用層封包
- 使用 eBPF 的
設計雙向溝通管道,讓使用者程式能回傳判斷結果至核心模組
- 自行建立
/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)模式編譯與部署
- 實際撰寫 eBPF C 程式,並透過
測試與調試工具鏈的實作與驗證
- 建立多個廣告測試情境並觀察 DROP 效果
- 學習使用
pr_info()追蹤核心事件並觀察/sys/kernel/debug中的 log 行為
心得與反思:
這次專題不僅實作出具有實際應用潛力的廣告封包攔截模組,更讓我深入理解 Linux 核心模組與使用者空間之間的互動細節。透過實作 perf ring buffer 傳輸、task_struct 的使用、以及 uprobe 的掛載機制,我對核心同步、記憶體佈局與封包流程有更深入的掌握。
此外,透過設計 /dev/adbdev
裝置並自行處理同步佇列,我逐漸掌握核心模組中多工、多使用者的資料設計難題,最有挑戰的部分在於,如何精確控制使用者判斷結果與核心模組之間的時序與對應關係,尤其在非同步處理下保持資料一致性與正確性。在這段過程中,我深刻體會到資料結構與時間控制也是
kernel module 中關鍵的技術挑戰。
與授課教師的互動
分數: 8 分 課堂問答
在這次作業中,我學到了如何善用函式抽象化來簡化程式碼設計。原本的 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。
所見所聞所感
分數: 10 分 閱讀〈因為自動飲料機而延畢的那一年〉的啟發:
大多數人害怕失敗,教育更強化此恐懼,導致逃避嘗試,但在追求真理的路上,即使看似徒勞,但只要能再站起,就能抵達任何地方。 這不是傳統的勵志文,而是血淋淋的紀實。專案未商業化,但經驗無價。每一次挫折與掙扎都讓作者更精進,體現真實人生中,成長勝於結果。作者強調,教育應教導學生如何面對失敗,而非逃避,這才是打破惡性循環的出路。
這門課程給我帶來極大的衝擊與反思。從一開始的 select 機制與非同步 I/O、到後來深入的 Netfilter 與 eBPF 實作,每次作業都像是一場對理解力與耐心的考驗。透過參考他人心得,我深深體會到老師不只是傳授技術,更是提醒我們如何誠實面對自己的不足。過去以為自己懂的理論,實際動手時才發現漏洞百出,這讓我理解打好基本功的重要性。
課程也讓我重新思考「學以致用」的真義。老師不斷強調現實世界中的應用,讓我們從「寫程式」提升到「寫對社會有意義的程式」。對於「面對國家與社會,我們是否已具備責任能力?」這樣的提問,讓我重新省思自身定位與未來方向。
儘管每週教材繁重、作業壓力龐大,但每次重讀資料都有新收穫,而期末專題中的實作錯誤,更成為我理解理論與現實差距的契機。這門課也許是我在成大以來最投入、最誠實的一門課,它不只改變了我的技能,更改變了我面對技術與未來的態度。
自我評分
方案 B: 1 + floor(8) = 9
