歡迎光臨
每天分享高質量文章

從硬體到內核,聊聊Linux系統的層次結構

來自微信公眾號:陳樹義

相信組裝過電腦的朋友都知道,我們的電腦最主要的幾個零件是:CPU、記憶體、硬碟。但我們實際使用的時候,我們並不會主動跟硬體打交道,而是和顯示器上顯示的操作系統打交道。

那麼問題來了,操作系統到底是怎麼操作CPU、記憶體、硬碟,讓其實現我們的功能的呢?操作系統與硬體之間的層級結構是怎樣的?

這裡的操作系統,我們預設說的是 Linux 操作系統。

瞭解過 Linux 的朋友會知道,其實 Linux 系統的整個系統結構如下麵所示:

它由內核、系統呼叫、Shell、庫函式、應用幾個部分構成。看著是不是有些暈頭轉向叻,沒關係。下麵我將用極其簡單的口水文跟你介紹這幾個層級,讓你看完之後印象深刻。

硬體的好基友:內核

緊挨著硬體的是內核,只有內核才能操作硬體,一般我們也叫它內核空間。

大學學過模擬電路和數字電路的同學都知道,計算機里任何的運算到最後都是 1 0 數字,最終通過數字電路的來進行運算。例如我們要計算一個加法(4+5),對於我們來說就是簡單地一個運算,但對於計算機來說,它並不知道 4 是什麼,5 是什麼,它只知道 1 和 0。並且我們一步就可以算出來的加法,計算機可能要經過無數次運算。一個簡單的加法尚且如此,更不用說更加複雜的演算法運算了。

舉上面這個例子主要是想表達硬體操作的複雜性,以及機器碼對於人類的不友好。所以為了對外屏蔽這些硬體細節,就有了內核空間這一層東西。

內核空間是一個虛擬的空間,其直接與硬體打交道。除了內核空間,其他任何模塊都無法與硬體直接接觸,都需要通過內核空間來操作硬體。所以說內核空間是硬體的好基友,任何人要見它,都得經過我。

這麼一個設置也有一個好處,那就是保證了硬體的穩定。試想一下,如果誰都能操作硬體。你弄一下,我弄一下,那麼硬體估計就被弄殘了。

系統的基石:系統呼叫

挨著內核兄弟的就是系統呼叫了,系統呼叫是操作系統的最小單位,任何操作都是由一個個系統呼叫組成的。這就像我們的漢字,無論這個字多複雜,它都是由點、橫、撇等組成。而系統呼叫之於操作系統,就像是筆畫之於漢字。

集大成者:庫函式

如果說系統呼叫是筆畫,那麼庫函式就是漢字的偏旁了。我們記漢字不可能記住它的所有筆畫,但我們能記住它由哪一些偏旁組成。因此,在 Linux 操作系統中也類似,設計者一些常用的操作組合起來,編程庫函式。

例如一個簡單的變數記憶體分配操作,就需要動用多個系統呼叫。如果沒有庫函式,我們就得每次都去寫多次系統呼叫,但有了庫函式我們直接用 malloc() 庫函式就可以實現這個功能。

所以說,庫函式是集大成者,是系統呼叫的模塊化體現。

效率利器:Shell

我們除了使用庫函式去實現常用的操作之外,還可以使用 Shell 去實現。Shell 其實與庫函式的功能類似,他們都將一些常用的系統呼叫組裝起來,方便後續呼叫,可以說是模塊化的提現。

但是 Shell 與庫函式的定位還是略有不同的。庫函式更多時候是作為開發 API 來使用,應用通過呼叫 API 來實現各種功能。而 Shell 則更多是作為運維的工具,能通過 Shell 腳本實現更多複雜的功能。

Shell 不僅僅是操作系統中的一個層次,它還指某種特定的語言規範,通過這種語言規範,我們可以組裝成 Shell 腳本,從而實現複雜的功能。牛逼的運維都會使用 Shell 腳本來自動化處理業務,從而極大地提高工作效率。

友好使者:應用

在操作系統最外層就是應用了。在這一層我們可以呼叫 Shell、庫函式、系統呼叫這幾個層次的東西,從而方便我們的開發。我們常用的各種辦公軟體、圖像處理軟體都是這一層次的東西。

如果要選一個最人類最友好的使者,那麼非應用這個小兄弟不可了。經歷了重重難關,從硬體到內核,再從內核到庫函式,最後到應用這一層才能看得比較舒服,我們也才能夠更高效地使用。

總結

許多工作了十幾年的工程師很多時候都搞不清楚操作系統的層級關係,更甚者連內核是什麼都不知道。但樹義認為,瞭解操作系統的層級結構是很重要的知識點,可以為我們深入理解應用層面的知識打下基礎。

例如當我們學到 Netty 的時候,我們會學到 Unix 網絡 IO 模型,這時候就會涉及到資料是如何從檔案或者網絡另一端讀取到本機的記憶體中的。此時,就會涉及到內核空間以及用戶空間的知識。這時如果你不理解內核是什麼,那麼自然也就無法理解 Unix 網絡 IO 模型這個知識點了。

好了,今天的文章就到這裡。如果你喜歡的話,麻煩轉發讓更多的朋友看到。一個人學習可以走得很快,但一群人可以走得更遠。


●編號600,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

演算法與資料結構

更多推薦18個技術類公眾微信

涵蓋:程式人生、演算法與資料結構、黑客技術與網絡安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

赞(0)

分享創造快樂