在分段系統中,用戶可用二維地址表示程序中的對象,但實際的物理內存仍是一維的字節序列。為此,必須借助段表把用戶定義的二維地址映射成一維物理地址。
段地址轉換與分頁地址轉換的過程基本相同,其過程如圖所示
(1)CPU計算出來的有效地址分為兩部分:段號s和段內地址d。
(2)系統將該進程段表地址寄存器中的內容B(表示段表的內存地址)與段號s相加,得到查找該進程段表中相應表項的索引值。從該表項中得到該段的長度limit及該段在內存中的起始地址base(設該段已經調入內存)。
(3)將段內地址d與段長limit進行比較。如果d不小于limit,則表示地址越界,系統發出地址越界中斷,終止程序執行;如果d小于limit,則表示地址合法,將段內地址d與該段的內存始址base相加,得到所要訪問單元的內存地址。
段頁式系統的基本機制
分頁存儲管理能夠有效地提高內存利用率,而分段存儲管理能夠很好地滿足用戶需要。把這兩種管理技術有機地結合起來,“各取所長”,就形成新的存儲管理系統——段頁式存儲管理系統。
段頁式存儲管理的基本原理是:
(1)等分內存。把整個內存分成大小相等的內存塊,內存塊從0開始依次編號。
(2)進程的地址空間采用分段方式。把進程的程序和數據等分為若干段,每段有一個段名。
(3)段內分頁。把每段劃分成若干頁,頁面的大小與內存塊相同。每段內的各個頁面都分別從0開始依次編號。
(4)邏輯地址結構。一個邏輯地址表示由3部分組成:段號s,頁號p和頁內地址d,記作v = (s, p, d),如圖所示
(5)內存分配。內存的分配單位是內存塊。
(6)段表、頁表和段表地址寄存器。為了實現從邏輯地址到物理地址的轉換,系統要為每個進程建立一個段表,還要為該進程段表中的每段建立一個頁表。這樣,進程段表的內容不再是段長和該段在內存的起始地址,而是頁表長度和頁表地址。為了指出運行進程的段表地址,系統有一個段表地址寄存器,它指出進程的段表長度和段表起始地址。
在段頁式存儲管理系統中,面向用戶的地址空間是段式劃分,而面向物理實現的地址空間是頁式劃分。就是說,用戶程序邏輯上劃分為若干段,每段又分成若干頁面。內存劃分成對應大小的塊。進程映像對換是以頁為單位進行的,使得邏輯上連續的段存放在分散的內存塊中。
頁式系統的地址轉換過程如下:
(1)地址轉換硬件將段表地址寄存器的內容B與邏輯地址(即有效地址)中的段號s相加,得到訪問該進程段表的入口地址(第s段)。
(2)將段s表項中的頁表長度與邏輯地址中的頁號p進行比較。如果頁號p小于頁表長度,則表示未越界,向下正常進行;否則,發中斷。
(3)將該段的頁表基址與頁號p相加,得到訪問段s的頁表中第p頁的入口地址。
(4)從該頁表的對應頁表項中讀出該頁所在的物理塊號f,再用塊號f和頁內地址d拼接成訪內地址。
(5)如果對應的頁未在內存,則發缺頁中斷,系統進行缺頁中斷處理。如果該段的頁表未在內存中建立起來,則發缺段中斷,然后由系統為該段在內存建立頁表。