版本 031bb89276e93cd27729eb82ca7f6cfd8098905c
Linux 核心設計/實作 (Spring 2023) 課程進度表暨線上資源
第 1 週 (Feb 13, 14, 16): 誠實面對自己
教材解說 *
(僅止於概況,請詳閱下方教材及個別的對應解說錄影)
課程簡介和注意須知 / 課程簡介解說錄影 *
每週均安排隨堂測驗,採計其中最高分的 9 次
學期評分方式: 隨堂測驗 (20%) + 個人作業+報告及專題 (30%) + 自我評分 (50%)
歷屆修課學生心得: 向景亘 , 張家榮 , 蕭奕凱 , 方鈺學
分組報告示範: ARM-Linux , Xvisor
GNU/Linux 開發工具共筆 *
: 務必 自主 學習 Linux 操作, Git, HackMD, LaTeX 語法 (特別是數學式), GNU make, perf, gnuplot
確認 Ubuntu Linux 22.04-LTS (或更新的版本) 已順利安裝到你的電腦中
透過 Computer Systems: A Programmer’s Perspective 學習系統軟體 *
: 本課程指定的教科書 (請及早購買: 天瓏書店 )
軟體缺失導致的危害
1970 年代推出的首款廣體民航客機波音 747 軟體由大約 40 萬行程式碼構成,而 2011 年引進的波音 787 的軟體規模則是波音 747 的 16 倍,約 650 萬行程式碼。換言之,你我的性命緊繫於一系列極為複雜的軟體系統之中,能不花點時間了解嗎?
軟體開發的安全性設計和測試驗證應獲得更高的重視
The adoption of Rust in Business (2022)
解讀計算機編碼
人們對數學的加減運算可輕易在腦中辨識符號並理解其結果,但電腦做任何事都受限於實體資料儲存及操作方式,換言之,電腦硬體實際只認得 0 和 1,卻不知道符號 + 和 - 在數學及應用場域的意義,於是工程人員引入「補數」以表達人們認知上的正負數
您有沒有想過,為何「二補數」(2’s complement) 被電腦廣泛採用呢?背後的設計考量是什麼?本文嘗試從數學觀點去解讀編碼背後的原理
你所不知道的 C 語言:指標篇 *
linked list 和非連續記憶體操作 *
安排 linked list 作為第一份作業及隨堂測驗的考量點:
檢驗學員對於 C 語言指標操作的熟悉程度 (附帶思考:對於 Java 程式語言來說,該如何實作 linked list 呢?)
linked list 本質上就是對非連續記憶體的操作,乍看僅是一種單純的資料結構,但對應的演算法變化多端,像是「如何偵測 linked list 是否存在環狀結構?」和「如何對 linked list 排序並確保空間複雜度為 O(1) 呢?」
linked list 的操作,例如走訪 (traverse) 所有節點,反映出 Locality of reference (cache 用語) 的表現和記憶體階層架構 (memory hierarchy) 高度相關,學員很容易從實驗得知系統的行為,從而思考其衝擊和效能改進方案
無論是作業系統核心、C 語言函式庫內部、應用程式框架,到應用程式,都不難見到 linked list 的身影,包含多種針對效能和安全議題所做的 linked list 變形,又還要考慮到應用程式的泛用性 (generic programming),是很好的進階題材
題目 1 + 分析 *
題目2 / 參考題解1 , 參考題解2
題目3 / 參考題解
題目4 / 參考題解
題目5 / 參考題解
佳句偶得:「大部分的人一輩子洞察力不彰,原因之一是怕講錯被笑。想了一點點就不敢繼續也沒記錄或分享,時間都花在讀書查資料看別人怎麼想。看完就真的沒有自己的洞察了」(出處 )
作業 : 截止繳交日: Feb 28, 2023
第 1 週隨堂測驗: 題目 (內含作答表單)
課堂問答簡記
第 2 週 (Feb 20, 21, 23): C 語言程式設計
教材解說 *
(僅止於概況,請詳閱下方教材及個別的對應解說錄影)
Linux v6.2 發布 : 接下來會是讓學員眼花撩亂的主版號/次版號的飛快跳躍 / kernel.org
Linux: 作業系統術語及概念 *
系統軟體開發思維
C 語言: 數值系統 *
儘管數值系統並非 C 語言所特有,但在 Linux 核心大量存在 u8/u16/u32/u64 這樣透過 typedef 所定義的型態,伴隨著各式 alignment 存取,若學員對數值系統的認知不夠充分,可能立即就被阻擋在探索 Linux 核心之外 —— 畢竟你完全搞不清楚,為何在 Linux 核心存取特定資料需要繞一大圈。
C 語言: Bitwise 操作 *
Linux 核心的 hash table 實作
為什麼要深入學習 C 語言? *
C 語言發明者 Dennis M. Ritchie 說:「C 很彆扭又缺陷重重,卻異常成功。固然有歷史的巧合推波助瀾,可也的確是因為它能滿足於系統軟體實作的程式語言期待:既有相當的效率來取代組合語言,又可充分達到抽象且流暢,能用於描述在多樣環境的演算法。」
Linux 核心作為世界上最成功的開放原始碼計畫,也是 C 語言在工程領域的瑰寶,裡頭充斥各式「藝術」,往往會嚇到初次接觸的人們,但總是能夠用 C 語言標準和開發工具提供的擴展 (主要來自 gcc 的 GNU extensions) 來解釋。
基於 C 語言標準研究與系統程式安全議題
藉由研讀漏洞程式碼及 C 語言標準,討論系統程式的安全議題
透過除錯器追蹤程式碼實際運行的狀況,了解其運作原理;
取材自 dangling pointer, CWE-416 Use After Free, CVE-2017-16943 以及 integer overflow 的議題;
C 語言:記憶體管理、對齊及硬體特性 *
搭配閱讀: The Lost Art of Structure Packing
從虛擬記憶體談起,歸納出現代銀行和虛擬記憶體兩者高度相似: malloc 給出 valid pointer 不要太高興,等你要開始用的時候搞不好作業系統給個 OOM ——簡單來說就是一張支票,能不能拿來開等到兌現才知道。
探討 heap (動態配置產生,系統會存放在另外一塊空間)、data alignment,和 malloc 實作機制等議題。這些都是理解 Linux 核心運作的關鍵概念。
C 語言: bit-field
bit field 是 C 語言一個很被忽略的特徵,但在 Linux 和 gcc 這類系統軟體很常出現,不僅是精準規範每個 bit 的作用,甚至用來「擴充」C 語言
參考題目 / 參考題目 *
/ 參考題解 1 , 參考題解 2 , 參考題解 3
作業 : 截止繳交日 Mar 7
第 2 週隨堂測驗: 題目 (內含作答表單)
課堂問答簡記
第 3 週 (Feb 27, 28, Mar 2): 並行和 C 語言程式設計
第 4 週 (Mar 6, 7, 9): 數值系統 + 編譯器
教材解說 *
(僅止於概況,請詳閱下方教材及個別的對應解說錄影)
公告:
請填寫 Google 表單 ,以利後續追蹤
《Demystifying the Linux CPU Scheduler》的書稿已寄送給成功大學的選課學生,旁聽的學員預計在 3 月 13 日取得 (第 5 週進度)
貢獻程式碼到 Linux 核心
追求神乎其技的程式設計之道
「可以看出抄襲風氣在台灣並不只是小時候在學校抄抄作業而已;媒體工作者在報導中任意抄襲及轉載是種不尊重自己專業的表現,不但隱含著一種應付了事的心態,更代表著這些人對於自己的工作沒有熱情,更沒有著一點堅持。如果要說我在美國看到這邊和台灣有什麼最大的不同,我想關鍵的差異就在對自己的工作有沒有熱情和堅持而已了。」
「程式藝術家也不過是在『簡潔』、『彈性』、『效率』這三大目標上進行一連串的取捨 (trade-off) 和最佳化。」
Linux 核心的紅黑樹
CS:APP 第 2 章重點提示和練習 *
核心開發者當然要熟悉編譯器行為
C 編譯器原理和案例分析 *
C 語言: 未定義行為 *
: C 語言最初為了開發 UNIX 和系統軟體而生,本質是低階的程式語言,在語言規範層級存在 undefined behavior,可允許編譯器引入更多最佳化
C 語言: 編譯器和最佳化原理 *
《Demystifying the Linux CPU Scheduler》第 1 章
作業 : 截止繳交日: Mar 30
Week4 隨堂測驗: 題目 (內含作答表單)
課堂問答簡記
第 5 週 (Mar 13, 14, 16): Linux CPU scheduler
教材解說 *
(僅止於概況,請詳閱下方教材及個別的對應解說錄影)
公告:
本週導入客製化作業,讓學員選擇改進前四週的作業或自訂題目 (例如貢獻程式碼到 Linux 核心),隨後安排授課教師和學員的線上一對一討論
浮點數運算 *
: 工程領域往往是一系列的取捨結果,浮點數更是如此,在軟體發開發有太多失誤案例源自工程人員對浮點數運算的掌握不足,本議程希望藉由探討真實世界的血淋淋案例,帶著學員思考 IEEE 754 規格和相關軟硬體考量點,最後也會探討在深度學習領域為了改善資料處理效率,而引入的 BFloat16 這樣的新標準
記憶體配置器涉及 bitwise 操作及浮點數運算。傳統的即時系統和該領域的作業系統 (即 RTOS) 為了讓系統行為更可預測,往往捨棄動態記憶體配置的能力,但這顯然讓系統的擴充能力大幅受限。後來研究人員提出 TLSF (Two-Level Segregated Fit) 嘗試讓即時系統也能享用動態記憶體管理,其關鍵訴求是 “O(1) cost for malloc, free, realloc, aligned_alloc”
Linux 核心模組運作原理
Linux: 不只挑選任務的排程器 *
: 排程器 (scheduler) 是任何一個多工作業系統核心都具備的機制,但彼此落差極大,考量點不僅是演算法,還有當應用規模提昇時 (所謂的 scalability) 和涉及即時處理之際,會招致不可預知的狀況 (non-determinism),不僅即時系統在意,任何建構在 Linux 核心之上的大型服務都會深受衝擊。是此,Linux 核心的排程器經歷多次變革,需要留意的是,排程的難度不在於挑選下一個可執行的行程 (process),而是讓執行完的行程得以安插到合適的位置,使得 runqueue 依然依據符合預期的順序。
C 語言: 動態連結器 *
C 語言: 連結器和執行檔資訊 *
C 語言: 執行階段程式庫 (CRT) *
作業 : 截止繳交 Apr 10
Week5 隨堂測驗: 題目 (內含作答表單)
課堂問答簡記
第 6 週 (Mar 20, 21, 23): System call + CPU Scheduler
教材解說 *
(僅止於概況,請詳閱下方教材及個別的對應解說錄影)
公告
自 3 月 22 日起,開放讓學員 (選課的學生 + 完成前二次作業過半要求的旁聽者) 跟授課教師預約一對一線上討論,請參照課程行事曆 裡頭標注 “Office hour” 的時段,發訊息到 Facebook 粉絲專頁 ,簡述你的學習狀況並選定偏好的時段 (建議是 30 分鐘)。留意課程發送的公告信件
選修課程的學員在本學期至少要安排一次一對一討論,否則授課教師難以評估學習狀況,從而會影響評分,請重視自己的權益。
coroutine
Linux: 賦予應用程式生命的系統呼叫
vDSO: 快速的 Linux 系統呼叫機制
UNIX 作業系統 fork/exec 系統呼叫的前世今生
《Demystifying the Linux CPU Scheduler》
1.2.1 System calls
1.2.2 A different kind of software
1.2.3 User and kernel stacks
1.3 Process management
2.1 Introduction
2.2 Prior to CFS
2.3 Completely Fair Scheduler (CFS)
3.1 Structs and their role
作業 : 截止繳交 Apr 17
Week6 隨堂測驗: 題目 (內含作答表單)
課堂問答簡記
第 7 週 (Mar 27, 28, 30): Process, 並行和多執行緒
第 8 週 (Apr 3, 4, 6): 並行程式設計, lock-free, Linux 同步機制
教材解說 *
(僅止於概況,請詳閱下方教材及個別的對應解說錄影)
公告:
4 月 4 日下午到晚間安排在家測驗,請在當日 15:00 刷新課程進度表/行事曆,以得知測驗方式
4 月 6 日晚間安排測驗
並行和多執行緒程式設計 ,涵蓋
Atomics 操作
POSIX Threads (請對照 CS:APP 第 12 章自行學習)
Lock-free 程式設計
案例: Hazard pointer
案例: Ring buffer
案例: Thread Pool
Linux: 淺談同步機制 *
利用 lkm 來變更特定 Linux 行程的內部狀態
Week8 隨堂測驗: 題目 (內含作答表單)
第 9 週 (Apr 10, 11, 13): futex, RCU, 伺服器開發與 Linux 核心對應的系統呼叫
第 10 週 (Apr 17, 18, 20): 現代微處理器
教材解說 *
(僅止於概況,請詳閱下方教材及個別的對應解說錄影)
公告:
本週指派新作業: ktcp *
選修「Linux 核心設計/實作」課程的研究生有額外的作業 (課程回顧和分享學習經驗給指導教授),詳情請留意後續信件
Cautionary Tales on Implementing the Software That People Want *
slides
1990: Queueing Problem: Stochastic Fair Queueing: Hash
2004: Real-Time Linux
2004: Dawn of Multicore Embedded
Formal Verification is Heavily Used
Natural Selection: Bugs are Software!
People don’t know what they want. But for software developers, this is no excuse.
現代處理器設計:原理和關鍵特徵 *
《Demystifying the Linux CPU Scheduler》
2.4 Multiprocessing
3.2 Time keeping
3.4 Per-Entity Load Tracking
4.1 Group scheduling and cgroups: Introduction
4.2 Group scheduling and CPU bandwidth
Linux: 中斷處理和現代架構考量 *
Linux: 多核處理器和 spinlock *
CPU caches by Ulrich Drepper
進行中的繁體中文翻譯: 《每位程式開發者都該有的記憶體知識 》
本文解釋用於現代電腦硬體的記憶體子系統的結構、闡述 CPU 快取發展的考量、它們如何運作,以及程式該如何針對記憶體操作調整,從而達到最佳的效能。
作業 : 截止繳交 May 14
課堂問答簡記
第 11 週 (Apr 24, 25, 20): 現代微處理器 + 記憶體管理
第 12 週 (May 1, 2, 4): 期末專題介紹和回顧
第 13 週 (May 8, 9, 11): 記憶體管理 + 裝置驅動程式
第 14 週 (May 15, 16, 18): 網路封包處理
教材解說 *
(僅止於概況,請詳閱下方教材及個別的對應解說錄影)
公告:
5 月 16 日恢復實體課程,討論期末專題
慶祝授課教師的論文被 OSDI 採納 (成功大學第一篇 OSDI 論文),授課教師請學員喝飲料
本週「已進行一對一討論」的學員會收到期末專題的確認信件,尚未預約討論的學員請及早進行
Linux 核心網路
semu: 精簡 RISC-V 系統模擬器 : 支援 TAP/TUN 以存取電腦網路
Build a virtual WiFi Driver for Linux *
/ 錄影
cserv is an event-driven and non-blocking web server.
展現 event-driven, non-blocking I/O Multiplexing (主要是 epoll ), shared memory, processor affinity, coroutine, context switch, UNIX signal, dynamic linking , circular buffer, hash table, red-black tree, atomic operations 等議題的實際應用
可視為 seHTTPd 的後繼改進實作
Memory Externalization With userfaultfd / 錄影 *
/ kernel documentation: userfaults
課堂問答簡記
第 15 週 (May 22, 23, 25): 網路封包處理 + 多核處理器架構
第 16 週 (May 29, Jun 1): 程式碼最佳化概念 + 多核處理器架構
第 17 週 (Jun 10): 即時 Linux 的基礎建設 + 多核處理器
第 18 週 (Jun 12, 13, 14): Rust + 課程回顧
Please enable JavaScript to view the comments powered by Disqus.