自己做操作系統有多難 制作一個操作系統要多難



文章插圖
自己做操作系統有多難 制作一個操作系統要多難

文章插圖
先來介紹一下我自己 。我是Intel 傲騰項目開發者之一,也是《深度探索嵌入式操作系統》這本書的作者 。
我曾經為Intel做過內核層面的開發工作,也對Linux、BSD、SunOS等開源操作系統,還有Windows的NT內核很熟悉 。這十幾年來,我一直專注于操作系統內核研發 。
LMOS(基于x86平臺支持多進程、多CPU、虛擬化等技術的全64位操作系統內核)跟LMOSEM(基于ARM處理器平臺的嵌入式操作系統內核)是我獨立開發的兩套全新的操作系統內核,它們的代碼規模都達到了數十萬行,并且現在仍在更新 。
當時是基于興趣和學習的目的開始了這兩套操作系統,在這個過程中,我遇到了各種各樣的技術問題,解決了諸多疑難雜癥,總結了大量的開發操作系統的方法和經驗 。非常希望能在這個專欄與你一起交流 。
每個工程師都有必要學好操作系統嗎?
經常會有同學問我這樣一些問題:我是一個做應用層開發的工程師,有必要學習操作系統嗎?我的日常工作中,好像用不到什么深奧的操作系統內核知識,而且大學時已經學過了操作系統課程,還有必要再學嗎?
對于這些問題,我的答案當然是“有必要” 。至于理由么,請聽我慢慢為你道來 。
你是否也跟我一樣,曾經在一個數千萬行代碼的大項目中茫然失措?一次次徘徊在內存為什么會泄漏、服務進程為什么會dang掉、文件為什么打不開等一系列“基礎”問題的漩渦中?
你是否驚嘆于Nginx的高并發性?是不是感覺Golang的垃圾回收器真的很垃圾?除了這樣的感嘆,你也許還好奇過這樣一些問題:MySQL的I/O性能還能不能再提升?網絡服務為什么會掉線?Redis中經典的Reactor設計模式靠什么技術支撐?Node.js 的 I/O 模型長什么模樣……
如果你也追問過上面的這些問題,那這會兒我也差不多可以給充滿求知欲的你指一條“明路”了 。這些都將在后面的學習中,找到答案 。
為什么說操作系統很重要?
首先我們都知道,操作系統是所有軟件的基礎,所有上層軟件都要依賴于操作系統提供的各種機制,才能運行 。
而我在工作中也認識了很多技術大牛,根據我的觀察,他們的基本功往往十分扎實,這對他們的架構視野、技術成長都十分有幫助 。
如果你是后端工程師,在做高性能服務端編程的時候,內存、進程、線程、I/O相關的知識就會經常用到 。還有,在做一些前端層面的性能調優時,操作系統相關的一些知識更是必不可少 。
除了Web開發,做高性能計算超級計算機的時候,操作系統內核相關的開發能力也至關重要 。其實,即使單純的操作系統內核相關的開發能力,對于工程師來說也是繞不過的基本功 。
對于運維、測試同學,你要維護和測試的任何產品,其實是基于操作系統的 。比如給服務配置多大的內存、多大的緩存空間?怎樣根據操作系統給出的信息,判斷服務器的問題出現在哪里 。隨著你對操作系統的深入理解和掌握,你才能透過現象看本質,排查監控思路也會更開闊 。
除了工作,操作系統離我們的生活也并不遙遠,甚至可以說是息息相關 。要知道,操作系統其實不僅僅局限于手機和電腦,你的智能手表、機頂盒、路由器,甚至各種家電中都運行著各種各樣的操作系統 。
可以說,操作系統作為計算機的靈魂,眼前的工作、日常的生活,甚至這個行業未來的“詩與遠方”都離不開它 。
操作系統很難,我能學得會么?
但即使是大學時期就學過操作系統的同學,也可能會感覺學得云里霧里 。更別說非科班的一些人,難度更甚,甚至高不可攀 。那為什么我這么有信心,給你講好操作系統這門課呢?這還要從我自己的學習經歷說起 。
跟許多人一樣,我看的第一本C教程就是那本“老譚C” ??戳酥?,除了能寫出那個家喻戶曉的“hello world”程序,其它什么也干不了 。接著我又開始折騰C++、Java,結果如出一轍,還是只能寫個“hello world”程序 。
還好我有互聯網,它讓我發現了數據結構與算法,經過一番學習,后來我總算可以寫一些小功能的軟件了,但或許那根本就稱不上功能 。既然如此,我就繼續折騰,繼續學習微機原理、匯編語言這些內容 。
最后我終于發現,操作系統才是我最想寫的軟件 。我像著了魔一樣,一切操作系統、硬件層相關的書籍都找來看 。
有了這么多的“輸入”,我就想啊,既然是寫操作系統,為什么不能把這些想法用代碼實現出來,放在真正的計算機上驗證一下呢?
LMOS的雛形至此誕生 。從第一行引導代碼開始,一次又一次代碼重構,一次又一次地面對莫名的死機而絕望,倒逼我不斷改進,最終才有了現在的LMOS 。因為一個人從零開始,獨立開發操作系統這種行為有點瘋狂,我索性就用LMOS(liberty,madness,operating,system)來命名了我的操作系統 。
經過我這幾年的獨立開發,現在LMOS已經發布了8個測試版本 。先后從32位單CPU架構發展到64位多CPU架構,現在的LMOS已經是多進程、多線程、多CPU、支持虛擬內存的x86_64體系下的全64位操作系統內核,代碼量已經有10萬多行了 。
后來,我又沒忍住自己的好奇心,寫了個嵌入式操作系統——LMOSEM 。由于有了先前的功底,加上ARM體系很簡單,所以我再學習和實現嵌入式操作系統時,就感覺駕輕就熟了 。
經過跋山涉水,我再回頭來看,很容易就發現了為什么操作系統很難學 。
操作系統需要你有大量的知識儲備,但是現在大多的課程、學習資料,往往都是根據目前已有的一些操作系統,做局部解讀 。所以,我們學的時候,前后的知識是無法串聯在一起的 。結果就會越看越迷惑,不去查吧,看不懂,再去搜索又加重了學習負擔,最后只能遺憾放棄 。
那怎樣學習操作系統才是最高效的呢?理論基礎是要補充的,但相對來說,實踐更為重要 。我認為,千里之行還得始于足下 。
所以,通過這個專欄,我會帶你從無到有實現一個自己的操作系統 。
我會使用大量的插圖代碼和風趣幽默的段子,來幫助你更好地理解操作系統內核的本質 。同時在介紹每個內核組件實現時,都會先給你說明白為什么,帶著你基于設計理解去動手實現;然后,再給你詳細描述Linux內核對應的實現,做前后對比 。這樣既能讓你邊學邊練,又能幫你從“上帝視角”審視Linux內核 。
我們課程怎么安排的?
操作系統作為計算機王國的權力中樞,我們的課程就是講解如何實現它 。
為此,我們將從了解計算機王國的資源開始,如CPU、MMU、內存和Cache 。其次要為這個權力中樞設計基本法,即各種同步機制,如信號量與自旋鎖 。接著進行奪權,從固件程序的手中搶過計算機并進行初始化,其中包含初始化CPU、內存、中斷、顯示等 。
然后,開始建設中樞的各級部門,它們分別是內存管理部門、進程管理部門、I/O管理部門、文件管理部門、通信管理部門 。最后將這些部門組合在一起,就形成了計算機王國的權力中樞——操作系統 。
我們的課程就是按照上述邏輯,依次為你講解這些部門的實現過程和細節 。每節課都配有可以工作的代碼,讓你能跟著課程一步步實現 。你也可以直接使用我提供的代碼一步步調試,直到最終實現一個基于x86平臺的64位多進程的操作系統——Cosmos 。
你能獲得什么?
走這樣一條“明路”,一步一個腳印,最終你會到達這樣一個目的地:擁有一個屬于自己的操作系統內核,同時收獲對Linux內核更深入的理解 。
學完這門課,你會明顯提升操作系統架構設計能力,并且可以學會系統級別的軟件編程技巧 。我相信,這對你拓展技術深度和廣度是大有裨益的 。之后你在日常開發中遇到問題的時候,就可以嘗試用更多維度的能力去解決問題了 。
同時,由于操作系統內核是有核心競爭力的高技術含量軟件,這能給你職業生涯的成長帶來長遠的幫助 。如今,在任何一家中大型互聯網公司都使用大量的Linux服務器 。
操作系統相關的內容,已經成為你漲薪、晉升的必考項,比如 Linux 內核相關的技術,中斷、I/O、網絡、多線程、并發、性能、內存管理、系統穩定性、文件系統、容器和虛擬化等等,這些核心知識都來源于操作系統 。
而跳出個人,從大局觀出發的話,計算機系統作為20世紀以來人類最偉大的發明之一,已經深入人們生活的方方面面,而計算機作為國家級戰略基礎軟件,卻受制于人,這關系到整個國家的信息安全,也關系到互聯網信息行業以及其它相關基礎行業的前途和未來 。
【自己做操作系統有多難 制作一個操作系統要多難】而要改變這一困局,就要從培養技術人才開始 。對于我們工程師來說,樹高葉茂,系于根深,只有不斷升級自己的認知,才能讓你的技術之路行穩致遠 。
下面,我給出一個簡化的操作系統知識體系圖,也是后面課程涉及到的所有知識點 。盡管圖中只是最簡短的一些詞匯,但隨著課程的展開,你會發現圖中的每一小塊,都猶如一片汪洋 。
現在讓我們一起帶著好奇,帶著夢想,向星辰大海進發!