保護模式特權級變換總結

2021-07-22 08:29:55 字數 1462 閱讀 1800

特權級的東西很亂,我決定今天花一點時間好好的整理一下,我一步一步慢慢開始,比較鬱悶的是還不知道理解得正確不正確,先寫著吧:

首先,特權級別一共有四個特權級別(0-3),然後呢,數字越小,級別越高。

其次,處理器通過cpl,dpl,rpl來進行特權級管理。

接下來,我想分為2種模組來總結,之前,我一直沒把特權級訪問和特權級轉移分開理解,這裡我想分成2塊來總結。

第一種:訪問。

我想訪問主要針對資料段,tss之類的,當然**段也會涉及,他們的規則如下:

資料段:dpl規定了可以訪問此資料段的最低特權級。

非一致**段:dpl規定了可以訪問此**段的特權級(即特權級必須相同)

呼叫門:dpl規定了可以訪問此呼叫門的最低特權級

一致**段:dpl規定了可以訪問此一致**段的最高特權級

tss:dpl規定了可以訪問此tss的最低特權級

訪問的規則應該主要是如上所述,我想訪問的準確定義是對段或門進行讀寫吧

第二種:不同級**段之間的轉移。

主要說2種方式:

i.通過jmp和call直接轉移:

對於這種直接轉移的方法,會受到很大的限制,只有以下幾種情況才能成功轉移:

1.目標段是非一致**段:要求cpl必須等於目標段的dpl,同時要求rpl小於等於dpl

2.目標段是一致**段 

:要求cpl大於或者等於目標段的dpl,此時rpl不做檢查,且轉移後,cpl會被延續,而不會變成目標段的dpl

ii.通過呼叫門轉移:

由於上面的轉移方式受到諸多限制,所以呼叫門就顯得很重要了。

a.call(通常是從低特權級**段轉至高特權級**段)

準備工作:

1.準備乙個呼叫門描述符和呼叫門選擇子(注意描述符的dpl大於等於源**段的cpl和rpl),並初始化

2.準備tss,只需要目標段dpl的堆疊位置即可

3.載入tss

4.call呼叫門

b.retf(通常從高特權級轉至低特權級)

總結就四個壓棧:

1.壓入目標段的ss

2.壓入目標段的esp

3.壓入目標段的cs

4.壓入目標段的eip

5.retf即可

堆疊的使用:

1.不同的特權等級使用不同的堆疊,只有使用呼叫門的轉移才能實現堆疊的切換。所以,利用call和jmp直接轉移,對於非一致性**,只能同級轉移(沒有堆疊切換);對於一致性**,cpl必須在轉移過程中保持不變(這樣也不存在堆疊切換)。

2.如果用jmp+呼叫門轉移,cpl必須等於目標**段的dpl。因為jmp也無法實現堆疊切換。

3.總結,只有call+呼叫門才能實現堆疊切換,這是理解這些亂七八糟cpl與dpl規則的關鍵。

4. call只能實現低特權級到高特權級的轉移

5.如果要堆疊切換(從低特權堆疊切換到高特權堆疊),則必須把tss準備好。

5. 高特權級到低特權級,必須用retf指令

保護模式特權級概述

在ia32的作業系統中,段被分為了4個特權級,分別為0 3級,有時候我們也叫做ring0 ring3,其中,數值越小特權級越高。如下圖所示 圖中,核心 和資料所在的段的特權級都比較高,一般在ring0,而使用者程式所在的段的特權級較低,一般在ring3。當低特權級的任務試圖在未被允許的情況下訪問高特...

80386保護模式總結

大學也上過微機原理,但那個時候整天玩php,vc c net.資料庫管理系統.沒有意識到她是一門非常重要的課。於是上這些基礎課的時候都在下面看那些 從入門到精通之類的書了或者乾脆翹了去圖書館看 當然我不會否認正是因為這些書讓我玩計算機的興趣堅持了下去 大學畢業同學都把書賣了。我當時感到像微機原理組成...

進入保護模式總結

1.最主要的就是那個jmp dword,一切都是為了jmp做準備 2.int 13h讀取扇區,既可以讀硬碟,又可以讀軟盤,應該是兩個的驅動器號不同 這個還沒搞清楚,現在只會讀軟盤 用硬碟映像的時候,總是說找不到引導裝置,不知道是哪兒的引數錯了。一些細節 cl是讀取的扇區號,1就是第1個扇區,並不是從...