內核是操作系統中最為關鍵的部分。內核是負責接觸底層的,因此大部分都是用C語言寫的,有的甚至用匯編。IOS的核心是XNU內核,先從一些內核基本知識談起。
目錄
- 內核基礎
- 硬件
- 任務
- 并發
- 安全
- 內核架構
- 巨內核
- 微內核
- 混合內核
- XNU
- 用戶態與內核態
- 用戶態與內核態轉換機制
- 系統調用處理
內核基礎
4個角度來說明內核的作用及必要性。
硬件
所有現代操作系統都包含內核組件,內核向開發者提供各種服務。如果沒有內核,我們編寫開發程序就會陷入編寫硬件接口和操作環境的泥潭,做飯還需要自己種水稻,鉆木取火,那多麻煩啊。好了,現在我們擁有了內核,一些底層的東西我們不需要關心,我們只要使用內核API就能達成我們的目的。
任務
現代操作系統都是搶占式的多任務,允許多個任務并發執行。因此內核要滿足任務的調度要求,能夠判斷任務運行在哪一個處理器上。
并發
如果有多任務,就要考慮并發問題,內核得知道哪些設備能夠同時訪問,哪些不能同時訪問,需要提供某些措施來防止并發問題。
安全
內核還得提供安全服務,保證系統中各種資源的完整性、隱私性。任何敏感操作都是需要內核的安全審核來確保該操作的合法性。
內核架構
內核架構分為三種:巨內核、微內核、混合內核。后面單獨說XNU內核。
1.巨內核
巨內核顧名思義,就是包含所有的服務,上至內存管理,下至設備驅動,應有盡有。這是一種很流行的架構,Linux與UNIX都是采用這種架構。這種方式的內核功能實現都在同一個地址空間,同時將這段地址空間映射到每一個進程的內存中。例如在Linux中,32位操作系統可尋址的(可使用)內存空間為4GB,其中1/4都是內核。Linux程序的實例在體現為進程,每一個程序都會映射成一個或者多個進程。而每一個進程中,都有一份內核內存的拷貝。我們從用戶層面切換到內核層面的開銷就會十分小,也就是一次線程切換的開銷。
2.微內核
微內核把巨內核精簡,只包括最核心的功能(硬件訪問、調度、虛擬內存管理)。既然微內核存在,那么必有可取之處。相比巨內核,微內核有如下優點:
- 正確性(代碼少)
- 健壯性(崩潰少)
- 靈活性
雖然它有這么多優點,那為什么現在基本沒有操作系統的內核架構選用微內核呢?這主要是因為它有一個致命的性能缺點。微內核的服務程序之間通信采用消息傳遞機制(發送-排隊-執行),而在內核中,消息傳遞需要通過內存復制操作以及數次上下文切換操作來實現,這對性能是一種拖累。
3.混合內核
混合內核試圖包含前兩種內核好處。混合內核的核心部分支持底層服務,就像微內核一樣,而其他服務雖然不在該核心的“微內核”中,但是也包含在該核心中,其他服務可以調用該核心的“微內核”。混合內核相比于其他內核架構,犧牲了微內核的健壯性換來巨內核一樣的運行效率。
4.XNU內核
如圖所示XNU內核是一個混合內核,它的核心是一個叫Mach的微內核,Mach中也是消息傳遞機制,但是它使用的是指針形式傳遞,因為大部分服務都在XNU內核中,所以Mach沒有昂貴的復制操作,只用指針就可以完成消息傳遞。
用戶態與內核態
內核控制著操作系統最核心的部分,為了防止應用程序崩潰而導致的內核崩潰,內核與應用程序之間需要進行嚴格的分離。基于軟件的分離會產生巨大的開銷,因此現代的操作系統都是依靠硬件來分離。分離的結果就是用戶態與內核態。
與電腦的inter處理器不一樣,iphone手機上的處理器為ARM處理器。在ARM處理器中,提供了一個特殊的寄存器--當前程序狀態寄存器(CPSR),通過修改CPSR來改變ARM的模式。下表是ARM處理器模式:
模式 | 用途 |
---|---|
USR | 用戶模式 |
SVC | 內核模式 |
SYS | 系統模式 |
FIQ | 快速中斷請求 |
IRQ | 普通中斷請求 |
ABT | 中止模式 |
UND | 未定義模式 |
上述一共有7種模式,除了第一種用戶模式以外,其余6種都可以通過修改CPSR來切換模式。
內核態/用戶態轉換機制
用戶態轉換成內核態轉換機制有兩種類型:
- 自愿轉換:當應用程序需要調用內核服務的時候,應用程序可以通過一個預定義的硬件指令開始進入內核態的切換,換句話說這就是系統調用。
- 非自愿轉換:當發生執行異常的時候,代碼就會掛起并保留案發現場。控制權被轉交給預定義的內核態錯誤處理程序或者中斷服務程序。
在ARM中,任何非用戶態都是通過一個異常或者中斷進入的。因此系統調用是利用SVC指令通過模擬的中斷完成的。當這條指令執行的時候,CPU自動將控制權轉交給機器的陷阱向量,在陷阱向量中有一個預定義的內核指令正在等待通常是分之跳轉到某個具體處理程序的指令。
系統調用的處理
當用戶態的程序需要內核服務的時候,會發出一個系統調用,系統調用將控制權轉交給內核。在XNU中,系統調用有四種類別:
- BSD系統調用
- Mach陷阱
- 機器相關調用
- 診斷調用
四種類型的調用都差不多,它們的函數原型接受一個指向狀態快照的指針,其中狀態快照包含了處理器中所有寄存器的導出值。