分享到plurk 分享到twitter 分享到facebook

User/Cheng5840

Linux 核心設計課程期末自評

簡介

法定姓名: 林育丞 Github: Cheng5840

成果發表和貢獻

分數: 6 分

作業/隨堂測驗

分數: 8 分

linux2025-homework1

linux2025-homework2

linux2025-homework3

linux2025-homework4

linux2025-homework5

期末專題

分數: 8 分 Linux 核心專題: 透過 Netfilter 自動過濾廣告

  • 整合 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_headverdict_head 雙佇列搭配時間戳與 PID 精準對應封包與回應結果,提升正確性與可追蹤性
  • 理解與運用核心中各類同步與佇列機制

    • 學習並應用 mutex, wait_queue, list_head, ktime 等核心同步機制
    • 對 kernel-space 中延遲回應、主動等待、tasklet 非同步通知等行為有實務掌握
  • 掌握 eBPF 程式開發與使用者互動全流程

    • 實際撰寫 eBPF C 程式,並透過 bpftoollibbpf 架設 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 分 課堂問答

在這次作業中,我學到了如何善用函式抽象化來簡化程式碼設計。原本的 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