--- title: 系統程式設計筆記目錄 --- # 系統程式設計筆記目錄 ## 前言 這份資源一開始是以臺灣大學資工系 2018 年的 [系統程式設計](https://systemprogrammingatntu.github.io) 錄影為主要架構整理的 Linux 系統程式課程資源。會想整理是因為之前有旁聽過這門課(雖然不是 2018 年的),但並沒有整理出完整的筆記,覺得有點可惜。因此就做出了這個東西,也順便當作複習。 雖然一開始是作為「補上該課程的筆記」,但之後隨著發現的資料越來越多,也逐漸加入了原先的課程中沒有提到的主題 (比如說 namespace 與 cgroup v2) ; 或是在既有的主題中,加入一些具代表性的人物(如:TLPI 的作者 Michael Kerrisk 的)的演講。所以其實已經是不算是為了單一課程而整理的資源了。 後來陸續加入的資源包含: 1. [Michael Kerrisk](https://man7.org/index.html):Michael Kerrisk 是 `man-pages` 的維護者,同時也是著名的 *The Linux Programming Interface* 一書的作者。他個人開課時的訓練教材有一部分公開在他的 [個人網站](https://man7.org/training/index.html) 上。除此之外,他的 YouTube 頻道也有一個[播放清單](https://www.youtube.com/playlist?list=PLPEqSODQbwFjVfdvqOz_ZOOto0SnjtPYx)列出它歷年的演講錄影。 2. 中正大學羅習五教授的[個人頻道](https://www.youtube.com/c/羅習五),當中包含更多結合 Linux 與傳統作業系統課程的內容。 3. 任教於滑鐵盧大學的 [Jeff Zarnett](https://www.youtube.com/c/JeffZarnett) 個人頻道內容。這門課程中除了系統程式之外,也介紹比較多傳統作業系統課程會介紹的主題。 除此之外,未放進去,但非常建議參考的資源包含: 1. [.GUTS](https://www.youtube.com/c/GUTS4tech):「你所不知道的 C 語言」系列(應該沒有人不知道這個)。 2. [鳥哥的 Linux 私房菜](http://linux.vbird.org/aboutmysite.php) 另外要注意的是:這個課程的影片標題與內容有時候未必相符合。在編排上會以影片的實際內容作為分類依據(而非標題)。 ## 編排順序 這個編排順序中: 1. 由上至下:大致對應課程大綱上的時序。 2. 目錄中的標題與編號:每一層大標題對應 [*The Linux Programming Interface*](https://man7.org/tlpi/) 一書中的一章(但往下一層的標題則否),這是為了方便與書中對照。 3. 有一些進較新的主題(比如說 cgroup 與 namespaces)在該書中並沒有提及; 或者是一些比較學術上的討論(如:某些經典的同步問題)則以括號包圍。 4. ~~會保留後者是因為有一絲期望考研究所的人會看看這個東西來理解那些作業系統補習班教材的資訊跟現實中的對比。~~ ## 追蹤工具 Brendan Gregg 的[個人部落格](https://www.brendangregg.com) 有很多效能分析的[小抄](https://www.brendangregg.com/linuxperf.html)。這些工具的考量及實作多半反映了作業系統的某些面向,頗值得參考: ![](https://www.brendangregg.com/Perf/linux_observability_tools.png) 除此之外,其中一類很有代表性的是以 [`bpftrace`](https://github.com/iovisor/bpftrace) 寫成的工具。這些工具的實作中多半是對核心中的某些函式使用 [kprobe](https://www.kernel.org/doc/html/latest/trace/kprobes.html),或是使用核心中特定的 [tracepoint](https://youtu.be/mlxqpNvfvEQ)。所以可能可以從這裡開始稍微對核心中的某些函式有些印象: ![](https://www.brendangregg.com/Perf/bpf_book_tools.png) ## 其它參考資料 1. [`man`](https://man7.org/linux/man-pages/index.html):主要是 [`man 2`](https://man7.org/linux/man-pages/dir_section_2.html) 與 [`man 3`](https://man7.org/linux/man-pages/dir_section_3.html)。 的命令列工具。 2. [*The Linux Programming Interface*](https://man7.org/tlpi/):經典的 Linux 系統程式設計書籍。作者 *Michael Kerrisk* 是 `man-pages` 的維護者 3. [*Bootlin* 的 *Elixir Cross Referencer*](https://elixir.bootlin.com/linux/latest/source):Linux 的原始程式碼。 {%hackmd @0xff07/sp %}