保護模式初步理解
與實模式一樣,保護模式中記憶體也被邏輯上分成了乙個個具有相應功能的段,比如**段,資料段,棧段等。 但是保護模式中,每個段的「個性「更鮮明。
我們知道,在實模式中,所有記憶體都是可讀、可寫、可訪問的,你哪天看哪塊記憶體不爽了, 輕輕鬆鬆就可以把他裡面的東西搞亂,非常的不安全。 但在保護模式中,每個段在定義的時候就被賦予了段基址、段長度、段類別(**段/資料段/...)、特權級等屬性(這些屬性被放在8個位元組中,我們稱之為描述符)。任何程式想訪問其他段、以何種方式訪問(讀/寫/執行),都需要校驗通過才被允許。比如,我是乙個可執行的**段, 如果其他程式想修改它裡面的內容,那是不被允許的。 這樣,cpu通過一些類似的限制,最大限度的保護了程式的安全。
保護模式中比較重要的乙個保護方式就是特權級。 所有段被劃分為4個特權級(0~3),其中0最高,3最低。 較為核心的資料和**,被放在高特權級層次中,其他的被放在低特權級中。通過這種層次的劃分,可以有效的避免低優先順序任務在不被允許的情況下訪問高優先順序段。
所有段通常只在自己相同的特權級中執行, 但也難免有不同特權級之間的跳轉,所以cpu提供了一套比較嚴密的特權級跳轉機制。在正式介紹跳轉規則之前,我想先講一下cpu是如何檢查乙個跳轉是否合法。 我們知道,無論是在實模式還是在保護模式中,cs,eip都是用來儲存下一條指令的位址的,不同的是在保護模式中,cs中既存放了當前**段基址索引(3~15位存放的是當前**段描述符在gdt中的索引),又存放了當前程式的優先順序(cpl)。在試圖跳轉時,cpu將cpl與目標段dpl及rpl進行對比校驗,如果校驗成功, 就將目標段選擇子載入到cs中, 並以一定規則修改cpl, 隨後進入目標段執行。
對了,還要介紹乙個東西:**段型別。 **段被分為一致**段和非一致**段。可以這樣理解它們:
1.核心中的絕大多數**對上層都是透明且不可訪問的, 這些**可以理解為非一致**段, 是被嚴格保護起來的, 只能被相同特權級的其他段訪問。
2.同時,核心也需要與上層進行互動, 所以提供了有限的**允許符合條件的上層進行訪問,這些**就可以理解為一致**段。
其實特權級轉換規則並不複雜,大致可以歸納為以下幾條:
1. 低優先順序**段通過呼叫門可以跳轉至高優先順序的一致**段(非一致不被允許),且cpl不被改變。
2. 相同特權級**段之間可以直接跳轉。
3. 高特權級跳轉至低特權級時,需要借助一條指令:retf,且cpl被更改為dest_descriptor.dpl和dest_selector.rpl中更大的值,即特權級被降低。
4. 不同特權級的**段需要不同的棧,所以在特權級跳轉時,同時也要切換棧段,具體參考tss。
總的來說,特權級跳轉是比較麻煩的, 牽扯的概念比較多。把這個弄明白了,基本上就入門了。
理解Eureka的自我保護模式
本文我們來 eureka的自我保護模式。自我保護模式是eureka的重要特性。進入自我保護模式最直觀的體現,是eureka server首頁輸出的警告,如圖4 10所示。4 10 保護模式.png 圖4 10 eureka server自我保護模式介面 預設情況下,如果eureka server在一...
CPU保護模式DPL CPL簡易理解
現代intel cpu都有保護模式,實模式這兩種cpu執行模式。當cpu加電,cpu初始化時就執行在是模式下,然後現代作業系統會從實模式跳轉到保護模式!為什麼需要保護模式?在最開始程式設計的彙編時代,程式設計師的工作就是讀懂處理器指令,然後用這些指令來寫程式完成工作!乙個程式設計師要寫乙個程式,這個...
進入保護模式
本文為 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選flat才可以,2.6.0貌似選vp...