概述:實模式和保護模式是處理器發展的兩個非常重要的階段。這兩個模式下的程式設計也有著顯著的不同,弄明實模式與保護模式的區別是理解作業系統執行原理和編寫作業系統的基礎。本文主要講解了實模式和保護模式的區別和保護模式的起源,側重點在二者定址方式上的差異。
最開始的程式定址是直接的「段:偏移」模式,這樣的好處是所見即所得,程式設計師指定的位址就是實體地址,實體地址對程式設計師是可見的。但是,由此也帶來兩個問題:1
)無法支援多工2
)程式的安全性無法得到保證
(使用者程式可以改寫系統空間或者其他使用者的程式內容)
。實模式將整個物理記憶體看成分段的區域
,程式**和資料位於不同區域,系統程式和使用者程式沒有區別對待,而且每乙個指標都是指向"實在
"的實體地址。這樣一來,使用者程式的乙個指標如果指向了系統程式區域或其他使用者程式區域,並改變了值,那麼對於這個被修改的系統程式或使用者程式,其後果就很可能是災難性的。為了克服這種低劣的記憶體管理方式,處理器廠商開發出保護模式。這樣,物理記憶體位址不能直接被程式訪問,程式內部的位址(虛擬位址)要由作業系統轉化為實體地址去訪問,程式對此一無所知。
在保護模式下,全部
32條位址線有效,可定址高達
4g位元組的實體地址空間
;擴充的儲存器分段管理機制和可選的儲存器分頁管理機制,不僅為儲存器共享和保護提供了硬體支援,而且為實現虛擬儲存器提供了硬體支援
;支援多工,能夠快速地進行任務切換和保護任務環境
;4個特權級和完善的特權檢查機制,既能實現資源共享又能保證**和資料的安全和保密及任務的隔離
;支援虛擬
8086
方式,便於執行
8086
程式。保護模式出現的原因是:保護程序位址空間。這樣,就產生了乙個結果:兩種模式下程式的定址方式發生了變化。從
80386
開始,cpu
有三種工作方式:實模式,保護模式和虛擬
8086
模式。只有在剛剛啟動的時候是
real-mode
,等到linux
作業系統執行起來以後就執行在保護模式。虛擬
8086
模式是執行在保護模式中的實模式,為了在
32位保護模式下執行純
16位程式。它不是乙個真正的
cpu模式,還屬於保護模式。
cpu啟動環境為
16位實模式,之後可以切換到保護模式。但從保護模式無法切換回實模式
1
)實模式的定址方式與工作機理:
8086是16
位的cpu
,只能訪問位址在
1m以下的記憶體稱為常規記憶體,我們把位址在
1m以上的記憶體稱為擴充套件記憶體。實模式下有著
16位的暫存器
/16位資料匯流排
/20位位址匯流排。
physicaladdress=segment * 16 + offset
其中,
segment
和offset
都是16
位的。通過上述分段技術模式,能夠表示的最大記憶體為:
ffffh:ffffh=ffff0h+ffffh=10ffefh=1m+64k-16bytes(1m
多餘出來的部分被稱做高階記憶體區
hma)。但
8086/8088
只有20
位位址線,只能夠訪問
1m位址範圍的資料,所以如果訪問
100000h~10ffefh
之間的記憶體(大於
1m空間),則必須有第
21根位址線來參與定址(
8086/8088
沒有)。因此,當程式設計師給出超過1m(
100000h-10ffefh
)的位址時,因為邏輯上正常,系統並不認為其訪問越界而產生異常,而是自動從
0開始計算,也就是說系統計算實際位址的時候是按照對
1m求模的方式進行的,這種技術被稱為
wrap-around。對於
80286
或以上的
cpu通過
a20gate
來控制a20
位址線。
技術發展到了
80286
,雖然系統的位址匯流排由原來的
20根發展為
24根,這樣能夠訪問的記憶體可以達到
2^24=16m,
但是intel
在設計80286
時提出的目標是向下相容
,所以在實模式下,系統所表現的行為應該和
8086/8088
所表現的完全一樣,也就是說,在實模式下,
80386
以及後續系列應該和
8086/8088
完全相容仍然使用
a20位址線。所以說
80286
晶元存在乙個
bug:它開設
a20位址線。如果程式設計師訪問
100000h-10ffefh
之間的記憶體,系統將實際訪問這塊記憶體(沒有
wrap-around
技術),而不是象
8086/8088
一樣從0
開始。我們來看一副圖:
為了解決上述相容性問題,
ibm使用鍵盤控制器上剩餘的一些輸出線來管理第
21根位址線(從
0開始數是第
20根)的有效性,被稱為
a20gate
:a.如果
a20gate
被開啟,則當程式設計師給出
100000h-10ffefh
之間的位址的時候,系統將真正訪問這塊記憶體區域;
b.如果
a20gate
被禁止,則當程式設計師給出
100000h-10ffefh
之間的位址的時候,系統仍然使用
8086/8088
的方式即取模方式(
8086
**)。絕大多數
ibmpc
相容機預設的
a20gate
是被禁止的。現在許多新型
pc上存在直接通過
bios
功能呼叫來控制
a20gate
的功能。
上面所述的記憶體訪問模式都是實模式,在
80286
以及更高系列的
pc中,即使
a20gate
被開啟,在實模式下所能夠訪問的記憶體最大也只能為
10ffefh
,儘管它們的位址匯流排所能夠訪問的能力都大大超過這個限制。為了能夠訪問
10ffefh
以上的記憶體,則必須進入保護模式。 2
)保護模式定址: 從
80386
開始,進入32位
cpu時代,有
32位位址匯流排。但是,位址並沒有用暫存器直接指定,仍然採用了「段
+偏移」的模式。雖然段值仍然由原來的16位
cs/ds
等暫存器指定,但此時這些暫存器中存放的不再是段基址,而是乙個索引:從這個索引,可以找到乙個表項,裡面存放了段基址等很多屬性,這個表項稱為段描述符,這個表就稱為
gdt。
實模式下面段的大小是固定的
64k,而保護模式則不是固定的。關於段基址,實模式下,第16位是0;保護模式下堅持4k對齊,就是說第12b是0.
實模式下在
cs/ds
等暫存器中,保護模式在段描述符中,而要取得段描述符號,又需要取得cs等中的段選擇符。
實模式下沒有提供對段的保護,保護模式下面提供了對段的保護機制。
實模式與保護模式解惑之(一) 二者的起源與區別
概述 實模式和保護模式是處理器發展的兩個非常重要的階段。這兩個模式下的程式設計也有著顯著的不同,弄明實模式與保護模式的區別是理解作業系統執行原理和編寫作業系統的基礎。本文主要講解了實模式和保護模式的區別和保護模式的起源,側重點在二者定址方式上的差異。最開始的程式定址是直接的 段 偏移 模式,這樣的好...
實模式與保護模式
實模式與保護模式 1.實模式,又叫實位址模式,cpu完全按照8086的實際定址方法訪問從00000h fffffh 1mb大小 的位址範圍的記憶體,在這種模式下,cpu只能做單任務執行 定址公式為 實體地址 左移4位的段位址 偏移位址,即 實體地址是由16位的段位址和16位的段內偏移位址組成的。2....
實模式與保護模式
實模式 即實位址訪問模式 它是intel公司80286及以後的x86 80386,80486和80586等 相容處理器 cpu 的一種操作模式。實模式被特殊定義為20位位址記憶體可訪問空間上,這就意味著它的容量是2的20次冪 1m 的可訪問記憶體空間 物理記憶體和bios rom 軟體可通過這些位址...