iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 1
2
自我挑戰組

Linux Inside - Synchronization & Interrupt系列 第 1

Introduction

緣起

這是我第二次參加鐵人賽,去年訂了個題目「你所不知道的 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 的幾個部份發想了一些可以研究的方向:

  • Memory Model
    碩士論文是就跟快取有點關係,到底要不要研究看看 OS 如何管理記憶體呢
  • File system
    寫一個檔案系統,接上 VFS(Virtual File System),自己刻一個檔案系統感覺蠻酷的~
  • Interrupt
    寫一個 Interrupt handler!?搞不好可以自己創造一些很廢的 Interrupt,比如:把 cowsay 這種指令寫成 Interrupt ......
  • Synchronization
    對各種同步機制有所認識,我對平行化程式一直都不是很在行,但每天用的電腦 CPU 都是多核心的@@

我選擇了 Synchronization 跟 Interrupt,單純依我當時的心情決定,整個章節安排會依循 Linux Inside 的設計,比較會像是閱讀這份資料的筆記,因為 Linux Inside 這份教學都寫得太過簡單,比如說: Inline Assembly 如何閱讀阿、還是 Memory Barrier 的應用場景什麼的,這種在 Linux Kernel 中大量使用到的部份,並沒有過多解釋

Synchronization 的介紹,會如下這樣安排,從 Lock 一路介紹到 Lock-Free 的設計,也會搭配一些實作,比如說:「什麼場合適合使用 Spinlock、Semaphore、Mutex?各自使用起來可能有什麼問題呢?亂用的話又會怎樣?」如果很閒的話,可能還會研究「哪些專案中使用了什麼架構?」

  • Spinlock
  • MCS spinlock(Queued spinlock 我有點看不懂實作上整麼跟整體接合起來,所以就先)
  • Semaphore
  • Mutex
  • Reader/Writer semaphore
  • Seqlock
  • RCU(Read, Copy, Update)
  • etc.

Interrupt 的部份,我還沒有預習到那邊,還不知道要怎麼安排

先備知識 & 學習資源

先備知識

  • C language
  • Assembly language
    Linux Kernel 中大量使用到 C、Assembly,所以這兩個語言一定要看得懂,文中使用到的組語多為 x86 系列的
  • OS 一知半解的理論知識
    不需要到很懂 OS ,就 ... 至少聽過這個機制就好啦,不然忽然閱讀程式碼也是很奇怪,舉例來說:在看 Synchronization 前,至少也要知道 Race Condition 是什麼吧

學習資源

  • OS 基礎知識

  • Linux

    • jServ 老師 核心設計講座
      這份教材嘛,覺得有點太過困難啦,不過我還是有大量參考 ...... 想學習 Linux 的話,可以沒事就聽一下老師的 Youtube 課程

      閱讀 jServ 老師的教材時,沒有什麼順序性,因為老師每次都會把相關的知識,又介紹一遍,所以可以挑自己有興趣的主題直接看就好,沒有一定要照表操課,只是會覺得 ... 不管什麼章節最後都會全部混在一起==

    • 圖解 Linux 核心工作原理
      對於不想要看程式碼的人來說,這是一本難得的好書

    • Linux Inside - Synchronization primitives(中文翻譯)
      很棒的一份教材,也有中文翻譯,但很多時候呢 ...... 看得看不懂跟語言沒有關係 ......


下一篇
Spinlock & MCS Lock
系列文
Linux Inside - Synchronization & Interrupt18

尚未有邦友留言

立即登入留言