2024 年開放原始碼專案協作
講解錄影
緣起
- 2005 年 Debian Taiwan 社群有項名為「夢幻軟體計畫」,嘗試將現有的概念化為更具體的提案,徵求更多人的參與,從而讓投身實作的人得以互相溝通與合作。
- 2015 年決定「封麥」
- 連續在 COSCUP 演講 10 年、合計 18 場演講,擔任訪談人、議程委員、贊助商等不同角色
- 把發表的機會留給學生
- 2014 到 2017 年,jserv 在交大資工所開設「自由開源軟體與專案協作」課程,嘗試引導大學生貢獻於開放原始碼專案。
- 莊偉赳博士發起的源來適你,引導有心人投入 Apache Software Foundation 的眾多專案
- 2019 年起,jserv 在成大資訊系/所開設「Linux 核心」系列課程,至今已有超過 17 位學生的程式碼貢獻獲得 Linux 核心收錄
近期國際研討會發表狀況
請考慮 資助學生旅費
開發策略和模式
- 選定若干有潛力、有特色的主題,建構對應的開放原始碼專案
- 擬定切入貢獻大型開放原始碼專案 (如 Linux 核心) 的策略,以「投石問路」的手段逐步推進
- 聯繫對學生友好的開放原始碼專案主持人,建議程式碼貢獻的方案
- 不再是 side project,直接成為課程作業/畢業專題/研究論文主體
2024 年聚焦的開放原始碼專案
虛擬機器/編譯器
- rv32emu / semu: A compact and efficient RISC-V RV32I[MACF] emulator
- shecc: A self-hosting and educational C optimizing compiler
- sse2neon: A C/C++ header file that converts Intel SSE intrinsics to Arm/Aarch64 NEON intrinsics
RISC-V 處理器實作
- single-cycle RISC-V core
- SoomRV: A simple superscalar out-of-order RISC-V core. It can execute up to 4 instructions per cycle and is able to boot Linux.
Linux 核心模組
- vcam: 針對 Linux 核心開發的虛擬攝影機裝置,全部程式碼僅 1 千 5 百行,從而可理解 V4L2 (video for Linux APIs, version 2) 的使用和 Linux 多媒體架構。
- vwifi 是個具體而微的 WiFi 裝置驅動程式,採用 cfg80211 框架。目前 vwifi 支援 scan, connect, disconnect 等 cfg80211 的介面操作,並得以正確處理 Tx/Rx 封包。
- kHTTPd: 核心模式的網頁伺服器,參見 ktcp
- simplefs: 為了探索 Linux VFS (virtual file system) 介面及檔案系統實作機制,我們從無到有撰寫一個運作於 Linux 核心模式中的精簡檔案系統
- 透過 Netfilter 自動過濾廣告: 儘管我們可在網頁瀏覽器中透過像是 AdBlock 這類的 extension 來過濾廣告,但需要額外的設定和佔用更多系統資源,倘若我們能透過 netfilter,直接在核心層級過濾網路廣告,那所有應用程式都有機會受益。
eBPF/XDP
XDP (eXpress Data Path) 自 Linux 核心 4.8 版本起作為以 eBPF 為基礎的高效資料處理路徑,一旦網路中斷觸發後,XDP 允許將特定的操作提前在 TCP/IP 堆疊之前就處理,不僅反應更快而且省下寶貴的記憶體分配的成本。
- 探討如何在 XDP 之上發展高效網路負載平衡器,並針對典型的 High Availability (HA) 叢集和非典型的情境去調整。
- 嘗試以 eBPF 來建構 TCP 伺服器。
Linux 核心的 lib/
目錄
- 解釋 Linux 核心的
lib/{list_}sort.c
現有的 bottom-up merge/heap sort 實作,並尋求效能改進,例如 hybrid sort 的引入
- Linux 核心的 include/asm-generic/bitops 存在若干實作不一致的狀況,本任務嘗試追蹤 git log 和 LKML,以理解發展脈絡,並嘗試用精簡有效的方式改寫,最後嘗試貢獻程式碼到 Linux 核心。
- 針對 min_heap 的效率改進
- 第一個 patch 將 array 建立成 heap 的時候我們可以從 n / 2 - 1 (根節點位於 index 0 的位置) 開始做 heapify 而不是從 n / 2 開始,減少了一次不必要的 heapify。
- 教科書版本的 heapify 操作是從根節點開始向下進行,每個 level 與兩個子節點比較,除非當前節點已經是最小的,否則就與兩個子節點中的最小者進行交換。一般情況下,像是
min_heap_pop
在移除根節點元素後,會將最後一個元素放到根節點再進行 heapify。這樣的比較與交換過程通常會一直進行到接近葉節點的位置,因此總共需要大約 次的比較操作。為了減少比較次數,第二個 patch 改成每個 level 只比較兩個子節點中的最小者,直到遇到葉節點為止。在遇到葉節點後,我們再從葉節點向上尋找根節點應該被交換至的正確位置。由於這個位置會很接近葉節點,所以只需大約 次的比較操作。
- 這樣一來,我們可以節省大約 50% 的比較次數,同時保持相同的交換次數。
Linux 排程器
探討 Linux 排程器內部設計,改進《Demystifying the Linux CPU Scheduler》,並尋求貢獻程式碼到 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 核心和相關應用程式。
全向量視窗系統
mado 是個向量圖形 (vector graphics) 視窗系統,不僅展現相關 rect clipping 相關演算法及 fixed point 的操作,還能利用 Linux framebuffer 和 input 子系統來展現整個視窗系統。打造類似 Cairo API 風格的向量繪圖函式庫。
mado 是達悟 (雅美) 族語「窗」的意思。
電子書編輯
作業系統核心
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
- Mazu: 亦即 Mazu's Not UNIX,公開釋出的版本會支援 RISC-V 處理器架構。Mazu 的實作參考 MINIX 的許多設計理念,又提供部分 Linux 核心系統呼叫的相容,連同工具程式在內大約僅一萬行,其中微核心的部分則在三千行的規模,很適合作為探索作業系統的教具,一旦熟悉 Mazu 後,再去學習 Linux 核心的內部,掌握度就會很高。設計理念:
- 媽祖是海上守護神,Mazu 則是應用程式的守護神 (daemon)
- 媽祖也稱默娘,Mazu 默默守護著電腦硬體,分配硬體資源給特定的應用程式
- 從命名來說,MazuNIX 顯然是向 UNIX 作業系統致敬,但全部的程式碼針對現代硬體特性重寫,又保有經典系統呼叫
- 媽祖可以鼓勵企業家勇於參選總統,那媽祖更可鼓勵廣大的學子去挑戰高難度的題目,例如開發作業系統核心
小故事
針對無人飛行器和機器人系統的軟體基礎建設
頂級研討會