這是我第二次參加鐵人賽,去年訂了個題目「你所不知道的 C 語言」,就直接懶了,不寫了,因為覺得好困難~~
但是今年真的要畢業了,準備要找工作,根據自己的面試經驗,參雜許多同學的面試經驗,題目都與 OS 有蠻大的關係,自己對 OS 也不是那麼熟悉,想找個機會逼迫自己重新學習 OS
那麼 ... OS 又大又雜,該如何學起?最開始的時候,我打算先複習大學時期的教科書「恐龍書」,不過 ... 我的恐龍書泡水泡爛了,一堆頁面都黏在一起,但 ... 我覺得還是需要有個教科書才行,最後在網路上找了一本來看 The MINIX Book - Operating Systems Design and Implementation (3rd Edition)
MINIX Book 這是一本含有大量實作的書,是有實做出整個 OS 的一本教科書,他的系統是 Micro-Kernel 的架構,也就是 Kernel 中只有最基本的部份啦,與我們要介紹的 Linux Kernel 架構相比有些差別,Anyway 我也沒有仔細看實作的程式碼,主要只是想藉此複習 OS 各個部份的設計理念
那複習完之後,總覺得還是對 OS 一知半解耶,要找一些實際上的程式碼來看才行!!該回去看 MINIX 的程式碼嗎?還是該研究 Linux 或 Windows?最後決定研究 Linux 好了,因為學習資源比其他兩個豐富很多~~
BTW 最開始的時候,我選擇的練習其實是 「Build a simple os from scratch」,實際上自己也花了好多天跑教學,內容大體就是把 x86/ARM 的 Bootloader 都研究看看怎麼寫,真的花了非常巨大的時間在了解特定的硬體架構,以及各種歷史淵源,都還沒走到實務上的應用,就已經覺得好累== 總之,這題目有點太困難了,還是不要這麼好高騖遠吧
如果對寫一個 OS 有興趣的朋友,這份專案 ian910297/simple-os 是我那十幾天研究的一些筆記,筆記連結在 README 中
那 Linux 該如何學習呢?他更新迭代的速度非常快,絕對比你每天看的速度還快,所以說呢,我們不可能閱讀完全不的程式碼?也不可能學習每個部份,那我針對 OS 的幾個部份發想了一些可以研究的方向:
cowsay
這種指令寫成 Interrupt ......我選擇了 Synchronization 跟 Interrupt,單純依我當時的心情決定,整個章節安排會依循 Linux Inside 的設計,比較會像是閱讀這份資料的筆記,因為 Linux Inside 這份教學都寫得太過簡單,比如說: Inline Assembly 如何閱讀阿、還是 Memory Barrier 的應用場景什麼的,這種在 Linux Kernel 中大量使用到的部份,並沒有過多解釋
Synchronization 的介紹,會如下這樣安排,從 Lock 一路介紹到 Lock-Free 的設計,也會搭配一些實作,比如說:「什麼場合適合使用 Spinlock、Semaphore、Mutex?各自使用起來可能有什麼問題呢?亂用的話又會怎樣?」如果很閒的話,可能還會研究「哪些專案中使用了什麼架構?」
Interrupt 的部份,我還沒有預習到那邊,還不知道要怎麼安排
先備知識
學習資源
jServ 老師 核心設計講座
這份教材嘛,覺得有點太過困難啦,不過我還是有大量參考 ...... 想學習 Linux 的話,可以沒事就聽一下老師的 Youtube 課程
閱讀 jServ 老師的教材時,沒有什麼順序性,因為老師每次都會把相關的知識,又介紹一遍,所以可以挑自己有興趣的主題直接看就好,沒有一定要照表操課,只是會覺得 ... 不管什麼章節最後都會全部混在一起==
圖解 Linux 核心工作原理
對於不想要看程式碼的人來說,這是一本難得的好書
Linux Inside - Synchronization primitives(中文翻譯)
很棒的一份教材,也有中文翻譯,但很多時候呢 ...... 看得看不懂跟語言沒有關係 ......