找回密碼
 _註_冊_

QQ登錄

只需一步,快速開始

秋風之家論壇 門戶 科技世界 查看內容

80386存儲器管理功能

2007-6-9 03:15 AM| 發佈者: 思思| 查看: 127| 評論: 0

存儲器管理功能
    1.虛擬存儲器和物理存儲器
    虛擬存儲器是計算機體系結構中的一個重要概念。它的引入是為了讓程序員可以按比實際存在的物理存儲器大得多的空間編寫程序。這個程序可以使用的空間稱為虛擬空間。對程序員來說,可以認為機器中有一個比物理存儲器容量大得多的存儲器,這個存儲器稱為虛擬存儲器。編程所用的地址稱為虛擬地址(又稱邏輯地址)。
    虛擬存儲器的實現是由硬盤等外部存儲器(又稱輔存)提供支持的。因為用戶編寫程序時,程序是放在磁盤上的,而執行程序時可採用一定算法,僅僅將當前以及最近一段時間內要用的程序和數據加載到物理存儲器上,暫時不用或剛剛用過,在一段時間內不再使用的程序和數據放在或放回到磁盤上,所以程序所用的空間可以比物理空間大得多。
    物理空間的分配和虛擬地址到物理地址的轉換,通常是由操作系統進行的,但是80386本身具有支持這種存儲器管理的功能。
需要指出的是:80386本身支持的虛擬存儲器的大小是由其內部的體系結構決定的。
前面已經看到80386的段寄存器的格式和含義,它們的選擇器字段是從全局描述符表GDT或局部描述符表LDT中選擇一個段描述符,即選擇一個段。由于這個段可能不存在于實際的物理存儲器中,因此屬于虛擬存儲器中的段。由于段選擇器的高14位(13位索引號和1位TI位)是用來進行段描述符選擇的,因此虛擬存儲器中可包含有214個段。而一個段最大可為232B,所以虛擬空間為214×232 B=246 B=64 TB。
    TI位把這個64 TB的地址空間分成全局地址和局部地址兩個空間,分別為32 TB,即每個地址空間最多擁有8192(213)個段。訪問這兩個地址空間的哪一個,由段選擇器的TI位來區別。TI位為0時,訪問的是全局地址空間;TI位為1時,訪問的是局部地址空間。
    全局地址空間為所有任務共享,這樣可以避免相同的系統服務程序產生不必要的重復,而且使得對共用的數據及中斷等處理變得更加容易。因此,這個地址空間裝有操作系統的軟件、庫程序以及共用系統服務程序中的子程序和數據等。
    局部地址空間是每一個任務分別獨立佔有的地址空間,存放每個任務自己的代碼和數據。採用這種方法,可以實現任務之間在虛擬地址空間上的相互隔離。
  2.虛擬地址到物理地址的轉換
  虛擬地址(邏輯地址)通常由兩部分組成:段選擇器和偏移地址。段選擇器用來選擇一個段,偏移地址用來指出操作數在所選擇的段中的偏移量。例如:
    MOV FS:IOTA,AL
    該指令中IOTA用來指定偏移地址。該指令的功能是:將寄存器AL的內容存入FS的選擇器字段所選擇的段中偏移量為IOTA的虛擬地址單元中。例如:
    MOV EAX,DS:[EBX]
    該指令的功能是:將DS的選擇器字段所選擇的段中由.EBX內容代表的偏移量所確定的虛擬地址單元開始的4個字節的內容送人EAX。
  如圖7.23所示是虛擬地址到物理地址的轉換的粗框圖。虛擬地址先通過段管理部件轉換成32位的線性地址,而後,頁管理部件將線性地址轉換成32位的物理地址。如果不啟用分頁功能,則線性地址就直接作為物理地址。


     下面分別介紹三種模式下虛擬地址到物理地址的轉換。
    1)實模式下的地址轉換
    80386在實模式下把段選擇器的值乘以16送到段寄存器的描述符寄存器的基地址字段,作為訪問存儲器的基地址。虛擬地址中的偏移地址與這個基地址相加,便形成所對應的物理地址。在實模式下,一個段的大小被固定為64 KB,因此描述符寄存器的邊界字段被設置成OFFFFH。
    80386在實模式下的地址轉換如圖7.24所示。這種模式下的地址轉換和8086系統中形成物理地址是一致的。


 
    2)虛擬8086模式下的地址轉換
    圖7.25是虛擬8086模式下的地址轉換示意圖。可以看出,和實模式下的地址轉換的區別在于增加了可選的分頁功能。在該模式下,由段選擇器決定的基地址與偏移地址相加的結果為線性地址。如果啟用了分頁功能,則需通過頁管理部件將其轉換成物理地址;否則,直接將其作為物理地址。


 
    3)保護模式下的地址轉換
    段寄存器的選擇器字段也是用來指定一個段,在這一點上和實模式時相同,不過它的值是用來訪問描述表,從中選擇一個段描述符,因而間接決定一個段。保護模式下的地址轉換如圖7.26所示,圖中省略了所對應的物理段。


    段選擇器的TI位用來選擇GDT或LDT。其索引號乘以8後與TI所選擇的描述符表的基地址(由相應的描述符表地址寄存器確定)相加,結果指向所對應的段描述符。CPU自動將該描述符加載到描述符寄存器(注意:圖中的描述符寄存器與段選擇器屬于同一個段寄存器)。于是確定了這個虛擬地址所對應的段在物理存儲器中的實際位置、大小及屬性。
    在保護模式下,描述符寄存器中的基地址與偏移地址相加的結果也為線性地址,線性地址到物理地址還需要轉換,在這一點上和虛擬8086模式時相同。
  需要指出:為了加速從虛擬地址到線性地址的變換,在程序中只有在對段寄存器進行初始化設置時才需要訪問存儲器中的描述符表,而以後CPu執行訪問該段的指令時,虛擬地址到線性地址的轉換不必訪問描述符表,而直接利用(段寄存器)描述符寄存器中的現有值。
例如程序段:
    MOV AX,DATA
    MOV FS,AX
    MOV AH,FS:IOTA    
    第一條指令是將準備賦給FS選擇器字段的值DATA送AX。
    第二條指令是對FS進行設置。執行該指令時需要訪問描述符表,如圖7.27所示。



    第三條指令中,FS:IOTA為虛擬地址。CPU把它變換成線性地址時不訪問描述符表,而直接使用已加載到FS的描述符寄存器中的段基址,再加上偏移地址:IOTA,形成線性地址。
    4)頁功能的引入
    前面已經看到80386設置有段管理機構。由于虛擬空間遠遠大于物理空間,而可用的物理空間即實際安裝的內存儲器又常常小于可配置的物理空間(在80386機時代,一般為8MB、16 MB,大一些也只有64 MB,離4 GB相差甚遠),因此存在于虛擬存儲器中的段不可能一次全部加載到物理存儲器(實裝內存)上。當建立一個新任務或創建一個新進程時,操作系統為它分配存儲空間,將它所用的段(或一部分段)從虛擬空間(硬盤)加載到物理空間(實裝內存);當任務運行結束或進程消亡時,釋放其佔用的物理空間。當物理空間已佔滿,若再要把虛擬空間中的段加載到物理空間時,則需要把已加載在物理存儲器中而至今尚未被訪問過或訪問頻度低的段保存到硬盤上去(如果不再使用,則可以覆蓋掉)。
    如果對段的長度不加任何限制,即段中的字節數可以是任意的,則在多次分配和釋放存儲空間,即進行多次段的調度後,連續的存儲區就可能成為佔用區和空閒區交叉的不連續的存儲區,即產生所謂“碎片”問題。盡管空閒區的總的存儲容量遠遠大于新任務所要求的存儲容量,但是因為其不連續而使新任務的段不能調入,新任務也就不能運行。顯然,這造成了存儲空間的浪費,也影響了系統運行多任務的能力。此外,如果只有段為調度單位,而段一般都比較大,所以需在內存與硬盤之間頻繁進行大塊信息的交換,這會降低系統性能。為此,80386中引入了頁功能,把4 KB的空間稱為一頁,即把線性空間和物理空間都以4 KB為
單位分成頁,分別稱為線性頁和物理頁(或叫實頁),如圖7.28所示。


     在引入頁功能的情況下,段的長度取頁的整數倍,而在分配存儲空間和進行段的調度時,以一頁為最小單位,即根據需要,可一次只將段中一部分頁調到內存。這樣大大方便了段的調度。由于每次進行的是小塊信息交換,所以對系統性能不會造成影響。
  5)線性地址到物理地址的轉換
  由于線性頁和物理頁的大小相等,都是4 KB,在進行線性地址到物理地址變換時,其低12位是相同的,為頁內偏移量。轉換主要是解決如何由線性頁確定出對應的物理頁。這種轉換一般採用在物理存儲器中設置轉換表的方法。80386採用二級轉換表,即一個頁目錄表和最多1 024個頁表。頁目錄表和頁表的長度都是4 KB,都包含1 024個表項,每個表項都為4個字節。每個頁目錄表的表項存有指向一個頁表的指針(頁表基地址)及其他有關信息。每個頁表的表項存有指向物理頁的指針(物理頁基地址)及其他有關信息,即頁表中每一表項確定了一個線性頁和物理頁的對應關系。每個頁表實際上對應了1 024×4 KB=4 MB物理地址空間,而頁目錄表的每一表項對應了一個頁表,因此,整個頁目錄表對應了l 024×4
MB=4 GB即整個物理地址空間。頁目錄表的指針(基地址)保存在控制寄存器CR3中。
  線性地址到物理地址轉換如圖7.29所示。



  從數的二進制表示可知,線性地址高10位的某一組合對應4 MB(222)物理空間,即一個頁表所對應的範圍,而一個頁表是由頁目錄表的一項所確定的,因此,線性地址高10位可用來確定頁目錄表中對應的表項,稱之為頁目錄索引。
    同樣從數的二進制表示可知,線性地址中間10位的某一組合對應4 KB(212)物理空間,即頁表中一項所對應的範圍,因此,線性地址高10位可用來確定頁目錄表中對應的表項,稱之為頁表索引。
    線性地址的低12位與物理地址的低12位是一致的,同為頁內偏移。
    在對線性地址的三部分理解之後,就不難理解線性地址到物理地址轉換過程。
    線性地址的高10位(頁目錄索引)乘以4(每個頁目錄項為4字節)並將結果與頁目錄表指針(在CR3內)相加,就得到所對應的頁目錄項在頁目錄表中的起始位置。取出其內容,共4個字節32位。其高20位為頁表地址指針,低12位為該頁目錄項的屬性(如:用該頁目錄項進行地址轉換是否有效、該頁目錄項對應的4 MB空間的訪問權等)。再將線性地址的中間10位(頁表索引)乘以4(每個頁表項為4字節)並將結果與上面形成的頁表地址指針相加,得到所對應的頁表項在頁表中的起始位置。取出其內容,共4個字節32位。高20位為物理頁地址指針,低12位為該頁表項的屬性(如:用該頁表項進行地址轉換是否有效、該頁表項對應的一頁空間的訪問權等)。最後,將物理頁地址指針與線性地址的低12位(頁內偏移量)相加,便得到線性地址所對應的物理地址。
    需要解釋的是:頁目錄表、頁表及頁的基地址都是4 KB的整數倍,其低12位都是0,所以在給出它們的地址指針時,給出高20位即可。同樣,在CR3中也是用高20位存放頁目錄表指針。
  6)轉換旁視緩衝器TLB
  從上面的轉換過程可以看出,進行一次轉換需要訪問兩次內存:一次訪問頁目錄表,一次訪問頁表。為了加速地址轉換過程,80386在芯片內部設置了一個稱為轉換旁視緩衝器TLB(Translation Lookside Buffer)的部件,如圖7.30所示。


 
  TLB可以存放當前常用的32個線性頁面值(線性地址的高20位,即所在線性頁的基地址的高20位,又可看成線性頁的頁編號)和所對應的物理頁面值(物理地址的高20位,即所在物理頁的基地址的高20位,又可看成物理頁的頁編號),此外還包含頁的訪問權等屬性。
    當線性地址需要轉換時,首先將其高20位和TLB中線性頁面值進行比較。有兩種可能:一是和其中一個相等,則立即可得到所對應的物理頁面值(僅需要半個時鐘週期);二是和所有32個線性頁面值都不等,則通過常駐于存儲器中的頁目錄表和頁表進行轉換,與此同時,80386把新的轉換信息(即該線性地址高20位以及所對應的物理地址高20位)拿來取代TLB原有的一個條目,一般是將最近較少使用的條目替換掉。因此,在TLB中總是保留著最近進行的頁面轉換信息。我們把前一種情況稱為命中,把命中的次數與地址轉換總次數之比稱為命中率。TLB具有32項,能表示出當前常用的32個線性頁與物理頁的對應關系,而每頁為4 KB,因此TLB實際上表示出128 K個線性地址和物理地址的對應關系。由于程序和數據具有局限性,而TLB中可容納128 K個地址轉換信息,因此,利用TLB進行地址轉換有極高的命中率,一般可達98%左右。
  關于頁功能還需指出:採用頁功能時,線性地址仍屬于虛擬地址範圍,即線性頁面屬于虛擬頁面。實裝的物理存儲器的大小幾乎都小于線性地址空間,當然更遠遠小于每個程序可用的虛擬地址空間,這樣才符合虛擬存儲器概念引入的目的和經濟上的利益。因此,在任何時刻,虛擬頁面都只能有一部分被存儲在實際存儲器裡,那些沒有放在存儲器中的頁面,則通常被存放在輔存(硬盤)中。當然,程序可以使用任何一個虛擬頁面。當對某個虛擬頁面進行操作,發現該頁不在物理存儲器中,80386本身會產生異常中斷,操作系統可在相應的中斷處理程序中把當前加載在存儲器中某個頁面(一般是最近最少使用的頁)存回到輔存中去,再將用戶程序用到的頁面加載到存儲器中。
  對80386來說,既有段的管理又有頁的管理。編程用到的段可看成是由若幹虛擬頁組成的。對段和頁的調度屬于操作系統的管理範疇,不過,80386從硬件上提供了這方面的支持。


鮮花

握手

雷人

路過

雞蛋

最新評論

相關分類

Archiver|手機版|小黑屋|秋風之家論壇

GMT+8, 2025-9-5 10:27 AM , Processed in 0.022984 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回頂部