80386ASM程式設計基礎(九) (轉)
雖然80386要較以前的處理器的功能大大增強,但這些功能只能在保護下才能全部得到發揮。在真實模式下最大定址空間只有1M,但在保護模式最大定址空間可達4G,可以訪問到所有的物理。同時由於引入虛擬記憶體的概念,在設計中可使用的地址空間為64TB。80386處理器採用了可擴充的分段管理和可選的分頁管理機制,這兩個管理機制由MMU(Memory Management Unit)部件來實現。因此,如果在80386下進行真實模式,這時的80386處理器相當於一功能更強大,執行速度更快的8086處理器。80386提供對虛擬儲存器的支援,虛擬儲存器的理論基礎就是:速度非常快的記憶體儲器和海量的外儲存器,所以它是一種軟結合的技術,它能夠提供比實體記憶體大得多的儲存空間。
80386下的段具有三個屬性:段基址,段界限,段屬性,通常描述段的稱作段描述符(Segment Descriptor),而描述符通常放在一個線性表中,這種線性表又分為:GDT(Global Descriptor Table),LDT(Local Descriptor Table),IDT(Interrupt Descriptor Table),通常用一個叫做選擇子的東西去確定使用上述三個線性表中哪一個描述符。程式中使用的地址空間就是虛擬地址空間,上面已經說過80386下虛擬地址空間可達到64TB(後面將解釋為什麼可以達到64TB),虛擬地址空間由一個選擇子和段內偏移組成,這是因為透過段的選擇子我們可以得到該段的描述符,而在描述符中又說明了段的基址,段的界限及段的屬性,再加上段的偏移就可以得到虛擬地址空間。不過請注意,這裡並沒有將段基址乘以16再加上偏移地址,這是保護模式與實式模式的區別之一。很明顯,任何資料都必須裝入到實體記憶體才能夠被儲存器處理,所以二維的虛擬地址空間必須轉換成一維的實體地址。同時,由於每個任務都有自已的虛擬地址空間,為了防止多個並行任務將虛擬地址空間對映同一實體地址空間採用線性地址空間隔離虛擬地址和實體地址,線性地址空間由一維的線性地址構成,線性地址空間與實體地址空間對等,線性地址為32位,可定址空間為4GB(實體地址空間最大也可以達到4GB,址址為32位,所以說線性地址空間與實體地址空間對等)。下面是80386虛擬地址空間與物理址空間的轉換示意圖:
|----------| |------------| |--------| |------------------| |--------|
| 虛擬地址 |------>|分段管理部件|------>|線性地址|---|--->|可選的分頁管理部件|---|-->|實體地址|
|----|-----| |------------| |--------| | |------------------| | |--------|
|------|-------| | |
| | |---------------------------|
|----------| |---------|
| 選擇子 | | 段內偏移|
|----------| |---------|
地址對映過程中,透過分段管理部件將虛擬地址空間轉換成線性地址,這一步是必然存在的。如果在程式中啟用了分頁管理機制,那麼線性地址還要經過分頁管理部件的處理才得到最後的實體地址。如果沒有采用分頁管理機制,那麼得到的線性地址就是實體地址。分頁管理部件的主要的工作機制在於將線性地址和實體地址劃分成大小相同的塊,透過在建立兩者之間的頁表來建立對應關係。分段管理機制使用大小可變的儲存塊,使用分段管理機制適合處理複雜的邏輯分段。分頁管理機制使用固定大小的塊,所以它適合管理物理儲存器,分頁管理機制能夠更有效地使用虛擬地址空間。
80386支援多工,因此對各個任務進行保護是非常必要的,對任務的保護可分為:同一任務內的保護,不同任務之間的保護。
a.同一任務內的保護,在同一任務內定義有四種特權級別(Previlege Level),將這些特權級別分配給段中的程式碼和資料,把最高的特權級別分配給最重要的資料和最可信任的程式碼,將較低階別的特權分給一般的程式碼和不重要的資料。特權級別用0~3來表示,用數字0表示最高特權級別,用數字3表示最低特權級別,在比較特權級別時不使用大於或小於,而是使用外層或裡層來比較,很明顯特權級別為0表示最裡層,特別級別為3表示最外層。任何一個儲存段(程式直接進行訪問的程式碼段和資料段)都有一個特權級別,在一個程式試圖訪問這個儲存時,就會進行特權級別的比較,如果小於或等於(如果等於表明同級,小於則表明是內層)處該儲存段的特權級別就可以對該儲存段進行訪問。任務在特定時刻下的特權級別稱為CPL(Current Previlege Level),看一簡單的結構示意圖:
|---------|-------|
| CodeA | DataA | 特權級別為0
|---------|-------|
|---------|-------|
| CodeB | DataB | 特權級別為1
|---------|-------|
|---------|-------|
| CodeC | DataC | 特權級別為2
|---------|-------|
|---------|-------|
| CodeD | DataD | 特權級別為3
|---------|-------|
CodeA可以訪問DataA,CodeB,DataB,CodeC,DataC,CodeD,DataD
CodeB可以訪問Datab,CodeC,DataC,CodeD,DataD,但不可以訪問CodeA,DataA
CodeC可以訪問DataC,CodeD,DataD,但不可以訪問CodeA,DataA,CodeB,DataB
CodeD處在最外層,只能訪問同級的DataD,不可以訪問CodeA,DataA,CodeB,DataB,CodeC,DataC
通常應用程式放在最外層,但由於每個應用程式的虛擬地址空間不同,因此它們被隔離保護。這種特權級別的典型用法就是:將的核心放在0層,作業系統的其餘部分放在1級,2級留給中間使用,3級放應用程式,這樣的安排的好處在於:作業系統的核心因為放在0層,因此它可以訪問任務中所有的儲存段,而1級的部分作業系統可以訪問除0級以外的所有儲存段,應用程式只能訪問自身的儲存段。
b.不同任務間的保護,透過把每個任務放在不同的虛擬地址空間來實現隔離保護,虛擬地址到實體地址之間的對映由每個任務中的對映來決定,隨著任務切換,對映函式也跟著切換,這樣可以保證任務A對映到實體記憶體中的區域與任務B對映到記憶體中的區域是不同的,儘管有可能它們的虛擬地址空間相同,但它們最終在實體記憶體中的位置是不同的,從而起到了保護作用。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004598/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 80386ASM程式設計基礎(十一) (轉)ASM程式設計
- 80386ASM程式設計基礎(十) (轉)ASM程式設計
- 基於CORBA的分散式程式設計(九) (轉)ORB分散式程式設計
- PERL物件程式設計基礎(轉)物件程式設計
- 程式設計基礎程式設計
- 玩轉Linux – shell 程式設計基礎Linux程式設計
- 詳細講解DirectDraw程式設計基礎(轉)程式設計
- Socket程式設計基礎程式設計
- Go程式設計基礎Go程式設計
- Java程式設計基礎Java程式設計
- Shell程式設計-基礎程式設計
- C程式設計基礎C程式程式設計
- shell程式設計基礎程式設計
- 網路程式設計基礎-socket基礎程式設計
- Java 基礎02Java程式設計基礎Java程式設計
- Delphi資料庫程式設計教程(九) (轉)資料庫程式設計
- 程式設計基礎知識程式設計
- shell程式設計基礎二程式設計
- 【程式設計基礎】輸出程式設計
- 【socket程式設計基礎模板】程式設計
- 網路程式設計基礎程式設計
- QML程式設計 基礎 小白程式設計
- JNI程式設計基礎(一)程式設計
- 【Java基礎】通用程式設計Java程式設計
- linux程式設計基礎Linux程式設計
- pl/sql程式設計基礎SQL程式設計
- python程式設計基礎Python程式設計
- Socket程式設計(九)程式設計
- [.net 物件導向程式設計基礎] (4) 基礎中的基礎——資料型別轉換物件程式設計資料型別
- OpenGL基礎圖形程式設計(四)基礎程式結構程式設計
- 《轉生成為前端程式設計師01-基礎篇》前端程式設計師
- 程式設計師找工作必備 PHP 基礎面試題 - 第九天程式設計師PHP面試題
- 逆向基礎(九)
- Golang併發程式設計基礎Golang程式設計
- 併發程式設計基礎(上)程式設計
- 併發程式設計基礎(下)程式設計
- JAVA網路程式設計基礎Java程式設計
- Java 基礎程式設計筆記Java程式設計筆記