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

User/tobiichi3227

2026 年 Linux 核心設計課程自我評量

姓名:馬道中 Github 帳號:tobiichi3227

成果發表與貢獻

6 分

本學期內只有貢獻教材以及對教材相關的 Repo 發一個 PR、給 Linux 發一個沒有被接受的 Patch、給 LLVM 發一個尚未合併的 PR,屬於方案 B。

課程教材 PR

  • Fix high CPU usage when game paused 2026/06/02 在執行 kxo 發現當暫停畫面更新時,CPU 使用率會增加。 透過 perf 工具發現在暫停時 __x64_sys_write()__se_sys_pselect6() 等函式佔 CPU sample 比例到達 60%。 經過研究發現是因為在畫面暫停下 select() 會直接返回,但 else if (read_attr && FD_ISSET(device_fd, &readset)) 條件不會成立,會繼續更新 TUI 然後再回到 main loop 繼續呼叫 select(),所以在畫面暫停時不該繼續監聽 /dev/kxo,只需監聽 STDIN 即可。

LLVM PR

Kernel Patch

未被接受 [PATCH 0/1] ovpn: tcp - defer TX from softirq to workqueue
[PATCH 1/1] ovpn: tcp - defer TX from softirq to workqueue
在使用 OpenVPN 時發現維持 VPN 連線狀態下讓筆電進入睡眠狀態會導致 Kernel Crash,為此非常困擾。

修正教材

修錯字

  • 2026/06/05:〈Concurrency Primer〉中的 atomic_compare_exchange_strong() 實作變數名稱與參數名稱不符,PR

Trivial 的修錯字

將以下教材的 優化 改成 最佳化

作業與隨堂測驗

4 分

執行了三個作業。

作業完成度

  • 作業一 warmup
    • 探討〈資訊科技詞彙翻譯〉:完成
    • 探討〈解讀計算機編碼〉:只完成 二補數的設計是否本質上是種 algebraic encoding?為何 Linux 核心中 unsigned overflow 是 defined behavior,但 signed overflow 是 undefined behavior?
    • 探討〈你所不知道的C語言:指標篇〉:完成
    • 探討〈linked list 和非連續記憶體〉:只完成 教材中使用 struct ListNode **indir = &head;,描述以下:
    • 誠實面對期初考題:只完成第三題
  • 作業二 stdc
    • 細讀〈你所不知道的 C 語言:數值系統篇〉:只部份完成 教材以 0.1 + 0.2 ≠ 0.3 作為引言,說明電腦的數值表示問題,援引 IEEE 754 規格和你在電腦上的實驗,充分回答以下:、算術運算可完全以數位邏輯實作,分析 \(x + y = (x \oplus y) + ((x \& y) << 1)\) 並回答:
    • 細讀〈你所不知道的 C 語言: bitwise 操作〉:只部份完成 為何 Linux 核心程式碼通常會將用以描述硬體狀態 (例如 x86 的 CR 系列暫存器) 的旗標 (flag) 型態定義為 unsigned 整數,而非 signed 整數?從 padding bits、trap representation 與 C 語言標準行為說明原因若錯誤地使用 signed int 來儲存旗標並進行位移運算,可能出現哪些實作相依(implementation-defined)或未定義(undefined)行為?結合右移與負數的例子說明,搭配 C 語言規格書描述當 signed 與 unsigned 整數混合運算時,signed 數值會轉換為 unsigned,導致意外結果,例如比較運算結果顛倒。分析以下程式片段可能導致無窮迴圈:
    • 細讀〈C 語言的 bit field〉:只部份完成 struct signed bit、教材提到 zero-width bit-field: int : 0;,其作用是強制下個 bit-field 對齊到新的 storage unit,分析以下:教材提及 Linux 核心的技巧 #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:(-!!(e)); })),從 C 語言規格的角度回答以下:
    • 探討〈你所不知道的 C 語言:記憶體管理、對齊及硬體特性〉:只部份完成 void 指標
  • 作業三 basics
    • 細讀〈從 Revolution OS 看作業系統生態系統變化〉:只完成 Hyper-V 之旅
    • 細讀〈C 語言: 前置處理器應用〉:只完成 C 前置處理器的 stringification…
    • 細讀〈C 編譯器原理和案例分析〉:只部份完成 AMaCC...
    • 細讀〈C 語言: 未定義行為〉:只部份完成 現代編譯器利用 UB 進行激進最佳化SSA 形式在常數傳播與死碼消除中扮演關鍵角色。

期末專題

0 分

沒東西

與授課教師的互動

4 分

一對一討論共 0 次,課堂問答共 2 次。

一對一討論

沒有任何一對一討論

課堂問答

  • 2026/05/21: 詢問在 Linux 上 process 與 thread 有什麼差別,要怎麼知道一個已經執行的 task 是 process 還是 thread

  • 2026/06/11: 詢問為什麼 spsc_fifo_writeread_countacquirespsc_fifo_readread_countrelax

後續實驗發現在 x86_64 與 Arm 平台即使將全部限制改成 relax 一樣不會重排,透過 pthread_setaffinity_np() 將 Producer 與 Consumer 執行緒指定到不同 CPU 也沒有發生重排,有可能是因為測試用的 Arm 平台 CPU Core 數量太少導致的。

所見所聞所感

8 分

關於〈因為自動飲料機而延畢的那一年

看完後我十分的敬佩作者,相比現實世界的中的工程,資訊世界的工程簡單許多了,在現實中你想要做一個物品來實驗測試,要經過各種流程還要等待,但在資訊世界中只需要打開手邊的設備就可以開始你的實驗了,如果想要看到工業等級的內容,我們只要打開 Linux Kernel 等優秀專案的程式碼,但在現實你可能要去各種地方問,甚至根本問不到。

關於資訊科技詞彙翻譯

在以前就聽聞老師對正確用詞很在意,上課後才知道老師是非常在意,上課不時會提到,在同學用錯詞彙時還會適當的提醒同學,讓我深知正確用詞的重要性。

關於數學

在 yushiuan9499 第一次課堂問答時(我坐在他旁邊),他被問到 Merge Sort 比 Quick Sort 適合 Linked List 等問題,我以為他可以輕鬆回答上來,尤其是數學分析的部份,沒想到他還是思考很久,這讓我非常震驚,沒想到像他數學能力這麼強(我認為的)的還是沒有順利答出,像我這種數學能力很差的就更要誠實面對自己的數學能力。

關於 C 語言

在以前有出過將 for 迴圈轉成 goto 的題目,當時有看過規格書中對語法的定義,在這堂課上才真正去讀語意的部份,讓我發現我對 C 語言的理解只是很片面的。 為了去找到符合規格書的但跟目前大多設備不一樣的結果或是 Implemention Defined(比方說 NULL 並不是 \(0\)char 不是 8-bit,對有號整數右移是邏輯右移等),我去尋找各種早期的系統與架構(如 Multics、Prime 50 等)嘗試找到對應的結果,這讓我知道 C99 為什麼會有這麼多不合常理的規定,不過讀規格書是真的很累,有些寫的非常不直觀,像是對於 strict aliasing 的定義。

關於 Kernel Patch

因為經常使用在外面經常使用 OpenVPN 連回家,又很常筆電闔上就走人了,所以發現當 OpenVPN 保持連線時睡眠有機會讓 Kernel Crash,非常燥 後來透過 Linux 核心設計: Kernel Debugging(1): Kdump測試 Linux 核心的虛擬化環境 提到的 kdump 與 crash 成功取得 crash log,所以就嘗試去修改 kernel ovpn module 我用 selftest 測試成功就發 patch 了,但 Maintainer 說這會破壞 selftests,也提到這樣的作法對性能很大的影響 我後續就沒有繼續發 patch 了

分數計算

項次 名稱 分數
1 成果發表與貢獻 6
2 作業與隨堂測驗 4
3 期末專題 0
4 與授課教師的互動 4
5 所見所聞所感 8

幾何平均 (GEOMEAN) 計算 \(\text{GEOMEAN} = ^5\sqrt{6 \times 4 \times 0 \times 4 \times 8} = ^5\sqrt{0} = 0\) 驗算 \(0^5 = 0\),符合定義。

方案選擇: - 方案 A 適用條件:對 Linux, glibc, gcc, llvm, lkmpg, rv32emu, kbox, elfuse 等專案做出超過 3 項 non-trivial 貢獻並獲開發者採納。 - 本人不滿足。 - 採方案 B: \(1 + \lfloor \text{GEOMEAN} \rfloor = 1 + 0 = 1\)

自我評分總分: 1/10