引用地址:
http://www.cnblogs.com/jnet/archive/2008/05/12/1193675.html
一直以來,都搞不清楚這幾個概念。在網上搜了一下,把它曬上,不會再忘記! 有其它的內容,請看到的朋友請補充。
從80386開始,cpu有三種工作方式:實模式,保護模式和虛擬8086模式。只有在剛剛啟動的時候是real-mode,等到linux作業系統運行
起來以後就運行在保護模式。實模式只能訪問地址在1M以下的記憶體稱為常規記憶體,我們把地址在1M
以上的記憶體稱為擴充記憶體。在保護模式下,全部32條地址線有效,可定址高達4G位元組的物理地址空間;
擴充的儲存空間分段管理機制和可選的儲存空間分頁管理機制,不僅為儲存空間共用和保護提供了硬體支援,而且為實現虛擬儲存空間提供了硬體支援;
支援多任務,能夠快速地進行任務切換和保護任務環境;
4個特權級和完善的特權檢查機制,既能實現資源共用又能保證代碼和資料的安全和保密及任務的隔離; 支援虛擬8086方式,便於執行8086程式。
虛擬8086模式是運行在保護模式中的實模式,為了在32位保護模式下執行純16位程式。它不是一個真正的CPU模式,還屬於保護模式。
保護模式同實模式的根本區別是進程記憶體受保護與否。可定址空間的區別只是這一原因的果。實模式將整個實體記憶體看成分段的地區,程式碼和資料位元於不同
地區,系統程式和使用者程式沒有區別對待,而且每一個指標都是指向"實在"的物理地址。這樣一來,使用者程式的一個指標如果指向了系統程式地區或其他使用者程式
地區,並改變了值,那麼對於這個被修改的系統程式或使用者程式,其後果就很可能是災難性的。為了克服這種低劣的記憶體管理方式,處理器廠商開發出保護模式。這
樣,實體記憶體地址不能直接被程式訪問,程式內部的地址(虛擬位址)要由作業系統轉化為物理地址去訪問,程式對此一無所知。
至此,進程(這時我們可以稱程式
為進程了)有了嚴格的邊界,任何其他進程根本沒有辦法訪問不屬於自己的實體記憶體地區,甚至在自己的虛擬位址範圍內也不是可以任意訪問的,因為有一些虛擬區
域已經被放進一些公用系統運行庫。這些地區也不能隨便修改,若修改就會有: SIGSEGV(linux
段錯誤);非法記憶體訪問對話方塊(windows 對話方塊)。
CPU啟動環境為16位實模式,之後可以切換到保護模式。但從保護模式無法切換回實模式
事實上,現在的64位奔騰4處理器,擁有三種基本模式和一種擴充模式,
基本模式:
保護模式:純32位保護執行環境。
實模式:純16位無保護執行環境。
系統管理模式:當SMI引腳為有效進入系統管理模式,首先儲存當前的CPU上下文。它有獨立的地址空間,用來執行電源管理或系統安全方面的指令。
擴充模式:
IA-32e模
式: 64位作業系統運行在該模式。該模式有兩種子模式:
1)相容模式:該模式下,64位作業系統運行在32位相容環境,能正常運行16,32位應用程式就像基本的保護模式一樣,
訪問32位地址空間,但不能
運行純16位實模式程式(就是不能運行虛擬86模式程式了)。
2)64位元模式:在該模式下,處理器完全執行64位指令,使用64位地址空間和64運算元,運行16,32位程式必須切換到相容模式。
IA-32e子模式的切換完全基於程式碼片段寄存器。這樣一來,運行在IA-32e模式中(64位)的OS完全可以無縫的運行所有16,32,64為應用程式,
通過設定32位後的CS。