先來介紹一下我自己。我是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世紀以來人類最偉大的發明之一,已經深入人們生活的方方面面,而計算機作為國家級戰略基礎軟體,卻受制於人,這關係到整個國家的信息安全,也關係到互聯網信息行業以及其它相關基礎行業的前途和未來。
而要改變這一困局,就要從培養技術人才開始。對於我們工程師來說,樹高葉茂,繫於根深,只有不斷升級自己的認知,才能讓你的技術之路行穩致遠。
下面,我給出一個簡化的操作系統知識體系圖,也是後面課程涉及到的所有知識點。儘管圖中只是最簡短的一些辭彙,但隨著課程的展開,你會發現圖中的每一小塊,都猶如一片汪洋。

現在讓我們一起帶著好奇,帶著夢想,向星辰大海進發!
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/221645.html
微信掃一掃
支付寶掃一掃