特權級的東西很亂,我決定今天花一點時間好好的整理一下,我一步一步慢慢開始,比較鬱悶的是還不知道理解得正確不正確,先寫著吧:
首先,特權級別一共有四個特權級別(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個扇區,並不是從...