Linux 核心设计/实作 (Linux Kernel Internals)

在「Linux 核心设计/实作」Spring 2023 课程进度页面的原始档案的基础上,稍作修改以记录我的学习进度

成功

如果你学习时感到挫折,感到进度推进很慢,这很正常,因为 Jserv 的一个讲座,需要我们花费一个星期去消化 🤣 并且 Jserv 也提到前 6 周课程的密度是比较大的

所以没必要为此焦虑,如果你觉得某个内容不太理解,可以尝试先去看其他讲座,将原先不懂的知识交给大脑隐式消化,过段时间再回来看,你的理解会大有不同。

  • Instructor: Jim Huang (黃敬群) <jserv.tw@gmail.com>
  • 往年課程進度
  • Linux 核心設計 (線上講座)
  • 注意: 下方課程進度表標註有 * 的項目,表示內附錄影的教材
  • 注意: 新開的「Linux 核心實作」課程內容幾乎與「Linux 核心設計」一致,採線上為主的進行方式

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 週: C 語言程式設計

(Feb 20, 21, 23)

  • 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 語言

第 3 週: 並行和 C 語言程式設計

(Feb 27, 28, Mar 2)

  • 教材解說* (僅止於概況,請詳閱下方教材及個別的對應解說錄影)
  • 公告
    • 2 月 28 日沒有實體課程,但安排線上測驗 (「Linux 核心設計」課程的學員務必參加),在 15:20-23:59 之間依據 Google Calendar 進行作答
    • 第二次作業已指派,可在 2 月 28 日晚間起開始繳交,截止繳交日 Mar 7
    • 3 月 1 日晚間安排第一次作業的檢討直播 (事後有錄影),請參見 Google Calendar
  • Linux: 發展動態回顧*
  • 從 Revolution OS 看作業系統生態變化*
  • 並行和多執行緒程式設計*: 應涵蓋 Part 1 到 Part 4
    • Part 1: 概念、执行顺序
    • Part 2: POSIX Thread
    • Part 3
    • Part 4
  • C 語言: 函式呼叫*
    • 著重在計算機架構對應的支援和行為分析
  • C 語言: 遞迴呼叫*
    • 或許跟你想像中不同,Linux 核心的原始程式碼裡頭也用到遞迴函式呼叫,特別在較複雜的實作,例如檔案系統,善用遞迴可大幅縮減程式碼,但這也導致追蹤程式運作的難度大增
  • C 語言: 前置處理器應用*
    • C 語言之所以不需要時常發佈新的語言特徵又可以保持活力,前置處理器 (preprocessor) 是很重要的因素,有心者可逕行「擴充」C 語言
  • C 語言: goto 和流程控制*
    • goto 在 C 語言被某些人看做是妖魔般的存在,不過實在不用這樣看待,至少在 Linux 核心原始程式碼中,goto 是大量存在 (跟你想像中不同吧)。有時不用 goto 會寫出更可怕的程式碼
  • C 語言程式設計技巧*
  • 作業: 截止繳交日: Mar 21
  • Week3 隨堂測驗: 題目 (內含作答表單)

第 4 週: 數值系統 + 編譯器

(Mar 6, 7, 9)

  • 教材解說* (僅止於概況,請詳閱下方教材及個別的對應解說錄影)

第 5 週: Linux CPU scheduler

(Mar 13, 14, 16)

  • 教材解說* (僅止於概況,請詳閱下方教材及個別的對應解說錄影)
  • 公告:
    • 本週導入客製化作業,讓學員選擇改進前四週的作業或自訂題目 (例如貢獻程式碼到 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 週: System call + CPU Scheduler

(Mar 20, 21, 23)

  • 教材解說* (僅止於概況,請詳閱下方教材及個別的對應解說錄影)
0%