官术网_书友最值得收藏!

1.2.3 存儲器組織

個人計算機主板上的內存條和一個ROM芯片構成主存儲器,保存正在運行使用的指令和數據。處理器從主存儲器讀取指令,在執行指令的過程中讀寫數據。

主存儲器是一個很大的信息存儲庫,被劃分成許多存儲單元。為了區分和識別各個存儲單元,并按指定位置進行存取,給每個存儲單元編排一個順序號碼,該號碼稱為存儲單元地址(Memory Address)。現代計算機中,主存儲器采用字節編址,即主存儲器的每個存儲單元具有一個地址,保存一個字節(8個二進制位)的信息,因此也稱為字節可尋址,因為通過存儲單元地址可以訪問到一個字節信息。

對存儲器的基本操作是按照要求向指定地址(位置)存進(寫入,Write)或取出(讀出,Read)信息。只要指定位置就可以存取的方式,稱為“隨機存取”。

計算機存儲信息的基本單位是一個二進制位(bit),一個位可存儲一位二進制數0或1,一般使用小寫字母b表示。8個二進制位組成一個字節(Byte),常用大寫字母B表示,位編號自右向左從0開始遞增計數,分別為D0~D7,如圖1-4所示。8086和80286字長為16位,由2個字節組成,稱為一個字(Word),位編號自右向左為D0~D15。IA-32處理器字長為32位,由4個字節組成,稱為雙字(Double Word),位編號自右向左為D0~D31。右邊最低位稱為最低有效位(Least Significant Bit,LSB),即D0位;左邊最高位稱為最高有效位(Most Significant Bit,MSB),對于字節、字、雙字分別指D7、D15和D31位。

圖1-4 數據的位格式

1.存儲模型

主存儲器需要處理器通過總線進行訪問,稱為物理存儲器。物理存儲器的每個存儲單元有一個唯一的地址,這個地址就是物理地址(Physical Address)。物理地址空間從0開始順序編排,直到處理器支持的最大存儲單元。8086處理器只支持1MB存儲器,其物理地址空間是0~220-1,用5位十六進制數表示為00000H~FFFFFH。IA-32處理器支持4GB存儲器,其物理地址空間是0~232-1,用8位十六進制數表示為00000000H~FFFFFFFFH。

表達存儲容量時常使用的單位及數量如表1-2所示。它們雖然借用了日常生活中的千、兆、吉等單位,但沒有使用其103的倍數關系,而是210=1024的倍數關系(近似103,即1000)。有些產品(如硬盤、U盤)的生產廠商給出的容量采用103倍數關系,請注意分辨。

表1-2 存儲容量的常用單位

為了有效地使用存儲器,幾乎所有操作系統和核心程序都具有存儲管理功能,即動態地為程序分配存儲空間的能力。IA-32處理器內部包含存儲管理單元,提供分段和分頁管理機制,以存儲模型形式供程序員使用主存儲器。

利用存儲管理單元之后,程序并不直接尋址物理存儲器。IA-32處理器提供了3種存儲模型(Memory Model),用于程序訪問存儲器。

(1)平展存儲模型

平展存儲模型(Flat Memory Model)下,對程序來說存儲器是一個連續的地址空間,稱為線性地址空間。程序需要的代碼、數據和堆棧都包含在這個地址空間中。線性地址空間也以字節為基本存儲單位,即每個存儲單元保存一個字節且具有一個地址,這個地址稱為線性地址(Linear Address)。IA-32處理器支持的線性地址空間是0~232-1(4GB容量)。

(2)段式存儲模型

段式存儲模型(Segmented Memory Model)下,對程序來說存儲器由一組獨立的地址空間組成,這個地址空間稱為段(Segment)。通常,代碼、數據和堆棧位于分開的段中。程序利用邏輯地址(Logical Address)尋址段中的每個字節單元,每個段都可以達到4GB。

在處理器內部,所有的段都被映射到線性地址空間。程序訪問一個存儲單元時,處理器會將邏輯地址轉換成線性地址。使用段式存儲模型的主要目的是增加程序的可靠性。例如,將堆棧安排在分開的段中,可以防止堆棧區域增加時侵占代碼或數據空間。

(3)實地址存儲模型

實地址存儲模型(Real-address Mode Memory Model)是8086處理器的存儲模型。IA-32處理器支持這種存儲模型是為了兼容原來為8086處理器編寫的程序。實地址存儲模型是段式存儲模型的特例,其線性地址空間最大容量為1MB,由最大為64KB的多個段組成。

2.工作方式

編寫程序時,程序員需要明確處理器執行代碼的工作方式,因為工作方式決定了可以使用的指令和存儲模型。IA-32處理器支持3種基本的工作方式(操作模式):保護方式、實地址方式和系統管理方式。

(1)保護方式

保護方式(Protected Mode)是IA-32處理器固有的工作狀態。在保護方式下,IA-32處理器能夠發揮其全部功能,可以充分利用其強大的段頁式存儲管理以及特權與保護能力。保護方式下,IA-32處理器可以使用全部32條地址總線,可尋址4GB物理存儲器。

IA-32處理器從硬件上實現了特權的管理功能,方便操作系統使用。它為不同程序設置了4個特權層(Privilege Level):0~3(數值小表示特權級別高,所以特權層0級別最高)。例如,特權層0用于操作系統中負責存儲管理、保護和存取控制部分的核心程序,特權層1用于操作系統,特權層2可專用于應用子系統(數據庫管理系統、辦公自動化系統和軟件開發環境等),應用程序使用特權層3。這樣,系統核心程序、操作系統、其他系統軟件以及應用程序可以根據需要分別處于不同的特權層而得到相應的保護。當然,如無必要不一定使用所有的特權層。例如,在PC中,Windows操作系統處于特權層0,應用程序則處于特權層3。

保護方式具有直接執行實地址8086軟件的能力,這個特性稱為虛擬8086方式(Virtual-8086 Mode)。虛擬8086方式并不是處理器的一種工作方式,只是提供了一種在保護方式下類似于實地址方式的運行環境。例如,Windows中的MS-DOS運行環境。

處理器工作在保護方式時,可以使用平展或段式存儲模型;處理器工作在虛擬8086方式時,只能使用實地址存儲模型。

(2)實地址方式

通電或復位后,IA-32處理器處于實地址方式(Real-address Mode,簡稱實方式)。它實現了與8086相同的程序設計環境,但有所擴展。實地址方式下,IA-32處理器只能尋址1MB物理存儲器空間,每個段最大不超過64KB;但可以使用32位寄存器、32位操作數和32位尋址方式,相當于可以進行32位處理的快速8086。

實地址方式具有最高特權層0,而虛擬8086方式處于最低特權層3。所以,虛擬8086方式的程序都要經過保護方式確定的所有保護性檢查。

實地址工作方式只能支持實地址存儲模型。

(3)系統管理方式

系統管理方式(System Management Mode,SMM)為操作系統和核心程序提供節能管理和系統安全管理等機制。進入系統管理方式后,處理器首先保存當前運行程序或任務的基本信息,然后切換到一個分開的地址空間,執行系統管理相關的程序。退出SMM方式時,處理器將恢復原來程序的狀態。

處理器在系統管理方式下切換到的地址空間,稱為系統管理RAM,使用類似于實地址的存儲模型。

3.邏輯地址

不論是何種存儲模型,程序員都采用邏輯地址進行程序設計,邏輯地址由段基地址和偏移地址組成。段基地址(簡稱段地址)確定段在主存中的起始地址。以段基地址為起點,段內的位置可以用距離該起點的位移量表示,稱為偏移(Offset)地址。邏輯地址常借用MASM匯編程序的方法,使用英文冒號(:)分隔段基地址和偏移地址。這樣,存儲單元的位置就可以用“段基地址:偏移地址”表示。存儲單元可以處于不同起點的邏輯段中(當然對應的偏移地址也就不同),所以可以有多個邏輯地址,但只有一個唯一的物理地址。編程使用的邏輯地址由處理器映射為線性地址,在輸出之前轉換為物理地址。

編寫應用程序時,通常涉及3類基本段:代碼段、數據段和堆棧段。

代碼段中存放程序的指令代碼。程序的指令代碼必須安排在代碼段,否則將無法正常執行。程序利用代碼段寄存器CS獲得當前代碼段的段基地址,指令指針寄存器EIP保存代碼段中指令的偏移地址。處理器利用CS:EIP取得下一條要執行的指令。CS和EIP不能由程序直接設置,只能通過執行控制轉移指令、外部中斷或內部異常等間接改變。

數據段存放當前運行程序所用的數據。一個程序可以使用多個數據段,以便于安全有效地訪問不同類型的數據。例如,程序的主要數據存放在一個數據段(默認用DS指向)中,只讀的數據存放在另一個數據段中,動態分配的數據存放在第3個數據段中。使用數據段,程序需要設置DS、ES、FS和GS段寄存器。數據的偏移地址由各種存儲器尋址方式計算出來(詳見第2章)。

堆棧段是程序所使用的堆棧所在的區域。程序利用SS獲得當前堆棧段的段基地址,堆棧指針寄存器ESP保存堆棧棧頂的偏移地址。處理器利用SS:ESP操作堆棧數據。

4.段選擇器

邏輯地址的段基地址部分由16位的段寄存器確定。段寄存器保存16位的段選擇器(Segment Selector)。段選擇器是一種特殊的指針,指向對應的段描述符(Descriptor),段描述符包括段基地址,由段基地址就可以指明存儲器中的一個段。段描述符是保護方式引入的數據結構,用于描述邏輯段的屬性。每個段描述符有3個字段,包括段基地址、段長度和該段的訪問權字節(說明該段的訪問權限,用于特權保護)。

根據存儲模型不同,段寄存器的具體內容也有所不同。編寫應用程序時,程序員利用匯編程序的命令創建段選擇器,操作系統創建具體的段選擇器內容。如果編寫系統程序,程序員可能需要直接創建段選擇器。

平展存儲模型下,6個段寄存器都指向線性地址空間的地址0位置,即段基地址等于0,偏移地址等于線性地址。應用程序通常設置兩個重疊的段:一個用于代碼,一個用于數據和堆棧。CS段寄存器指向代碼段,其他段寄存器都指向數據段和堆棧段。

當使用段式存儲模型時,段寄存器保存不同的段選擇器,指向線性地址空間不同的段,如圖1-5所示。某個時刻,程序最多可以訪問6個段。CS指向代碼段,SS指向堆棧段,DS等其他4個段寄存器指向數據段。段式存儲管理的段基地址和偏移地址都是32位,段基地址加上偏移地址形成線性地址。

實地址存儲模型的主存空間只有1MB(=220字節),僅使用地址總線的低20位,其物理地址范圍為00000H~FFFFFH。實地址存儲模型也進行分段管理,但有兩個限制:每個段最大為64KB,段只能開始于低4位地址全為0的物理地址處。這樣,實地址方式的段寄存器直接保存段基地址的高16位,只要將邏輯地址中的段地址左移4位(十六進制一位)加上偏移地址就得到20位物理地址。

圖1-5 段式存儲模型

5.Win32的虛擬地址分配

32位Windows操作系統工作于保護方式,使用分段和分頁機制,為程序構造了一個虛擬地址空間。盡管虛擬存儲管理比較復雜,但對Windows應用程序來說,所面對的是0~FFFFFFFFH的4GB虛擬地址(線性地址)空間。在這4GB空間中,高2GB屬于操作系統使用的地址空間,應用程序使用0~7FFFFFFFH的2GB線性地址空間,圖1-6所示為Win32進程的地址空間分配情況。例如,32位Windows應用程序通常從00400000H開始分配地址空間。

圖1-6 Win32進程的地址空間分配情況

主站蜘蛛池模板: 玉环县| 德安县| 墨脱县| 确山县| 阜新| 开化县| 兴安县| 甘肃省| 富平县| 香格里拉县| 青浦区| 抚远县| 娄底市| 牟定县| 元谋县| 井冈山市| 新乡市| 淮北市| 双城市| 镇江市| 恭城| 仪陇县| 黄石市| 惠水县| 黔江区| 商都县| 宜宾县| 宁武县| 茶陵县| 陵川县| 湘阴县| 榆林市| 新泰市| 宜兰县| 高密市| 治多县| 高要市| 大同县| 米脂县| 延庆县| 武宁县|