自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我們一起學(xué)習(xí)實(shí)模式和保護(hù)模式

開發(fā) 前端
了解匯編的同學(xué)可能知道匯編代碼中會(huì)把代碼分成很多段,有代碼段、數(shù)據(jù)段等。這樣程序在載入內(nèi)存時(shí)也是分成不同的段載入內(nèi)存的。這樣取指令時(shí)就需要找到段的基址,然后再確定偏移,就能得出指令的地址。

今天我們就系統(tǒng)的講下實(shí)模式和保護(hù)模式。我覺得能很形象的說明保護(hù)模式存在的意義。先看下面這段代碼。

int main()
{
int* addr = (int*)0;
cli(); //關(guān)中斷
while(1)
{
*addr = 0;
addr++;
}
return 0;
}

這段代碼如果能順利執(zhí)行,其實(shí)是很可怕的。你會(huì)發(fā)現(xiàn)他直接的獲取到了內(nèi)存的 0 號(hào)位置,并且能順序的向下遍歷,然后還能直接的對(duì)內(nèi)存寫入數(shù)據(jù),對(duì)了,這段代碼還把中斷關(guān)了。想象一下,如果你和幾個(gè)用戶一起用一臺(tái)服務(wù)器,一旦有個(gè)用戶執(zhí)行完這段代碼后,那么所有人還在內(nèi)存中的數(shù)據(jù)將被刪的干干凈凈,并且在刪的過程中還沒有任何辦法去中斷這段代碼對(duì)應(yīng)的進(jìn)程。

這段代碼的工作方式就是實(shí)模式的工作方式。實(shí)模式的特點(diǎn)主要在于實(shí)模式的尋址方式,實(shí)模式的尋找方式進(jìn)而決定了實(shí)模式在尋址范圍以及保護(hù)性上都不如保護(hù)模式好。目前實(shí)模式的存在主要是為了兼容之前的系統(tǒng),在操作系統(tǒng)讀入bootsect.s 以及執(zhí)行 bootsect.s 進(jìn)行 setup 和 system 讀入階段是在實(shí)模式下執(zhí)行,之后都是在保護(hù)模式下執(zhí)行了。我們接下來分別看實(shí)模式和保護(hù)模式的工作方式。

Part1實(shí)模式

今天詳細(xì)講一下載入過程。正好我們來感受下實(shí)模式是如何工作的。

首先說實(shí)模式應(yīng)該如何表示指令在內(nèi)存的位置,實(shí)模式下通過 ”CS“ 和 ”IP“ 兩個(gè)寄存器來表示位置,CS 寄存器存段基指,IP 寄存器存偏移。這里簡(jiǎn)單介紹下為什么要用段表示。了解匯編的同學(xué)可能知道匯編代碼中會(huì)把代碼分成很多段,有代碼段、數(shù)據(jù)段等。這樣程序在載入內(nèi)存時(shí)也是分成不同的段載入內(nèi)存的。這樣取指令時(shí)就需要找到段的基址,然后再確定偏移,就能得出指令的地址。具體方式是把 CS 寄存器中的值取出來向左偏移 4 位,然后加上 IP 偏移的值。比如要得到 BIOS 的地址,那么從CS寄存器得到的段基址就是 0xFFFF,IP 取出的偏移是 0x0000。CS偏移 4 位加 IP 就是 0xFFFF0(地址的表示是16進(jìn)制的,但左移四位說的是二進(jìn)制的偏移,十六進(jìn)制偏移一位和二進(jìn)制偏移四位效果是一樣的)。這樣,BIOS的位置就找到了,接下來取出指令并執(zhí)行就好了。

圖片

CS寄存器中的值取出來后先偏移 4 位就是因?yàn)?CS 寄存器和 IP 寄存器都是16位的,16位只能表示 64k 的大小。將 CS 向左移4位加上偏移,就能用20位表示地址了,尋址范圍能達(dá)到 1M。

雖然通過將從CS寄存器中取出的段基址左移四位后尋址范圍增加了,達(dá)到1M,但對(duì)于現(xiàn)代的計(jì)算機(jī)來說尋址范圍實(shí)在太小了(就算是32位的計(jì)算機(jī) CS 寄存器也是16位的),這就是實(shí)模式下的一大缺點(diǎn)。我們?cè)倏纯幢Wo(hù)模式是怎么做的。

Part2保護(hù)模式

對(duì)于 32 位的計(jì)算機(jī),如果內(nèi)存尋址只能尋到 1M,顯然太小了。理論上,32 位的計(jì)算機(jī)適配的地址線也有 32 位,我們應(yīng)該以 32 位的地址去表示地址。但是為了適配之前的系統(tǒng)(現(xiàn)在的操作系統(tǒng)在加載 BIOS,用 BIOS 執(zhí)行載入 bootsect.s 等一直用著上面所表述的實(shí)模式的尋址方式),CS 這個(gè)段寄存器一直就是 16位 的,只是存偏移的那個(gè)寄存器多了一個(gè)叫 EIP 的 32 位的寄存器。為了讓尋址適應(yīng)這個(gè)變化,CS 寄存器存的不再是真實(shí)的段基址了,而是段選擇子,其中段選擇子的 0-2 位用作權(quán)限控制,3-15 記錄的是 GDT 表的索引。

拿到段選擇子后就可以通過選擇子找到段描述符,然后再通過段描述符(GDT表)找到相應(yīng)的段基址,然后再把段基址和偏移相加就是真實(shí)的地址了。

這個(gè) GDT 表可是有大用,不光解決尋址的問題,對(duì)于內(nèi)存的保護(hù)也可以靠他。

圖片

這個(gè)段描述符中段長(zhǎng)和段基址都是斷開的,這是由于歷史原因構(gòu)成的,咱們還是主要看段描述符中的內(nèi)容以及對(duì)應(yīng)的功能。段長(zhǎng)度可以限定段內(nèi)偏移地址,也就是說你拿到一個(gè)段基址后只能在這個(gè)界限內(nèi)偏移,如果偏移超過限定值訪問就不合法了。段基址就和實(shí)模式下的段基址一樣,只是現(xiàn)在有了32位的段基址。描述方面主要是對(duì)段的可讀可執(zhí)行,代碼段還是數(shù)據(jù)段進(jìn)行描述,另外描述中有一個(gè)相當(dāng)重要的就是 DPL,這個(gè) DPL 限定了權(quán)限級(jí)別,只有段選擇子中記錄的發(fā)起訪問者的訪問權(quán)限滿足 DPL 的限定,才能訪問。

不難看出,GDT 表對(duì)相應(yīng)的段的可讀可寫以及段是代碼段還是數(shù)據(jù)段等情況都做了詳細(xì)的描述,每次通過段選擇子找到段描述符時(shí),都會(huì)判斷能不能訪問成功。

下面通過流程圖看下保護(hù)模式的完整取指過程。

圖片

責(zé)任編輯:武曉燕 來源: CS指南
相關(guān)推薦

2024-01-01 08:19:32

模式History前端

2021-05-31 09:23:04

管道模式責(zé)任鏈

2023-08-07 08:04:05

動(dòng)態(tài)抽象工廠模式

2023-07-31 12:27:30

單例設(shè)計(jì)模式

2023-06-20 07:27:07

架構(gòu)組件插件

2023-07-06 00:45:05

Linux保護(hù)模式

2022-02-14 10:16:22

Axios接口HTTP

2021-05-19 10:37:16

WebFlux 前置工具

2023-12-28 09:55:08

隊(duì)列數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)

2022-12-01 09:59:57

內(nèi)核觀測(cè)性方法

2021-11-26 09:44:42

鏈表節(jié)點(diǎn)定位

2021-05-20 07:15:34

RSA-PSS算法簽名

2025-04-08 00:16:07

2023-03-28 07:32:37

2023-03-26 12:45:52

Linux內(nèi)核頭文件

2011-09-06 09:47:21

WindowsVistIE7保護(hù)模式

2012-01-12 12:15:14

2023-05-31 08:42:02

管理產(chǎn)品技術(shù)項(xiàng)目

2022-04-07 11:43:24

UPnPDLNA協(xié)議

2021-10-11 10:25:33

排列nums數(shù)組
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)