內(nèi)核是操作系統(tǒng)中最為關(guān)鍵的部分。內(nèi)核是負(fù)責(zé)接觸底層的,因此大部分都是用C語言寫的矢赁,有的甚至用匯編。IOS的核心是XNU內(nèi)核贬丛,先從一些內(nèi)核基本知識(shí)談起撩银。
目錄
- 內(nèi)核基礎(chǔ)
- 硬件
- 任務(wù)
- 并發(fā)
- 安全
- 內(nèi)核架構(gòu)
- 巨內(nèi)核
- 微內(nèi)核
- 混合內(nèi)核
- XNU
- 用戶態(tài)與內(nèi)核態(tài)
- 用戶態(tài)與內(nèi)核態(tài)轉(zhuǎn)換機(jī)制
- 系統(tǒng)調(diào)用處理
內(nèi)核基礎(chǔ)
4個(gè)角度來說明內(nèi)核的作用及必要性。
硬件
所有現(xiàn)代操作系統(tǒng)都包含內(nèi)核組件豺憔,內(nèi)核向開發(fā)者提供各種服務(wù)额获。如果沒有內(nèi)核,我們編寫開發(fā)程序就會(huì)陷入編寫硬件接口和操作環(huán)境的泥潭恭应,做飯還需要自己種水稻抄邀,鉆木取火,那多麻煩啊昼榛。好了境肾,現(xiàn)在我們擁有了內(nèi)核,一些底層的東西我們不需要關(guān)心胆屿,我們只要使用內(nèi)核API就能達(dá)成我們的目的奥喻。
任務(wù)
現(xiàn)代操作系統(tǒng)都是搶占式的多任務(wù),允許多個(gè)任務(wù)并發(fā)執(zhí)行非迹。因此內(nèi)核要滿足任務(wù)的調(diào)度要求环鲤,能夠判斷任務(wù)運(yùn)行在哪一個(gè)處理器上。
并發(fā)
如果有多任務(wù)憎兽,就要考慮并發(fā)問題冷离,內(nèi)核得知道哪些設(shè)備能夠同時(shí)訪問,哪些不能同時(shí)訪問纯命,需要提供某些措施來防止并發(fā)問題西剥。
安全
內(nèi)核還得提供安全服務(wù),保證系統(tǒng)中各種資源的完整性扎附、隱私性蔫耽。任何敏感操作都是需要內(nèi)核的安全審核來確保該操作的合法性。
內(nèi)核架構(gòu)
內(nèi)核架構(gòu)分為三種:巨內(nèi)核留夜、微內(nèi)核匙铡、混合內(nèi)核。后面單獨(dú)說XNU內(nèi)核碍粥。
1.巨內(nèi)核
巨內(nèi)核顧名思義鳖眼,就是包含所有的服務(wù),上至內(nèi)存管理嚼摩,下至設(shè)備驅(qū)動(dòng)钦讳,應(yīng)有盡有矿瘦。這是一種很流行的架構(gòu),Linux與UNIX都是采用這種架構(gòu)愿卒。這種方式的內(nèi)核功能實(shí)現(xiàn)都在同一個(gè)地址空間缚去,同時(shí)將這段地址空間映射到每一個(gè)進(jìn)程的內(nèi)存中。例如在Linux中琼开,32位操作系統(tǒng)可尋址的(可使用)內(nèi)存空間為4GB易结,其中1/4都是內(nèi)核。Linux程序的實(shí)例在體現(xiàn)為進(jìn)程柜候,每一個(gè)程序都會(huì)映射成一個(gè)或者多個(gè)進(jìn)程搞动。而每一個(gè)進(jìn)程中,都有一份內(nèi)核內(nèi)存的拷貝渣刷。我們從用戶層面切換到內(nèi)核層面的開銷就會(huì)十分小鹦肿,也就是一次線程切換的開銷。
2.微內(nèi)核
微內(nèi)核把巨內(nèi)核精簡(jiǎn)辅柴,只包括最核心的功能(硬件訪問箩溃、調(diào)度、虛擬內(nèi)存管理)碌识。既然微內(nèi)核存在碾篡,那么必有可取之處。相比巨內(nèi)核筏餐,微內(nèi)核有如下優(yōu)點(diǎn):
- 正確性(代碼少)
- 健壯性(崩潰少)
- 靈活性
雖然它有這么多優(yōu)點(diǎn)开泽,那為什么現(xiàn)在基本沒有操作系統(tǒng)的內(nèi)核架構(gòu)選用微內(nèi)核呢?這主要是因?yàn)樗幸粋€(gè)致命的性能缺點(diǎn)魁瞪。微內(nèi)核的服務(wù)程序之間通信采用消息傳遞機(jī)制(發(fā)送-排隊(duì)-執(zhí)行)穆律,而在內(nèi)核中,消息傳遞需要通過內(nèi)存復(fù)制操作以及數(shù)次上下文切換操作來實(shí)現(xiàn)导俘,這對(duì)性能是一種拖累峦耘。
3.混合內(nèi)核
混合內(nèi)核試圖包含前兩種內(nèi)核好處÷帽。混合內(nèi)核的核心部分支持底層服務(wù)辅髓,就像微內(nèi)核一樣,而其他服務(wù)雖然不在該核心的“微內(nèi)核”中少梁,但是也包含在該核心中洛口,其他服務(wù)可以調(diào)用該核心的“微內(nèi)核”】Γ混合內(nèi)核相比于其他內(nèi)核架構(gòu)第焰,犧牲了微內(nèi)核的健壯性換來巨內(nèi)核一樣的運(yùn)行效率。
4.XNU內(nèi)核
如圖所示XNU內(nèi)核是一個(gè)混合內(nèi)核妨马,它的核心是一個(gè)叫Mach的微內(nèi)核挺举,Mach中也是消息傳遞機(jī)制杀赢,但是它使用的是指針形式傳遞,因?yàn)榇蟛糠址?wù)都在XNU內(nèi)核中湘纵,所以Mach沒有昂貴的復(fù)制操作脂崔,只用指針就可以完成消息傳遞。
用戶態(tài)與內(nèi)核態(tài)
內(nèi)核控制著操作系統(tǒng)最核心的部分瞻佛,為了防止應(yīng)用程序崩潰而導(dǎo)致的內(nèi)核崩潰脱篙,內(nèi)核與應(yīng)用程序之間需要進(jìn)行嚴(yán)格的分離∩吮基于軟件的分離會(huì)產(chǎn)生巨大的開銷,因此現(xiàn)代的操作系統(tǒng)都是依靠硬件來分離文搂。分離的結(jié)果就是用戶態(tài)與內(nèi)核態(tài)适刀。
與電腦的inter處理器不一樣,iphone手機(jī)上的處理器為ARM處理器煤蹭。在ARM處理器中笔喉,提供了一個(gè)特殊的寄存器--當(dāng)前程序狀態(tài)寄存器(CPSR),通過修改CPSR來改變ARM的模式。下表是ARM處理器模式:
模式 | 用途 |
---|---|
USR | 用戶模式 |
SVC | 內(nèi)核模式 |
SYS | 系統(tǒng)模式 |
FIQ | 快速中斷請(qǐng)求 |
IRQ | 普通中斷請(qǐng)求 |
ABT | 中止模式 |
UND | 未定義模式 |
上述一共有7種模式硝皂,除了第一種用戶模式以外常挚,其余6種都可以通過修改CPSR來切換模式。
內(nèi)核態(tài)/用戶態(tài)轉(zhuǎn)換機(jī)制
用戶態(tài)轉(zhuǎn)換成內(nèi)核態(tài)轉(zhuǎn)換機(jī)制有兩種類型:
- 自愿轉(zhuǎn)換:當(dāng)應(yīng)用程序需要調(diào)用內(nèi)核服務(wù)的時(shí)候稽物,應(yīng)用程序可以通過一個(gè)預(yù)定義的硬件指令開始進(jìn)入內(nèi)核態(tài)的切換奄毡,換句話說這就是系統(tǒng)調(diào)用。
- 非自愿轉(zhuǎn)換:當(dāng)發(fā)生執(zhí)行異常的時(shí)候贝或,代碼就會(huì)掛起并保留案發(fā)現(xiàn)場(chǎng)吼过。控制權(quán)被轉(zhuǎn)交給預(yù)定義的內(nèi)核態(tài)錯(cuò)誤處理程序或者中斷服務(wù)程序咪奖。
在ARM中盗忱,任何非用戶態(tài)都是通過一個(gè)異常或者中斷進(jìn)入的羊赵。因此系統(tǒng)調(diào)用是利用SVC指令通過模擬的中斷完成的趟佃。當(dāng)這條指令執(zhí)行的時(shí)候,CPU自動(dòng)將控制權(quán)轉(zhuǎn)交給機(jī)器的陷阱向量昧捷,在陷阱向量中有一個(gè)預(yù)定義的內(nèi)核指令正在等待通常是分之跳轉(zhuǎn)到某個(gè)具體處理程序的指令闲昭。
系統(tǒng)調(diào)用的處理
當(dāng)用戶態(tài)的程序需要內(nèi)核服務(wù)的時(shí)候,會(huì)發(fā)出一個(gè)系統(tǒng)調(diào)用料身,系統(tǒng)調(diào)用將控制權(quán)轉(zhuǎn)交給內(nèi)核汤纸。在XNU中,系統(tǒng)調(diào)用有四種類別:
- BSD系統(tǒng)調(diào)用
- Mach陷阱
- 機(jī)器相關(guān)調(diào)用
- 診斷調(diào)用
四種類型的調(diào)用都差不多芹血,它們的函數(shù)原型接受一個(gè)指向狀態(tài)快照的指針贮泞,其中狀態(tài)快照包含了處理器中所有寄存器的導(dǎo)出值楞慈。