一起鑽進 Linux 核心看個究竟
核心看不見摸不著,而對於這類東西,我們經常無從下手。本文就以淺顯易懂的語言,帶你鑽進 Linux 核心,看它到底長啥樣。 |
Linux 核心,這個經常聽見,卻不不知道它具體是幹嘛的東西,是不是覺得非常神秘?
Linux 核心看不見摸不著,而對於這類東西,我們經常無從下手。本文就以淺顯易懂的語言,帶你鑽進 Linux 核心,看它到底長啥樣。
核心是 Linux 作業系統的核心元件,它向上連線應用程式,向下直接與硬體打交道。其程式碼主要由 C 語言及少量組合語言寫成,並且它可以適配多種多樣不同的硬體架構。
核心併發執行著一系列的程式,並管理著硬體的各種資源。具體來講,因為系統的資源有限,核心就為各個程式分配著諸如 CPU 時間、記憶體空間、網路連線等各方面的資源。
下圖是一個典型的 Linux 作業系統架構圖。
Linux 作業系統主要分成兩部分:
- 使用者空間
- 核心空間
所有的使用者應用程式都是在使用者空間執行,它們不能直接訪問記憶體等硬體資源,而是間接透過核心來訪問。GNU C 庫(glibc)提供了從使用者空間切換至核心空間的機制。
核心直接管理著系統的 CPU、記憶體、輸入輸出裝置、網路裝置和其它的外圍裝置,它被分為不同模組來管理系統的不同操作,比如:檔案管理,記憶體管理,程式管理等等。
使用者空間的應用程式可以透過呼叫核心提供的 API 來訪問硬體資源。比如,對於檔案操作,我們可以呼叫 open() ,read() ,write() 等介面。
核心直接管理著硬體,又與硬體相互獨立,它可以透過簡單配置然後執行在 Intel,ARM ,Atemel 等晶片架構上。
根據核心的核心功能,Linux 核心提出了 5 個子系統,分別為:系統呼叫、程式管理、記憶體管理、檔案系統、網路管理,如下圖示:
系統呼叫介面。程式排程子系統透過系統呼叫介面,將需要提供給使用者空間的介面開放出去,同時遮蔽掉不需要使用者空間程式關心的細節。
SCI 實際上是一個非常有用的函式呼叫多路複用和多路分解服務。在 ./linux/kernel 中您可以找到 SCI 的實現,並在 ./linux/arch 中找到依賴於體系結構的部分。
使用者空間有那麼多程式,如何讓他們有條不紊地進行著正是程式管理所要做的事。每個程式都要使用到 CPU 資源(如 CPU ,記憶體),但 CPU 資源畢竟有限,不可能讓某個程式一進獨佔著資源。
因此,程式管理就充當著管理員的角色,它排程著所有的程式,當需要選擇下一程式執行時,會由排程演算法來選擇最需要執行的程式。如果某個程式在等待其它硬體資源,則它就會被掛起。
因此,透過一系列的排程演算法,核心儘可能地公平地讓各個程式使用到 CPU 資源。
記憶體管理主要提供對記憶體資源的訪問控制,以便讓各個程式可以安全地共享機器的記憶體資源。它提供了實體記憶體與虛擬記憶體的一種對映關係,因而不同的程式可以使用相同的虛擬記憶體,而這些相同的虛擬記憶體,可以對映到不同的實體記憶體上。這個對映關係主要由 MMU 來完成。
另外,記憶體管理會提供虛擬記憶體的機制,該機制可以讓程式使用多於系統可用的記憶體,不用的記憶體會透過檔案系統儲存在外部非易失儲存器中,需要使用的時候,再取回到記憶體中。
核心隱藏了不同功能的外部裝置,例如硬碟、輸入輸出裝置、顯示裝置等等的具體細節,將它們抽象為可以透過統一的檔案操作介面(open、close、read、write等)來訪問,也就是我們所熟知的「一切皆檔案」。
隨著計算機技術的發展,歷史上出現了多種檔案系統,比如:FAT、FAT32、NTFS、EXT2、EXT3 等等。為了相容這些檔案系統,核心將它們抽象為統一的表現形式,這就是虛擬檔案系統的概念。
虛擬檔案系統可分為邏輯檔案系統和裝置驅動程式。邏輯檔案系統指 Linux 所支援的檔案系統,如ext2, fat等,裝置驅動程式指為每一種硬體控制器所編寫的裝置驅動程式模組。
網路子系統在 Linux 核心中主要負責管理各種網路裝置,並實現各種網路協議棧,最終實現透過網路連線其它系統的功能。
網路介面提供了對各種網路標準協議的存取和各種網路硬體的支援。網路介面可分為網路協議和網路驅動程式兩部分。網路協議部分負責實現每一種可能的網路傳輸協議,網路裝置驅動程式負責與硬體裝置進行通訊,每一種可能的硬體裝置都有相應的裝置驅動程式。
以上就是 Linux 核心的一些很基礎的知識,對於核心的學習還有非常多的內容,決不是一篇文章能夠寫完的。所以,對於核心的學習,需要多看書,多看影片,並自己動手去實踐,才能真正掌握。
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2700249/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HTTP 【值得你看個究竟】HTTP
- 透過 Linux 核心看無鎖程式設計Linux程式設計
- 一起來看MyBatis(一)MyBatis
- 四大亮點帶你看 Linux 核心 5.6Linux
- 避免用Apache Beanutils進行屬性的copy。why?讓我們一起一探究竟ApacheBean
- 一起看 I/O | Google TV 和 Android TV OS 的最新進展GoAndroid
- 舉個栗子看如何做MySQL 核心深度優化MySql優化
- 舉個例子看如何做MySQL 核心深度優化MySql優化
- 兩個linux核心rootkit–導語Linux
- 鑽鑽 “單例” 的牛角尖單例
- Java進階(六)從ConcurrentHashMap的演進看Java多執行緒核心技術JavaHashMap執行緒
- 對 Linux 核心進行壓力測試(轉)Linux
- 超連結鑽取之圖表鑽取、單元格資料鑽取
- 關於vim看linux 核心原始碼時的程式碼補全Linux原始碼
- 創瑞豐:"增速換擋"看鑽石分銷智慧時代的華麗轉身
- 04_Linux下把驅動編譯進核心Linux編譯
- Linux核心之 核心同步Linux
- 一起看 I/O | Jetpack 元件的新特性Jetpack元件
- 一起看 I/O | Flutter 3 更新詳解Flutter
- 一起看 I/O | Google Play 更新一覽Go
- 一起看 I/O | Flutter 3 正式釋出!Flutter
- 認識linux核心(linux核心的作用)Linux
- Linux系統核心正式進入5.0版本時代Linux
- 成為Linux核心高手的四個方法Linux
- Linux核心是如何建立一個新程式的?Linux
- Linux核心建立一個程式的過程分析Linux
- 用SolidWorks畫一個鑽頭,新手學起來Solid
- 一起看 I/O | Android Auto 更新一覽Android
- Express進階:從一個例子看路由分組機制Express路由
- 資料看百度財報究竟哪裡行哪裡不行
- [譯] 你究竟能用 Python 做什麼? 我們一起來看下 Python 的 3 個主要應用方向Python
- 微軟在 Windows 10 中搞了個真正的 Linux 核心微軟WindowsLinux
- Linux 大爆炸:一個核心,無數發行版Linux
- Linux 核心版本號命名四個不同的階段Linux
- ARM linux核心啟動時幾個關鍵地址Linux
- 初識Linux核心-DIY核心模組Linux
- Linux 核心剖析Linux
- Linux核心模組Linux