1. 程式人生 > >記憶體術語詳解

記憶體術語詳解

    你可能聽到或讀到過expanded memory(擴充記憶體),EMs,Extended memory(擴充套件記憶體),XMS,EMM,UMB,HMA,VCPI,以及DPMI這些術語。為解釋諸程式如何被分配來訪問1MB以外的記憶體,本篇將定義這些術語,這樣當這些概念同後面各篇相聯絡時你就熟悉它們了。正如我們現今所知道的那樣Pc機的體系結構以完全可使用的1024K(1MB)記憶體空間為基礎。就DOS而言,1MB就是可供使用的全部記憶體,但對現實世界的使用而言,1MB記憶體被證明為太少;使用者們希望擁有比較大的文件和較大的電子資料表和資料庫,而程式設計師們編寫更強有力的程式則要求更大的可執行檔案(執行諸程式的諸檔案)。
    為響應Pc機的普及和使用者們的不斷變化的需要,程式設計師們和硬體丁程師們努力探索提供更多記憶體和使用這些記憶體的方法。實際上提供更多的記憶體並不是太大的問題:只需插入更多的晶片或記憶體卡。要使額外的記憶體可以使用則是現實的挑戰。顯然,需要更多的記憶體空間,所以計算機行業開發了使用1MB以外記憶體的諸多標準。

擴充記憶體(Expanded Memory)

    這些標準中的第一個就是擴充記憶體(Expanded Memory)。擴充記憶體是指1MB以上的額外記憶體,它可以被程式訪問(且在某些情形下由硬體訪問),後者使用擴充記憶體規範(在本篇後面解釋)。把擴充記憶體稱為一個持定邊界(諸如640K或1024K)之外的記憶體是不正確的,因為擴充記憶體沒有實在的位置,直到它被對映為止。這就是我們把擴充記憶體稱之為“在別的某處”的原因。擴充記憶體可在任何型號的IBM Pc相容計算機:8088,8086,80286,i386,i486,以及更高機型上使用。它被髮明用於1985年使用的任何Pc及以後的計算機上。雖然286及後來的處理器擁有保護模式,它們能夠使用擴充套件記憶體(在本章稍後討論),但使用比1MB更多的記憶體的第一個標準發明被用來從8088開始的任何處理器上,以便為以後儘可能大的程式和使用者服務。在386及以後的計算機上,使用額外記憶體所必需的記憶體管理程式已被設值到該處理器晶片(cPu)中。在286及以下的計算機上要求特殊的擴充記憶體硬體(通常是一個記憶體擴充板)以提供擴充記憶體。

擴充記憶體規範(EMS)

    為使用擴充記憶體,諸程式必須遵守擴充內布規範(EMS)--規定訪問擴充內作的規則。1985年Lotus開發出EMS使程式能訪問更多的記憶體。Intel通過製造擴充記憶體板而加入。在EMS發表之後不久。Microsoft請求對規範作一些修改,並請求加入該聯盟。於是我們就有了門LIM/EMS--Lotus、Intel、Microsoft/擴充記憶體規範。然而,所有擴充記憶體問題都更適合於叫做EMS。

EMS如何工作

    EMS按間接方式工作。EMS是使DOS認為位於記憶體中某處的資料實際上儲存在較低的640K中。
    EMS將一塊記憶體地址重新定向到另一塊記憶體地址。這些塊可高達1MB——於是提供了程式本身可在擴充記憶體中執行的途徑。這意味著程式可以更大。而更大的程式則可以更快地做更多的工作。
    為什麼EMS必須將記憶體重新定向呢?因為DOS只能在640K以下看到應用程式和它們的資料。對任何1024K以外的記憶體DOS是看不見的。擴充記憶體硬體上可顯示位於別的某處的一片記憶體,彷彿它處在1024K以下的一個地址,而不管它實際上位於何處。這個用另一個記憶體塊的地址表示—個記憶體塊的過程叫做對映。通過硬體和軟體的組合擴充記憶體片就冒充為常規記憶體。DOS並不聰明,故程式可通過訪問處於叫做頁面的記憶體片段而使用比以前多得多的記憶體。

為使擴充記憶體投入使用,要使三件事一起進行。

1、遵循EMS編寫程式;這樣一個程式通常執行得快得多而且可以比僅可在常規記憶體中執行的程式能訪問更多的資料。

2、在該計算機上安裝記憶體管理硬體。無論你有何種型別的計算機,都需要安裝超過1MB的實際的記憶體(晶片或卡)。在286或較低的計算機上正確型別的記憶體管理硬體是擴充記憶體卡(不是擴充套件記憶體卡——擴充套件記憶體和擴充記憶體是不同的)。在366或更好的計算機上正確型別的記憶體硬體則是處理器晶片本身(這些硬體已包含在處理器晶片中)。

3、一個EMM(擴充記憶體管理程式):一個EMM是一個控制擴充記憶體規範支援的額外記憶體的程式。該EMM是解釋所有記憶體呼叫並將它們定向以確保所有程式、裝置和在計算機中的其它記憶體引用在它們需要時得到它們想要的東西、而無衝突的交通警察。
  EMM的例子是EMM386(隨D055和D056而來的),QEMM和386MAX。

擴充套件記憶體(Extended Memory)

    擴充套件記憶體是在286或更高檔的計算機上的1MB以上的記憶體。訪可擴充套件記憶體比訪問擴充記憶體簡,因為在286及更高檔的計算機上的處理器晶片被設計成"知道"關於巳安裝額外記憶體的情況。不能在低於286的計算機亡使用擴充套件記憶體,因為其處理器並非為此而設計。遺憾得很,Dos並不知道如何完成訪問擴充套件記憶體的該簡單功能。不像擴充記憶體(它可以真實模式使用),擴充套件記憶體僅可以保護模式使用。再DOS下使用擴充套件記憶體的程式需要將該處理器置於一種特殊模式以使用擴充套件記憶體並返回另一模式以同DOS對話。

真實模式和保護模式

    —臺Pc機可有若干種操作模式。一臺8086擁有一種操作模式:真實模式。一臺286擁有兩種模式:真實模式和保護模式。一臺i386擁有四種模式:真實模式、保護模式、虛擬8086模式和平坦型32位模式。每種模式都容許對記憶體和其它功能的不同的訪問。每一種模式都可訪問完全不同的處理器模型。取決於處理器提供的較好的記憶體管理和較新的程式。為執行老的和新的兩個現存的程式,在該晶片中有各種處理器模型可供使用。你的軟體將計算機置於必要的模式以供給軟體所希望的記憶體類別。通常使用DOS擴充套件器做此事。

    一個DOS擴充套件器是設置於一個DOS擴充套件程式中的一個特殊程式。當該程式想使用D0S,例如寫一個檔案時,它就進行一次“DOS呼叫”。該DOS擴充套件器監視這些DOS呼叫,並確保在DOS呼叫發生時,該程式將處理器團換到真實模式。DOS擴充套件器讓D0S進行其工作,然後將該處理器切換回保護模式以便該程式可繼續工作。

    真實模式
    在286、386、i486或Pentium計算機的三種操作模式中是最為相容的。在真實模式
下,386處理器表現為復原成8086處理器。真實模式是任何D0S程式都可在任何80x86計算機
上執行的模式。一個Dos擴充套件程式必須從保護模式切換到真實模式以訪問任何DOS服務(如像
儲存一個檔案)。在真實模式下,程式不能訪問一臺386計算機的任何先進功能,如高階的記憶體
管理和保護。

    保護模式
    保護模式是DOS擴充套件程式可在其中執行並將其資料儲存在擴充套件記憶體中的模式。一個
DOS擴充套件程式就是一個不僅可把資料儲存在擴充套件記憶體中,而且在擴充套件記憶體中執行它自己的代
碼的程式。為了做此事,DOS擴充套件程式必須處在保護模式。在保護模式下,程式可訪問386
處理器晶片上的分頁的記憶體管理單元並使用該處理器的32位暫存器和定址模式。保護模
式和使用它的DOS擴充套件程式急劇地增加了Pc機上記憶體的使用,使得可使用前所未有的更
多資料的更大而又更快的程式成為可能。


擴充套件記憶體規範:XMS

    叫做擴充套件記憶體規範(xMs)的一個新規範被開發來管理擴充套件記憶體的使用。XMS提供對640K以亡的多達4千兆位元組記憶體的訪問。為做此事,需要在計算機上擁有XMS驅動程式,它是一個嚴格的XMS驅動程式,諸如Microsoft的HIMEM.SYS,或者包含除其它記憶體管理功能(EMM、高RAM訪問等等)之外的一個XMS管理程式,諸如Quanerdeck的QEMM,QEMM.386,以及其它的第三方記憶體管理程式,針對那些仍想使用擴充記憶體的程式將擴充套件記憶體變換成擴充記憶體。因此,無論你的軟體使用EMS還是XMS,記憶體分配都是透明的,這意味著,不必告訴記憶體硬體,某些記憶體被分派來作EMS,而其另一部份則被分派作XMS。
    存在著一個程式可訪問擴充套件記憶體的若干方式。可通過從記憶體頂部或者從記憶體底部讀、寫分配記憶體地址。使用擴充套件記憶體的第一批程式之一是VDISK。它使用從底到頂的分配方法。其它程式也使用這種方法訪問擴充套件記憶體,QEXT就是一個這樣的程式。一個程式可有選擇地位用一個XMS驅動程式來進行記憶體分配,然後通過該XMS驅動程式得到它的記憶體。這是最常見而又最希望的利用擴充套件記憶體的方法,因為如果程式使用了利用記憶體的行業標準手段,則它就可以於使用同樣標準的其它程式共存。使用XMS驅動程式,記憶體管理器(與程式相反)就百接得到該記憶體,而將少量記憶體給呼叫該XMS驅動程式的程式,
    XMS要求DOS 3.0或更高版本。

A20選通

    在引導時,計算機可能顯示一條訊息諸如“A20線被啟動”。XMS利用A20線使用1024K以上的記憶體。 A20線是在主機板上的硬體與處理器晶片的能力的組合。該A20線是80x86CPU的第21條地址線,它允許訪問1024K以上的記憶體。若該A 20線被選通,則該處理器可看到1MB以上的記憶體。如果該A20線不被允許,則對1MB以上的一個記憶體地址的任何引用都徑直向下折回到記憶體的起始處。該機制叫作A20“選通”,因為它決定地址線20、21、22和23(在386PC機上直到31)究竟是否被允許成為可看見的(被選通)。使用A20線,XMS還可在真實模式下比它在其它情形下多利用新創立的64K常規記憶體。


高記憶體區(HMA)
    高記憶體區(HMA)是擴充套件記憶體的前64K。是幾乎64K。記憶體術語充滿了例外。HMA實際上是64K減去l6位元組,因為HMA開始於上位記憶體區(UMBs)的頂部16個位元組。該HMA是唯一的。因為在真實模式下,在其中的程式碼可被執行。這是因為它可由存在於lMB以下的16位元組地址空間攫取。我們對這l6個位元組吹毛求疵的緣由就在於要專門編寫來在此HMA中執行的程式才可利用該快閃記憶體,雖然大多數程式沒有進行重大修改,可使用HMA的程式的例子是使用DOS=HIGH的DOS 5和DOS 6,DESQview,DR DOS和Novell的XMSNET。HMA是那些可被用來增加在640K以下可供使用的記憶體數量的DOS記憶體區的小暗角之一。

上位記憶體塊(UMBs)和擴充套件記憶體塊(EMBs)

    在本篇中所討論的所有記憶體規範都集中於得到對更多記憶體的訪問。儘管在1MB以上的廣大區域已被開放供使用,但640K以下的記憶體是最有用的,因為以DOS可理解在那裡進行的一切並以之進行工作,DOS的裝置驅動程式要求非常少的640K以下的記憶體.但使用EMS的程式和標準(非擴充套件)的DOS程式專門在640K以下執行。為在該區域中獲得更多的記憶體資源,XMS提供使用在640K和1024K之間的記憶體而不是640K以下的記憶體的方法。通過創立可在那裡裝載裝置驅動程式的UMBs而完成。

UMBs

    以80x86為基礎的計算機上,位於640K和1MB地址邊界之間的上位記憶體塊(UMBs)是可供DOS使用的記憶體塊。這些塊的個數、容量和位置隨安裝於該機器中的硬體介面卡卡的型別不同而變化很大。
    UMBs可用以儲存通常必須位於640K以下的程式、程式碼和資料。有時被稱作“將裝置驅動程式裝入高階”。

EMBs

    擴充套件記憶體塊(EMBs)是位於HMA上面的擴充套件記憶體,只可以用於儲存資料或DOS擴充套件程式。


虛擬控制程式介面VCPI)和DOS保護模式介面(DPMI)

    其它擴充套件記憶體格式使DOS擴充套件程式的多工實施變得很容易。多工DOS擴充套件程式要求虛擬控制程式介面(VCPI)或DOS保護模式介面(DPMI),因為多工環境和在該多工環境下執行的DOS擴充套件程式兩者都使用擴充套件記憶體。VCPI和DPMI針對每個程式可如何使用擴充套件記憶體而又不與其它程式相沖突而建立更多的標準。

VCPI

    VCPI是一個1987年開發的保護模式規範,它是EMS 4.0規範的超集。VCPI被創立來通過允許需要擴充套件記憶體的程式共享擴充套件記憶體而避免在這些程式之間的衝突。在XMS之前沒有辦法使一個程式能確保它所訪問的任何記憶體不正被另一個程式所使用。

    此外,VCPI管理記憶體分配並在真實模式和保護模式之間切換。

    VCPI允許在保護模式下執行的程式與386記憶體管理程式和在其它保護模式下執行的程式共存。VCPI並不在286機器上工作,因為它不被286硬體支援。VCPI(由一個程式)呼叫受VCPI服務程式(server)支援,此服務程式通常被包含在擴充記憶體管理程式中。一個服務程式是一個像飯店服務員一樣的程式。它接受來自顧客(一個提出對記憶體請求的程式)的定單(處於記憶體呼叫形式),於是將一塊特定的記憶體給予該程式。假如一個程式進行了VCPI呼叫,但並未發現一個VCPI服務程式在執行,則該程式就直接接管該計算機硬體,並管理它自己的記憶體。該程式可直接得到它想要的記憶體,但沒有記憶體管理程式來排程以防止衝突,因此沒有其它的程式可使用該擴充套件記憶體。

    DPMI是更新近(1990年)的保護模式介面。VCPI和DPMI之間的區別主要是DPMI進行其工作而不允許應用程式訪問CPU的最低層。VCPI卻允許任何程式訪問CPU的最低層,這意味著沒有其它程式(包括作業系統)可同VCPI相抵觸。這是一個缺點,因為作業系統的設計師們並不希望程式之間相互干擾。而希望只有作業系統應該能夠看到其它程式。

    DPMI也可管理要求保護模式的一個以上的實體,例如若干個正在進行多工的保護模式程式。此外,DPMI包括一個較新的對於可由保護模式程式進行的DOS和BI0S呼叫的程式設計介面。不像VCPI,DPMI可在286機器上實現,且可跨過多個作業系統,如OS/2和UNIX以及DOS。
    為了向後相容,一個請求DPMI服務的程式,如果在進行這些呼叫時未找到DPMI服務程式,則可求助於VCPI服務程式(如果VCPI可供使用)。
    
    註釋:對本定義的例外是擴充記憶體卡。擴充記憶體卡現在全都廢棄了。

    在現在的彙編教科書上,講完了真實模式彙編後就開始講解保護模式彙編。而保護模式彙編一開始就講解平坦記憶體模式、分段記憶體管理、分頁記憶體管理等諸多概念。使得很多人難以理解。其問題就在於割裂了真實模式、保護模式之間的必然聯絡。通過本篇的講解,你可以清晰地得到其中的發展主線:
            
      真實模式(小記憶體使用、單任務)---->客戶需求、硬體進步---->保護模式(大記憶體使用、多工)---->早期階段(VCPI、無程序間保護)---->發展階段(DPMI、有保護措施)---->現今的保護模式方式間的相互關係。


保護模式始於80286

    對於80286,Intel決定以16去乘該最大可訪問記憶體而給予該286以24位的地址匯流排和最大16兆位元組的RAM。但在—個16位的CPU中計算24位的地址不像再以16去乘該段值那麼容易,並且設汁師們想把額外的能力加到定址功能中去。事實亡CPU必須以完全不同的稱為保護模式的方式執行。保護模式不僅給該處理器提供在多個程式正在執行時,保護記憶體內容的能力,而且還提供更多的記憶體地址。它使用更復雜的計算實際記憶體地址的方法。

    CPU運行於保護模式的好處是當若干程式一起共享記憶體時,每個程式都可被保證其記憶體空間將不受任何其它程式干擾。

    另一方面.8088和8086運行於真實模式它沒有任何記憶體保護。任何程式都可以訪問0K和1024K之間的任何記憶體區域。因為8088和8086均僅有一兆位元組的記憶體可用,故擁有若干程式同時在那裡的機會對那些CPu的設計師而言似乎很遙遠(不大可能),所以記憶體保護並不是一個重要功能。為了得到24值的手址。徑直以256而不以16去乘該段暫存器似乎很自然。這就使兩個暫存器僅重疊8,從而構成24位。
  然而,這不是80286工作的方式,保擴模式需要比徑直計算實際地址更多的資訊。同樣需要些保護資訊。保護模式實際使用的方法是讓該段暫存器的一部份表示記憶體中的一張表,它描述該段如何被建立。這張在其中具有針對記憶體的每一段的專案的表由CPU自動地參考。該表包含有訪問許可權(讀、寫,或者只執行),段的大小,關於該記憶體是否實際存在的資訊,以及其它事項。結果仍為24位的實際地址,但計算複雜多了。


80386--劃時代的處理器

    80386擁有更多的功能,威力更強。該晶片有32位暫存器,32位的資料匯流排和32位的地址總。這意味著什麼呢?意味著386可訪問異常大的4G的RAM。那就是四千兆位元組記憶體!但訪問更多的記憶體,僅僅才開始。除去這快閃記憶體定址容量之外就是所有附加的操作模式。386不僅支援8026的真實模式和80285的保護恢式,而且它現在工作於自己的32位的保護模式(區別於286的16位保護模式)以及虛擬的8086模式。

    32位保護模式(又稱做平坦模型(float model))容許該CPU通過使用16值段值和16位偏移一起作為一個完全的32位地址。
    在現實中,該32位平坦模型使用類似於80286保護模式的描述附表以便提供類似的保護功能。即使如此,16為段和16位偏移有效地描寫實際的實體地址這一事實,使在此模式下的變成工作容易許多。本模式還允許CPU在計算機沒有足夠的物理RAM時使用硬磁碟上的空間作為記憶體。這種“虛擬記憶體”允許程式不必關心該計算機中的實體記憶體的數量而集中於完成它們的任務。在描述符表中的部份資訊跟蹤實體記憶體。當計算記憶體參考時,就檢查該描述符以尋找記憶體。如果不是這種情形,則該磁碟被用以獲得正確的記憶體對映並將它放入實際記憶體中,於是程式繼續執行。當進行得正確時,虛擬記憶體僅表現為比實際記憶體稍慢一些,擁有訪問遠大於該計算機個的實際實體記憶體的資料區的這個好處,允許執行更大、更強有力的程式。
  
針對DOS的另一種V86模式

    雖然有些程式如AutoCAD,Paradox,OS/2和Microsoft WinDows(增強模式)利用了32位平坦模型來增加記憶體空間和速度,但DOS程式並不如此,因此該386擁有一種折衷的方法,叫做虛擬8086模式。該模式可模擬一臺對正運行於該計算機中的每一個程式具有一兆記憶體的8086。用虛擬的8086模式,許多真實模式程式可以以它們的正常方式執行而實際上則使用在其它情況下不可供它們使用的記憶體。換句話說,該80386可以分配在RAM中任何地方的1M的記憶體塊,即使該記憶體處在物理上存在於第一個1024K以外的記憶體地址中的區域內亦如此,並將每個記憶體塊分配給不同的DOS程式。當一個程式請求處在一個特定地址的記憶體時,該386記憶體管理單元(MMU)就檢查分配給那個特定程式的地址,並把所請求的地址翻譯成實際的實體地址,而該程式並不知道,就象一組8086計算機都同時擁有記憶體一樣。Microsoft wmdows使用該功能以允許DOS程式完成多工而這些程式卻不知道。

總結:
     在早期處理器時(8088,8086)由於硬體條件的限制,軟硬體工程師們致力於怎樣增加程式的可用記憶體空間(於是有了擴充記憶體概念)。到了286時代出現了INTEL的硬體工程師們研製出了286這個16位暫存器卻有24條地址線的怪胎;它可定址16兆記憶體(在當時,這可是個巨大的數字)。使得多工並行成為可能。帶來的問題是多工之間的協調工作問題。於是它被設計為具有保護執行模式的能力。由於其設計的不合理性,使它成為一個曇花一現的產品。
     386的出現具有劃時代的意義。它完善了許多286的設計缺陷。併成為INTEL的第一個32位處理器。後來的486、pentium、pentiumII保持了這個設計架構並陸續加入了超流水線、倍頻、超標量等技術。但它們的記憶體工作模式與386沒有任何不同