從零開始寫 OS 內核 (序篇)

這是一個很早就想要作的系列,從零開始寫一個小的操做系統,算是致敬之前學校裏作的 OS 項目,也是但願能幫助到對這一塊感興趣的同窗。html

操做系統是計算機專業的核心學科,但我想即便是不少大學的 CS 本科操做系統專業課,也未必會設置這樣規模和難度的項目。我是在 CMU 讀研時修了它們的本科課程 15-410,這是課程的最大一個項目做業。對於不少計算機專業的同窗,以及非科班轉計算機的同窗,嘗試去作,哪怕是讀懂這樣一個項目,我想都是大有益處的。編程

項目預期

網上也有不少相似的很好的系列教程,我也但願個人這個系列可以稍微帶來些不同的地方,你能夠大概地有個心理預期:多線程

  • 這不是一個手把手教學的系列,有些動手的地方須要你本身實踐解決,固然我會給出個人 Git 項目地址供你參考;
  • 我不會過多地貼代碼逐行解釋,也不會過多地解釋一些課本或者手冊上的專業知識(我認爲你應該知道,或者有能力自學/查);
  • 這是一個偏實踐+原理闡釋的系列文章,我會盡量多地用圖片,而不是文字;

知識準備

爲了讀懂這個系列,你須要有足夠的專業知識準備,總的來講就是大學操做系統專業課的全部理論知識,不要求精通,但最起碼能瞭解,須要用到的時候知道怎麼去查。這裏推薦《深刻理解計算機系統》這本書,若是你的水平已經覆蓋了這本書,那麼能夠繼續了。工具

再具體一些,但願你的理論和實踐能力能夠覆蓋如下這些:操作系統

  • 紮實的 C 語言能力;
  • 還夠用的 x86 彙編能力(能夠在項目中提升);
  • 熟練使用 Linux 系統,以及 Linux 下的系統編程經驗;
  • gcc,Makefile 等工具的使用;
  • 對編譯,連接,執行代碼的原理有足夠的認識;
  • 硬件以及 OS 對內存的管理原理,尤爲是虛擬內存;
  • 程序在操做系統中的加載,執行過程,內存的使用和分佈;
  • 中斷的概念和處理;
  • 進程,線程的概念原理;
  • 多線程編程,同步與鎖的概念;

是否是看上去有點多......這的確是對你的基本要求,但仍是那句話,不要求熟練精通,只須要能」瞭解「,你能夠只有一個模糊的理論概念,薄弱的實踐基礎,能夠在項目中提升這些能力,這其實也是這個項目的終極目的所在。線程

推薦書目和教程

僅僅看我這個系列可能未必足夠,也不必定對每一個人適合,因此我推薦一些我看過的書和教程:htm

JamesM's kernel development tutorials

這個系列是很是推薦的,做者的重點把握明確,組織結構和代碼很是清晰。但這個系列項目規模偏小,沒有 boot loader 和內核成形後的線程,進程以及系統調用方面的內容,總體比較偏 Demo 和教學性質,很適合初學。教程

操做系統真相還原

這也是很推薦的一本書,與上面的系列相反,這本書從頭至尾完整地實現了一個功能比較完善的內核,規模比較大,並且做者的講解很細緻,不厭其煩,甚至我都以爲有些囉嗦,比較適合在實際項目開發中做爲參考和理論手冊查詢,而不適合從頭至尾通讀。進程

個人這個系列項目其實參考並綜合了以上二者,取了折中,把規模和難度控制在了我認爲比較合理的程度。圖片

項目目錄

在開始系列以前,咱們首先列一下項目的目錄清單,後面把這些坑一個個填上。

  • 從 BIOS 開始啓動到實模式
  • 進入保護模式
  • 加載並進入內核
  • 顯示打印
  • GDT 和 IDT,中斷處理
  • 打開虛擬內存
  • 實現堆和 malloc
  • 建立第一個內核線程
  • 多線程運行與切換
  • 進入用戶態
  • 進程的實現,加載可執行程序
  • 系統調用的實現
相關文章
相關標籤/搜索