0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡述操作系統(tǒng)的保護(hù)機(jī)制

jf_78858299 ? 來源:碼農(nóng)的荒島求生 ? 作者:陸小風(fēng) ? 2023-02-15 14:48 ? 次閱讀

在回答這個(gè)問題之前,你可能會(huì)首先想:為什么操作系統(tǒng)需要保護(hù)自己呢?

操作系統(tǒng)其實(shí)就是一個(gè)大管家,負(fù)責(zé)給應(yīng)用程序搭建舞臺,好讓程序們過好自己的一生,但偏偏有不聽話的程序可能想搶操作系統(tǒng)的戲,顯然這會(huì)影響所有其它正在程序,因此操作系統(tǒng)必須要有能力保護(hù)自己。

我們從歷史的角度了解了x86最開始是沒有任何保護(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)相信對于打工人都深有體會(huì),在公司里有的文檔你無權(quán)查看,有的數(shù)據(jù)庫你無權(quán)讀取,有的門禁你的卡刷不開等等。

這里也是一樣的道理,但是操作系統(tǒng)和普通的應(yīng)用程序都是軟件,從本質(zhì)上講沒有任何區(qū)別,在CPU眼里都是機(jī)器指令,顯然從軟件這一層面上看操作系統(tǒng)沒有很好的辦法能控制應(yīng)用程序,這就不得不借助硬件的幫忙了,借助誰的幫忙呢?顯然是CPU。

我們剛才提到過,不管是操作系統(tǒng)還是應(yīng)用程序在CPU眼里都是機(jī)器指令,CPU閉著眼執(zhí)行就完事兒,從時(shí)間角度上看CPU就是一條又一條的在執(zhí)行指令:

圖片

然而,CPU也不能對此一點(diǎn)都不關(guān)心,CPU必須能區(qū)分出哪些指令屬于操作系統(tǒng),哪些指令屬于普通的應(yīng)用程序!

該怎么區(qū)分呢?很簡單,其中一種方法是這樣的,我們添加一些特殊的機(jī)器指令,假設(shè)是指令A(yù)和B,CPU執(zhí)行到該指令A(yù)時(shí)就知道接下來要執(zhí)行的指令屬于操作系統(tǒng),當(dāng)執(zhí)行完指令B時(shí)就知道接下來要執(zhí)行的屬于普通應(yīng)用程序,這兩條指令在x86(32位)中就是int與iret指令,這兩個(gè)指令對應(yīng)的背后就是所謂的系統(tǒng)調(diào)用。

有了這樣的指令,CPU可以清楚的執(zhí)行什么時(shí)候在執(zhí)行普通程序,什么是在運(yùn)行操作系統(tǒng)(程序),CPU能區(qū)分清楚那么就能給它們賦予不同的權(quán)限, 這就是所謂用戶態(tài)與內(nèi)核態(tài)的由來 ,用戶態(tài)對應(yīng)的是普通程序,內(nèi)核態(tài)對應(yīng)的是操作系統(tǒng),它們的權(quán)限是不一樣的。

圖片

x86 CPU支持四種權(quán)限等級,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)限,相對較低。

同時(shí),一些指令只有在內(nèi)核態(tài)下才可以執(zhí)行,這些就是所謂特權(quán)指令,當(dāng)CPU在用戶態(tài)(普通程序)時(shí)是沒有辦法執(zhí)行特權(quán)指令的,這樣就從機(jī)器指令這個(gè)層面確保了普通程序不能執(zhí)行某些特權(quán)操作。

圖片

我們知道程序除了機(jī)器指令外還有指令依賴的數(shù)據(jù),而數(shù)據(jù)又是保存在內(nèi)存中,那么接下來的問題是操作系統(tǒng)該怎樣保護(hù)自己的內(nèi)存不會(huì)普通程序讀寫呢?

訪問內(nèi)存也需要權(quán)限

答案和我們剛才講解的機(jī)器指令的特權(quán)劃分是一樣的。

我們規(guī)定操作系統(tǒng)所在的內(nèi)存區(qū)域只有CPU處于內(nèi)核態(tài)時(shí)才可以訪問,如果位于用戶態(tài)的程序試圖訪問內(nèi)核所在的地址空間那么將立刻被操作系統(tǒng)kill掉。

那么接下來的問題就是我們該怎樣給一段內(nèi)存添加上權(quán)限信息呢?

顯然我們需要一張“表”,這張表中記錄一段內(nèi)存區(qū)域并且記錄下訪問這塊內(nèi)存所需要的權(quán)限信息,類似這樣:

序號   起始地址   長度     所需權(quán)限0     0x7c00    0x1000  01     0x9a00    0x2000  3...

當(dāng)CPU試圖訪問這段內(nèi)存區(qū)域時(shí)會(huì)根據(jù)CPU自身所在的權(quán)限(內(nèi)核態(tài)或者用戶態(tài))與這段內(nèi)存需要的權(quán)限進(jìn)行比對,只有當(dāng)CPU所在權(quán)限比訪問這段內(nèi)存所需要的權(quán)限高或者相等時(shí)才能讀寫這段內(nèi)存,否則將觸發(fā)異常。

假設(shè)CPU當(dāng)前正在執(zhí)行用戶態(tài)程序,也就是運(yùn)行在用戶態(tài),因此其權(quán)限等級為3,此時(shí)如果CPU試圖訪問第0號內(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ū)別開來,我們需要給機(jī)器指令賦予權(quán)限等級,該權(quán)限信息會(huì)保存在CPU中,顯然CPU中需要特定寄存器來保存該信息,于此同時(shí)我們也為內(nèi)存區(qū)域賦予了權(quán)限等級,只有當(dāng)前CPU的權(quán)限大于或者等于該內(nèi)存區(qū)域所需權(quán)限時(shí)才能讀寫,這就要求有一張“表”來保存內(nèi)存起始地址、長度、權(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ù)模式

我們在之前的文章中說過,x86是一個(gè)有著頑強(qiáng)生命力的物種,其它大部分類型的CPU在計(jì)算機(jī)不長的歷史中逐漸消失了,而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來管理內(nèi)存的,實(shí)際上x86處理器在引入保護(hù)模式的同時(shí)也開始支持頁式內(nèi)存管理(paging),因此現(xiàn)代x86處理器即支持段式內(nèi)存管理也支持頁式內(nèi)存管理,只不過對于現(xiàn)代操作系統(tǒng)像Linux等實(shí)際上幾乎不再使用處理器提供的段式內(nèi)存管理機(jī)制而是基于頁式內(nèi)存管理機(jī)制。

從這里我們也能看出來,內(nèi)存管理機(jī)制其實(shí)是處理器這種硬件提供的,操作系統(tǒng)(軟件)只不過這種機(jī)制的使用者而已。

好啦,這篇文章就先到這里,實(shí)際上這里還有很多內(nèi)容沒有講解完,GDT、LDT長什么樣子?怎么使用?具體該怎樣從實(shí)模式切換到保護(hù)模式等等,這些內(nèi)容將在后續(xù)章節(jié)中介紹。

希望這篇文章對大家理解操作系統(tǒng)的保護(hù)機(jī)制有所幫助。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6702

    瀏覽量

    123151
  • 程序
    +關(guān)注

    關(guān)注

    116

    文章

    3767

    瀏覽量

    80784
收藏 人收藏

    評論

    相關(guān)推薦

    實(shí)時(shí)操作系統(tǒng)和分時(shí)操作系統(tǒng)的區(qū)別

    操作系統(tǒng)能否滿足實(shí)時(shí)性要求來區(qū)分,可把操作系統(tǒng)分成分時(shí)操作系統(tǒng)和實(shí)時(shí)操作系統(tǒng),分時(shí)操作系統(tǒng)按照相等的時(shí)間片調(diào)度進(jìn)程輪流運(yùn)行,分時(shí)操作系統(tǒng)
    發(fā)表于 11-14 17:39 ?1.3w次閱讀

    μC/OSII操作系統(tǒng)的中斷機(jī)制和中斷應(yīng)滿足的條件是什么

    本文以開源的嵌入式操作系統(tǒng)μC/OSII為例,分析了操作系統(tǒng)的中斷機(jī)制和中斷應(yīng)滿足的條件。介紹了μC/OSII系統(tǒng)時(shí)鐘節(jié)拍,探討了時(shí)鐘中斷函數(shù)中存在的不足,并且給出了解決方案,從而有效
    發(fā)表于 04-27 06:33

    嵌入式技術(shù)簡述

    1.嵌入式技術(shù)簡述(1)概念: 在已有的硬件上移植操作系統(tǒng),在操作系統(tǒng)上做層應(yīng)用開發(fā)以及在操作系統(tǒng)之下做底層開發(fā);(2)操作系統(tǒng):管理資源(
    發(fā)表于 10-27 06:49

    STM32CubeProgrammer解除讀保護(hù)的方法簡述

    操作系統(tǒng),圖形用戶界面或命令行界面,支持多種連接選擇(JTAG、SWD、USB、UART),采用手動(dòng)操作或通過腳本自動(dòng)操作。很多情況下,我們?yōu)榱顺绦虬踩?,都?huì)在燒錄時(shí),使能讀保護(hù)功能,
    發(fā)表于 02-14 06:29

    一文讀懂RT-Thread操作系統(tǒng)的郵箱機(jī)制

    RT-Thread操作系統(tǒng)的郵箱有何作用?RT-Thread操作系統(tǒng)的郵箱機(jī)制管理數(shù)據(jù)結(jié)構(gòu)是怎樣的?
    發(fā)表于 02-28 08:10

    嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks內(nèi)核調(diào)度機(jī)制研究

    嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks內(nèi)核調(diào)度機(jī)制研究
    發(fā)表于 03-29 12:26 ?13次下載

    基于OSEK/DX操作系統(tǒng)的任務(wù)管理機(jī)制設(shè)計(jì)

    基于OSEK/VDX操作系統(tǒng)的任務(wù)管理機(jī)制設(shè)計(jì):在汽車電子仿真控制平臺開發(fā)領(lǐng)域,通常需要遵循OSEKIVDX規(guī)范集,而該規(guī)范集的核心之一便是OSEK/VDX操作系統(tǒng)規(guī)范。要設(shè)計(jì)一個(gè)符合該規(guī)
    發(fā)表于 04-21 22:02 ?19次下載

    Linux操作系統(tǒng)原理及應(yīng)用

    Linux操作系統(tǒng)原理及應(yīng)用 1.1  操作系統(tǒng)的地位 1.2  操作系統(tǒng)的功能 1.3  操作系統(tǒng)的發(fā)展過程 1.4 
    發(fā)表于 04-28 14:53 ?0次下載

    linux操作系統(tǒng)的安全性

    linux操作系統(tǒng)的安全性 計(jì)算機(jī)系統(tǒng)安全性的內(nèi)涵 操作系統(tǒng)的安全性功能 操作系統(tǒng)的安全機(jī)制 安全
    發(fā)表于 04-28 15:05 ?0次下載

    Linux操作系統(tǒng)簡述

    Linux操作系統(tǒng)簡述一、計(jì)算機(jī)軟件與操作系統(tǒng)  功能強(qiáng)大的計(jì)算機(jī)自從走進(jìn)了人類的生活就發(fā)揮著越來越重要的作用,隨著時(shí)代的發(fā)展,計(jì)算機(jī)已
    發(fā)表于 01-18 12:43 ?1208次閱讀

    硬盤保護(hù)卡的接口類型 /操作系統(tǒng)

    硬盤保護(hù)卡的接口類型 /操作系統(tǒng)  接口類型     
    發(fā)表于 12-26 15:39 ?684次閱讀

    RTOS操作系統(tǒng)

    RTOS操作系統(tǒng)RTOS操作系統(tǒng)RTOS操作系統(tǒng)RTOS操作系統(tǒng)RTOS操作系統(tǒng)
    發(fā)表于 12-28 15:30 ?0次下載

    基于UEFI固件的操作系統(tǒng)完整性度量機(jī)制

    操作系統(tǒng)是計(jì)算機(jī)硬件和軟件的紐帶,是應(yīng)用軟件運(yùn)行的基礎(chǔ)環(huán)境,而內(nèi)核的安全性是操作系統(tǒng)安全的核心問題,若操作系統(tǒng)內(nèi)核受到攻擊,會(huì)對操作系統(tǒng)以及應(yīng)用程序造成重大的威脅。 UEFI (Uni
    發(fā)表于 11-30 17:27 ?0次下載
    基于UEFI固件的<b class='flag-5'>操作系統(tǒng)</b>完整性度量<b class='flag-5'>機(jī)制</b>

    操作系統(tǒng)內(nèi)核中高效保護(hù)應(yīng)用程序的方法

    在現(xiàn)代操作系統(tǒng)中,內(nèi)核運(yùn)行在最高特權(quán)層,管理底層硬件并向上層應(yīng)用程序提供系統(tǒng)服務(wù),因而安全敏感的應(yīng)用程序很容易受到來自底層不可信內(nèi)核的攻擊,提出了一種在不可信操作系統(tǒng)內(nèi)核中保護(hù)應(yīng)用程序
    發(fā)表于 01-15 16:45 ?0次下載
    <b class='flag-5'>操作系統(tǒng)</b>內(nèi)核中高效<b class='flag-5'>保護(hù)</b>應(yīng)用程序的方法

    解析操作系統(tǒng)的概念、結(jié)構(gòu)和機(jī)制

    全面。解析操作系統(tǒng)的概念、結(jié)構(gòu)和機(jī)制。
    發(fā)表于 03-26 14:19 ?8次下載