Try   HackMD

2023 年 Linux 核心設計/實作課程期末專題

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
注意事項

  • 敬請瀏覽學員的成果,亦歡迎在下方「開發紀錄」中,留言提出您的疑惑和改進建議,學員會適度回覆,您的寶貴意見是我們成長的動力
    請留言在每份開發紀錄的「提問清單」
  • 下方主題對應的開發紀錄、原始程式碼、實驗資訊,和解說影片皆允許公眾存取,若您遇到存取上的困難,請發訊息給 授課教師

Linux 核心同步機制研究

探討 Linux 核心的同步機制,並運用 Hazard Pointer 和 RCU 作為資源釋放機制

Linux 排程器研究

探討 Linux 排程器內部設計,改進《Demystifying the Linux CPU Scheduler》,並尋求貢獻程式碼到 Linux 核心的機會

vwifi 虛擬無線網路裝置驅動程式和實驗環境

vwifi 是個程式碼約五百行,具體而微的 WiFi 裝置驅動程式,採用 cfg80211 框架。目前 vwifi 支援 scan, connect, disconnect 等 cfg80211 的介面操作,並得以正確處理 Tx/Rx 封包。

打造 Linux 虛擬攝影機裝置驅動程式

vcam 是個針對 Linux 核心開發的虛擬攝影機裝置,全部程式碼僅 1 千 5 百行,從而可理解 V4L2 (video fro Linux APIs, version 2) 的使用和 Linux 多媒體架構。開發一個虛擬的攝影機裝置除了理解 Linux 核心設計外,也有資訊安全的幫助,例如你可以安插相關程式碼,紀錄有哪些應用程式偷偷啟動攝影機,但過程中又不會揭露真正的隱私。

Linux 系統虛擬機器開發和改進

KVM 可將 Linux 核心轉為 type-2 hypervisor,結合硬體的虛擬化支援,使得 host machine 上可以執行多個獨立的虛擬環境,稱為 guest 或者 virtual machine。由於 KVM 直接提供 CPU 和記憶體的虛擬化,guest os 的 CPU 指令不需要額外經過軟體的 decode,而是直接交給硬體進行處理,因此可以有效的提高運行速度。而結合軟體 (例如 KVM 搭配 QEMU) 模擬 CPU 和記憶體以外的裝置後,guest OS 便可以被完整地支援在 host OS 上載入並執行。kvm-host 則是建構在 KVM 基礎上的虛擬機器實作,可載入 Linux 核心和相關應用程式。

simplefs

為了探索 Linux VFS (virtual file system) 介面及檔案系統實作機制,我們從無到有撰寫一個運作於 Linux 核心模式中的精簡檔案系統,原始程式碼約一千餘行,支援基本的檔案和目錄處理,同時也考慮到權限和並行處理的議題。本任務也規劃移植 Arm 公司發展的 littlefs 成為 Linux 核心原生檔案系統 (不透過 FUSE)

實作高效記憶體配置器

第 5 週測驗題第 6 週測驗題第 11 週測驗題提及逐步建構記憶體配置器 (memory allocator),本任務針對 Linux 核心的機制,設計現代的高效記憶體配置器

高效網頁伺服器

探討從無到有打造 Linux 平台的高效能網頁伺服器,涵蓋是否該將伺服器實作於 Linux 核心內部、並行處理、I/O 模型、epoll、Reactor pattern,和 Web 伺服器在事件驅動架構的考量。

kHTTPd 改進

擴充 kHTTPd,使其具備現代網頁伺服器的經典特色,並運用 Linux 核心的機制,例如使用 RCU 管理 HTTP 連線,參見 ktcp

以 eBPF 建構 TCP 伺服器

嘗試以 eBPF 來建構 TCP 伺服器。

透過 Netfilter 自動過濾廣告

儘管我們可在網頁瀏覽器中透過像是 AdBlock 這類的 extension 來過濾廣告,但需要額外的設定和佔用更多系統資源,倘若我們能透過 netfilter,直接在核心層級過濾網路廣告,那所有應用程式都有機會受益。

以 Linux XDP 為基礎的防火牆

XDP (eXpress Data Path) 自 Linux 核心 4.8 版本起作為以 eBPF 為基礎的高效資料處理路徑,一旦網路中斷觸發後,XDP 允許將特定的操作提前在 TCP/IP 堆疊之前就處理,不僅反應更快而且省下寶貴的記憶體分配的成本。本議程以 XDP 作為切入,探討如何在這之上發展高效網路負載平衡器,並針對典型的 High Availability (HA) 叢集和非典型的情境去調整。

改進 Linux 核心的 lib/{list_}sort.c

解釋 Linux 核心的 lib/{list_}sort.c 現有的 bottom-up merge/heap sort 實作,並尋求效能改進,例如 hybrid sort 的引入

simrupt 研究和應用

simrupt 專案名稱由 simulate 和 interrupt 二個單字組合而來

Linux Kernel Module Programming Guilde (LKMPG) 校訂和改進

LKMPGLinux 核心內建文件所推薦的電子書,儘管品質不算好,但仍是世上極少數自由流通的 Linux 核心專書。投入這項專案,就意味著可獲得大量的關注,也是對自身專業的極好肯定。

每位程式開發者都該有的記憶體知識〉翻譯和校訂

本文翻譯自 Ulrich Drepper 於 2007 年撰寫的論文〈What Every Programmer Should Know About Memory〉(版次: 1.0)

《Concurrency Primer》校訂和範例撰寫

檢視〈Concurrency Primer〉草稿並記錄閱讀過程中的疑惑,嘗試用 C11 Atomics 改寫原有程式碼,並確保在 QEMU/Arm 正確運作。

並行程式設計

回顧〈並行和多執行緒程式設計〉教材和相關測驗題,強化對延伸問題的掌握

rhashtable 及 Linux 核心記憶體管理研究

Linux 核心提供一套 Resizable, Scalable, Concurrent Hash Table,名為 rhashtable (見 include/linux/rhashtable.hlib/rhashtable.c),描述於論文〈Resizable, Scalable, Concurrent Hash Tables via Relativistic Programming〉。摘譯 LWN 文章,並佐以原論文,描述 rhashtable 何以落實高效的並行雜湊表,搭配撰寫 Linux 核心模組作為試驗

針對 rv32emu 實作 JIT 編譯器

rv32emu 是針對 RISC-V 32 位元指令集開發的精簡高效模擬器,本任務是引入 JIT 編譯器,以加速 RV32 指令的執行。

RISC-V System Emulator + Linux

semu 是個能夠執行 Linux 核心的精簡 RISC-V 系統模擬器。

在 RISC-V 處理器運作 Linux 核心 (FPGA/虛擬機器)

紅黑樹實作改進

重做第 3 週測驗題 的測驗一及第 4 週測驗題的測驗一,彙整其他學員的成果,連同延伸問題

運用 Skip List 於 Linux 核心

回顧 Linux 核心的 bitops 並尋求貢獻程式碼的機會

Linux 核心的 include/asm-generic/bitops 存在若干實作不一致的狀況,本任務嘗試追蹤 git log 和 LKML,以理解發展脈絡,並嘗試用精簡有效的方式改寫,最後嘗試貢獻程式碼到 Linux 核心。

Linux 亂數產生器研究

第 3 週測驗題第三題介紹到 Linear feedback shift register (LFSR),這也是 Linux 核心亂數產生器 (RNG) 的基礎之一。本任務探討 Linux RNG 的原理、實作機制,以及應用場景。

位元操作

第 2 週測驗題嘗試檢驗學員對位元操作的認知,本任務強化相關練習。

Trusted Firmware-A 及 Linux 啟動流程分析

Trusted Firmware 是 Arm 公司針對 TrustZone 和 Platform Security Architecture 開發的基礎建設,本任務理解 Trusted Firmware-A (TF-A) 及探討 Linux 在 TF-A 的系統啟動流程分析。

Kernel PWN

藉由回顧經典的 PWN 手法,理解 Linux 核心機制。

重做 fibdrv 並彙整學員成果

改進並彙整其他學員的成果

重做 lab0 並彙整學員成果

改進並彙整其他學員的成果