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

RealBigMickey (石維廉)

簡介

2025 Linux 核心設計 春季班 自我評量

成果發表和貢獻

我會給自己 6 分

成果發表與貢獻,是我這學期最大的遺憾。雖然沒能提交 patch,也未在 open source 社群留下痕跡,但這不代表我毫無貢獻。

  • 本學期的期末專案可視為我去年打造之專案的「重生」。在正式開始前,我花了一週時間系統性檢討過去設計錯誤,撰寫成一份 HackMD 紀錄,為新版 DISFS 架構打下基礎,整合 PostgreSQL 與 Discord API,善用 SQL 、write-back local cache、stateless HTTP 等設計
  • 作業三 kxo 中,將 AI 與繪圖任務分離於核心與使用者曾,使用 workqueue 達成並行執行,同步進行顯著降低 keyboard handler 對 rendering 的阻塞,提升互動性
  • 一對一面談中,實作無不依賴 libc 與 FPU 計算 e^x - 1 的單精度 float 計算,自己爬文、研究怎麼實作,從 Linux kernel 使用定點數為靈感,利用泰勒展開與 Minimax polynomial 達成接近原生 expm1f() 的準確度(最大誤差約 0.05 %),並以 benchmark 驗證精度與效能,詳細紀錄見 HackMD
  • 《Demystifying the Linux CPU Scheduler》其中第七章 30 頁的內容進行詳細校閱,包括文法錯誤、語病與句構重組等。雖然後來老師表示這些修改大多已在我提出前修正,但我仍相信其中有不少內容在教材更新過程中可能被遺漏。我仍認為這段努力具有實質貢獻價值,特別是在理解與釐清內容上。

(以下與評分項目無關) 我確實錯過學期間對外貢獻的機會,學期一開始的我沒把「短期內做出貢獻」視為首要目標。比起抓些文法錯誤,我更希望能夠扎實建立起自己的基礎,讓未來的貢獻能夠站得穩、走得遠。與其貿然提交 patch,不如先確認自己真的理解系統的脈絡與設計哲學——會走路之後,再學飛也不遲。

目前我已報名下一屆的「RISC-V 晶心杯」,並正在研究我特別感興趣的領域,藏是 sched_ext 可插拔排程器框架,以及正在發展中的 Linux Switch 2 鍵值切換機制。期末專案中有不少同學提出有趣的問題,像是快取的改進面或是引進 partial read write 等,我積極回應同學們提出的想法與問題,深入研究,目前也正在陸續實作到系統中。

作業/隨堂測驗

我會給自己 10 分

第一週開始前就略略看過課程教材,心中抱有期待參加這門課。從第一週起就把自己所有多餘的時間貢獻給 Linux 核心設計,每週平均預計至少30小時做作業或是閱讀教材,除了期中與期末少數幾週外從未鬆懈過。 - 2025q1 Homework1 (lab0) - Linux 核心中的鏈結串列、自製亂數產生器、Valgrind 分析記憶體問題 - 2025q1 Homework2 (quiz1+2) - 研究並實作 quiz1+2 延伸問題 - 2025q1 Homerwork3 (kxo) - 核心與使用者層級分工與通訊、AI 對峙圈圈叉叉、引入 coroutine 與排程器完成多遊戲並行、畫面顯示系統 load 與當下時間 - 2025q1 Homework4 (quiz3+4) - 研究並實作 quiz3+4 延伸問題 - 2025q1 Homework5 (assessment) - 檢討當前課程進度

其中,作業一是進步空間最大的一份,但因為是第一次嘗試許多從未接觸過的東西,我認為最後做到的成果,沒有對不起當時的努力。後續作業一次比一次進步且漸漸完整,作業三也有受到助教的正面回饋,自己也滿意。最後與老師商量後決定放下 homework6 ,轉而投入開發期末專案。

期末專題

我會給自己 10 分

這學期我將 2024 年原型「Discord Clouding」徹底重構,打造一個完整的雲端檔案系統 DISFS(DISFS Is a Service File System)。此專案以 Discord 作為儲存後端、FUSE 實作 user-space 檔案系統介面,搭配 Python + PostgreSQL 架設的 stateless HTTP 伺服器,總計實作超過 2000 行程式碼,橫跨 kernel syscall 介接、網路 API 操作與資料庫設計,是目前我技術跨度最大、也最具完整性的系統專案。

DISFS 將 POSIX 操作(如 open, read, write, mkdir, rename 等)轉換為 HTTP 請求,並將檔案分割為 chunks 上傳至 Discord,後端以 closure table 表示檔案階層結構,支援 O(1) 子樹查詢與快速路徑解析。系統具備登入機制(透過 pseudo-file .ping/{username} 實現)、快取設計(local write-back + partial cache)、stateless 傳輸協定(每筆請求含完整參數,如 user_id、path、chunk_index)以及錯誤容忍的上傳下載流程。

技術亮點與挑戰:

  • 平台限制對應設計
    • Discord 附件大小限制(10MiB)→ chunked read/write 實作
    • 上傳速度與冷啟延遲 → write-back cache 提高互動性
    • 快取設計平衡效能與一致性 → cold path 需數秒、warm path 幾乎即時
  • 資料結構選型
    • Closure table 相較 adjacency list 更適合高效率遞迴查詢,便於實作 rm -rmvls -R 等操作,也為垃圾桶與版本控制打下基礎。
  • 協定與通訊設計
    • 所有 HTTP request 為 stateless,明確參數化,方便未來擴展為 REST-style API(尚未完全符合 RESTful 定義)
    • login/auth 透過 shell 命令實作,我稱之「登陸即檔案」,簡潔直觀不需外部介面登入
  • 未完成部分與後續規劃
    • 因背景上傳、非同步寫入與 API 限速等特性,尚未完成正式效能 benchmark,但已規劃測試方法,包含 cache-hit/miss 延遲、tree traversal latency、cold vs warm 啟動延遲等。
    • chunk 傳輸若改為由 client 直取 Discord attachments,將有效減少 server-side 壓力與提升速度
    • 預期將整合登入 session、擴展 partial write 支援、加入使用者 session 與多工處理等功能

這個專案的價值不在於性能極限,而在於從 0 到 1 構築一套具備真實接口與實驗精神的雲端檔案系統。我完整參與了從 kernel FUSE handler、cache policy、user/kernel IPC、後端儲存、資料庫 schema 設計,到網路協定與限制處理等各層面。這份成果也公開發表,並獲得多位同學實測與回饋(weiso131、rota1001、EricccTaiwan 等),簡報與影片亦公開發表。

完成的操作如下: { .getattr .readdir .read .mkdir .open .release .create .write .truncate .unlink .rmdir .rename } 我認為專案算有趣且概念不會很難理解,若有興趣建議看共筆中提供的介紹影片。

與授課教師的互動

我會給自己 10 分

  • 2025-03-04 課堂問答
    • 對 Linux 核心做出貢獻時,若找不到 Maintainer 或是 Maintainer 消極,乃至意見與 Maintainer 答不成共識時,該採取的行動。
    • 延伸探討如何有效聯繫 Maintainer、無回應時時往上找的流程
  • 2025-04-29 課堂問答
    • 回頭看作業三 kxo 的設計與實作細節
    • 探討 user-space 與 kernel-space 溝通之通訊成本、page size 差異與其背後的架構原理。
    • NULL == (void *) 0 在核心中如何解讀
    • 研究為何不同架構的 page size 不盡相同的原因
  • 2025-05-15 一對一面談
    • 約 3 小時,確切感覺到老師的真誠與熱情
    • 被點出自己最大的問題,總是在尋找捷徑,從而略過細節而不扎實
    • 被問了四個問題,後續花一週認真研究+紀錄,其中由 e^x - 1 no FPU no libc 實做最為印象深刻,有挑戰且有趣的實做+理論題,詳細過程: 2025 Linux 核心設計 一對一面談
    • 上述成果在 Github 第一週獲得了 6 個 git clone
  • 2025-05-27 課後一對一面談
    • 約 1 小時
    • 談期末專案方向
    • review 一對一做出來的研究成果,執行時間結果圖表與老師預期不同
  • 2025-06-10 課後一對一面談
    • 約 1 小時多
    • 檢討 DISFS 前身作品 Discord Clouding 種種問題
    • 談期末專案實做的可行性
    • 給予更多意見與鼓勵
  • 學期間不間斷的與助教保持聯繫,討論每次作業與期末專案,獲得許多即時的回饋

所見所聞所感

我會給自己 10 分

起初在選這堂課時其實是猶豫不決的。

我不像系上那些 coding 強者,早早就踏入資訊領域,一切是從大學才開始的,一步一腳印、腳踏實地學習。當時大二剛修完資料結構,種種核心課程都還沒修,e.g. 機率與統計、計算機組織、作業系統、演算法等等,連 Markdown 都不會,不禁懷疑自己會不會還不夠資格。

學期結束回頭看,確實是段吃力的旅程。 面對自己的不足,才發現原來自己如此渺小。當初為了學習而退掉必修,諷刺的是,最大的挑戰也來自「學習」本身。每次面對的是全新的概念、新的工具,新的系統,被炸的體無完膚。但也正因如此,我從起初盲人摸象,到後來逐漸能加快閱讀教材的速度、理解課堂內容,看到自己慢慢有進步,那份成就與喜悅是藏不住的。因為這個莽撞的決定而成長,累積起來的東西不會背叛自己。

與老師的一對一中,也感悟許多,不只是因為講到期末專案,更是些故事像是台文系學生後來去台大資工所,或是 500 萬的 6 頁 pdf 等。當時老師講了一句留下深刻的印象:「我的知識是拿來解決問題的,但有些人的知識只是拿來取得分數的,之後就不再往前走了。」

課堂中另一個讓我印象深刻的是〈自動販賣機而延畢的那一年〉,講述一位交大的學生為了天馬行空而延畢故事,勵志之中也帶著一絲辛酸。我一直很崇拜那些能被熱誠吞噬、為理想燃燒殆盡的人。也在想,有沒有那麼一天,我也能成為那樣的人?星空中不一定會有流星,但如果一直低著頭,就一定看不見。

未來充滿著未知,但這學期的經歷,已深深烙印在我心上。透過數據、論點與邏輯,去解決「真實世界的問題」,這樣的學習過程讓我著迷。接下來的路上,我希望能繼續碰到 Linux,繼續變強!最後,想引用 Jserv 老師在第一堂課說過、我非常喜歡的一句話作結:「就算跌倒,也要抓一把沙。」

自我評量 (1 ~ 10):

\(GEOMEAN = ( 6 \times 10 \times 10 \times 10 \times 10 )^{1/5} = 9.028804514\)

方案 B :\(1 + floor(GEOMEAN) = 1 + 9 = 10\)