在回答這個(gè)問(wèn)題之前,你可能會(huì)首先想:為什么操作系統(tǒng)需要保護(hù)自己呢?
操作系統(tǒng)其實(shí)就是一個(gè)大管家,負(fù)責(zé)給應(yīng)用程序搭建舞臺(tái),好讓程序們過(guò)好自己的一生,但偏偏有不聽話的程序可能想搶操作系統(tǒng)的戲,顯然這會(huì)影響所有其它正在程序,因此操作系統(tǒng)必須要有能力保護(hù)自己。
我們從歷史的角度了解了x86最開始是沒(méi)有任何保護(hù)機(jī)制的,應(yīng)用程序竟然可以與操作系統(tǒng)平起平坐,操作系統(tǒng)能讀寫的內(nèi)存區(qū)域應(yīng)用程序也一樣可以讀寫,操作系統(tǒng)可以控制的硬件應(yīng)用程序一樣不在話下。
應(yīng)用程序和操作系統(tǒng)這么平等還何談保護(hù)?其實(shí)從某種程度講, 保護(hù)自己就是限制別人 ,那么操作系統(tǒng)該怎樣限制應(yīng)用程序呢?
程序也是分三六九等的
核心就在一點(diǎn): 權(quán)限 。
這一點(diǎn)相信對(duì)于打工人都深有體會(huì),在公司里有的文檔你無(wú)權(quán)查看,有的數(shù)據(jù)庫(kù)你無(wú)權(quán)讀取,有的門禁你的卡刷不開等等。
這里也是一樣的道理,但是操作系統(tǒng)和普通的應(yīng)用程序都是軟件,從本質(zhì)上講沒(méi)有任何區(qū)別,在CPU眼里都是機(jī)器指令,顯然從軟件這一層面上看操作系統(tǒng)沒(méi)有很好的辦法能控制應(yīng)用程序,這就不得不借助硬件的幫忙了,借助誰(shuí)的幫忙呢?顯然是CPU。
我們剛才提到過(guò),不管是操作系統(tǒng)還是應(yīng)用程序在CPU眼里都是機(jī)器指令,CPU閉著眼執(zhí)行就完事兒,從時(shí)間角度上看CPU就是一條又一條的在執(zhí)行指令:
然而,CPU也不能對(duì)此一點(diǎn)都不關(guān)心,CPU必須能區(qū)分出哪些指令屬于操作系統(tǒng),哪些指令屬于普通的應(yīng)用程序!
該怎么區(qū)分呢?很簡(jiǎn)單,其中一種方法是這樣的,我們添加一些特殊的機(jī)器指令,假設(shè)是指令A(yù)和B,CPU執(zhí)行到該指令A(yù)時(shí)就知道接下來(lái)要執(zhí)行的指令屬于操作系統(tǒng),當(dāng)執(zhí)行完指令B時(shí)就知道接下來(lái)要執(zhí)行的屬于普通應(yīng)用程序,這兩條指令在x86(32位)中就是int與iret指令,這兩個(gè)指令對(duì)應(yīng)的背后就是所謂的系統(tǒng)調(diào)用。
有了這樣的指令,CPU可以清楚的執(zhí)行什么時(shí)候在執(zhí)行普通程序,什么是在運(yùn)行操作系統(tǒng)(程序),CPU能區(qū)分清楚那么就能給它們賦予不同的權(quán)限, 這就是所謂用戶態(tài)與內(nèi)核態(tài)的由來(lái) ,用戶態(tài)對(duì)應(yīng)的是普通程序,內(nèi)核態(tài)對(duì)應(yīng)的是操作系統(tǒng),它們的權(quán)限是不一樣的。
x86 CPU支持四種權(quán)限等級(jí),0,1,2,3,一般的操作系統(tǒng)都使用兩種特權(quán)0和3,0是最高權(quán)限,顯然這是操作系統(tǒng)也就是內(nèi)核態(tài)所擁有的權(quán)限,而3是普通程序運(yùn)行的權(quán)限,相對(duì)較低。
同時(shí),一些指令只有在內(nèi)核態(tài)下才可以執(zhí)行,這些就是所謂特權(quán)指令,當(dāng)CPU在用戶態(tài)(普通程序)時(shí)是沒(méi)有辦法執(zhí)行特權(quán)指令的,這樣就從機(jī)器指令這個(gè)層面確保了普通程序不能執(zhí)行某些特權(quán)操作。
我們知道程序除了機(jī)器指令外還有指令依賴的數(shù)據(jù),而數(shù)據(jù)又是保存在內(nèi)存中,那么接下來(lái)的問(wèn)題是操作系統(tǒng)該怎樣保護(hù)自己的內(nèi)存不會(huì)普通程序讀寫呢?
訪問(wèn)內(nèi)存也需要權(quán)限
答案和我們剛才講解的機(jī)器指令的特權(quán)劃分是一樣的。
我們規(guī)定操作系統(tǒng)所在的內(nèi)存區(qū)域只有CPU處于內(nèi)核態(tài)時(shí)才可以訪問(wèn),如果位于用戶態(tài)的程序試圖訪問(wèn)內(nèi)核所在的地址空間那么將立刻被操作系統(tǒng)kill掉。
那么接下來(lái)的問(wèn)題就是我們?cè)撛鯓咏o一段內(nèi)存添加上權(quán)限信息呢?
顯然我們需要一張“表”,這張表中記錄一段內(nèi)存區(qū)域并且記錄下訪問(wèn)這塊內(nèi)存所需要的權(quán)限信息,類似這樣:
起始地址 長(zhǎng)度 所需權(quán)限
0 0x7c00 0x1000 0
1 0x9a00 0x2000 3
...
當(dāng)CPU試圖訪問(wèn)這段內(nèi)存區(qū)域時(shí)會(huì)根據(jù)CPU自身所在的權(quán)限(內(nèi)核態(tài)或者用戶態(tài))與這段內(nèi)存需要的權(quán)限進(jìn)行比對(duì),只有當(dāng)CPU所在權(quán)限比訪問(wèn)這段內(nèi)存所需要的權(quán)限高或者相等時(shí)才能讀寫這段內(nèi)存,否則將觸發(fā)異常。
假設(shè)CPU當(dāng)前正在執(zhí)行用戶態(tài)程序,也就是運(yùn)行在用戶態(tài),因此其權(quán)限等級(jí)為3,此時(shí)如果CPU試圖訪問(wèn)第0號(hào)內(nèi)存塊時(shí)發(fā)現(xiàn)讀寫該內(nèi)存塊所需要的權(quán)限為0(內(nèi)核態(tài)),這時(shí)CPU本身將產(chǎn)生異常,該異常將被操作系統(tǒng)捕獲,此時(shí)操作系統(tǒng)會(huì)發(fā)現(xiàn)應(yīng)用程序試圖讀寫程序不具備權(quán)限的內(nèi)存,因此操作系統(tǒng)手起刀落將該進(jìn)程kill掉,這樣操作系統(tǒng)就保證了自己的內(nèi)存區(qū)域不會(huì)被普通程序所讀寫。
就這樣操作系統(tǒng)成功保護(hù)了自己的內(nèi)存數(shù)據(jù)以及機(jī)器指令。
現(xiàn)在是時(shí)候總結(jié)一下了。
為了將操作系統(tǒng)和普通程序區(qū)別開來(lái),我們需要給機(jī)器指令賦予權(quán)限等級(jí),該權(quán)限信息會(huì)保存在CPU中,顯然CPU中需要特定寄存器來(lái)保存該信息,于此同時(shí)我們也為內(nèi)存區(qū)域賦予了權(quán)限等級(jí),只有當(dāng)前CPU的權(quán)限大于或者等于該內(nèi)存區(qū)域所需權(quán)限時(shí)才能讀寫,這就要求有一張“表”來(lái)保存內(nèi)存起始地址、長(zhǎng)度、權(quán)限等信息,這張表就是所謂的Global Descriptor Table,GDT,以及Local Descriptor Table,LDT。
內(nèi)核所在內(nèi)存區(qū)域以及一些共享內(nèi)存區(qū)域信息就保存在GDT中,這就是叫做Global的原因,而進(jìn)程所在的內(nèi)存區(qū)域(私有)信息則保存在LDT中,這就是為什么叫做Local。
具備這些能力的x86 CPU就被稱為保護(hù)模式,Inter處理器從80286開始引入保護(hù)模式,可以看到與x86早前的實(shí)模式相比,保護(hù)模式開始有了質(zhì)的飛躍。
從實(shí)模式到保護(hù)模式
我們?cè)谥暗奈恼轮姓f(shuō)過(guò),x86是一個(gè)有著頑強(qiáng)生命力的物種,其它大部分類型的CPU在計(jì)算機(jī)不長(zhǎng)的歷史中逐漸消失了,而x86則歷久彌新,也因此x86歷史包袱十分沉重,即使是最新款的intel x86處理器也可以運(yùn)行上世紀(jì)編寫的古老程序,為做到向后兼容,intel x86程序必須既能運(yùn)行在實(shí)模式下也能運(yùn)行在保護(hù)模式下。
因此x86處理器在加電會(huì)首先進(jìn)入實(shí)模式然后切換到保護(hù)模式,現(xiàn)代操作系統(tǒng)都運(yùn)行在保護(hù)模式下,正是利用了處理器的一系列特性操作系統(tǒng)才得以保護(hù)自己。
我們看到的x86內(nèi)存管理都是基于段式機(jī)制,Segmentation來(lái)管理內(nèi)存的,實(shí)際上x86處理器在引入保護(hù)模式的同時(shí)也開始支持頁(yè)式內(nèi)存管理(paging),因此現(xiàn)代x86處理器即支持段式內(nèi)存管理也支持頁(yè)式內(nèi)存管理,只不過(guò)對(duì)于現(xiàn)代操作系統(tǒng)像Linux等實(shí)際上幾乎不再使用處理器提供的段式內(nèi)存管理機(jī)制而是基于頁(yè)式內(nèi)存管理機(jī)制。
從這里我們也能看出來(lái),內(nèi)存管理機(jī)制其實(shí)是處理器這種硬件提供的,操作系統(tǒng)(軟件)只不過(guò)這種機(jī)制的使用者而已。
好啦,這篇文章就先到這里,實(shí)際上這里還有很多內(nèi)容沒(méi)有講解完,GDT、LDT長(zhǎng)什么樣子?怎么使用?具體該怎樣從實(shí)模式切換到保護(hù)模式等等,這些內(nèi)容將在后續(xù)章節(jié)中介紹。
希望這篇文章對(duì)大家理解操作系統(tǒng)的保護(hù)機(jī)制有所幫助。
-
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6808瀏覽量
123290 -
程序
+關(guān)注
關(guān)注
117文章
3785瀏覽量
81006
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論