分段
分段:程序的分段地址空間,分段尋址方案 兩個問題
分段 :是更好分離和共享
左邊是有序的邏輯地址,右邊是無序的物理地址,然后需要有一種映射的關系(段關聯機制)
各個程序的分配相應的地址
邏輯地址是內存上的,物理地址是硬盤上的
段 機制的硬件實現方案 :
程序是由若干個邏輯分段組成的,如可由代碼分段、數據分段、棧段、堆段組成。不同的段是有不同的屬性的,所以就用分段(Segmentation)的形式把這些段分離出來。
分段機制下,虛擬地址和物理地址是如何映射的?
分段機制下的虛擬地址由兩部分組成,段選擇因子和段內偏移量
段選擇因子和段內偏移量:
-
段選擇子就保存在段寄存器里面。段選擇子里面最重要的是段號,用作段表的索引。段表里面保存的是這個段的基地址、段的界限和特權等級等。
-
虛擬地址中的段內偏移量應該位于 0 和段界限之間,如果段內偏移量是合法的,就將段基地址加上段內偏移量得到物理內存地址。
在上面,知道了虛擬地址是通過段表與物理地址進行映射的,分段機制會把程序的虛擬地址分成 4 個段,每個段在段表中有一個項,在這一項找到段的基地址,再加上偏移量,于是就能找到物理內存中的地址,如下圖:
如果要訪問段 3 中偏移量 500 的虛擬地址,我們可以計算出物理地址為,段 3 基地址 7000 + 偏移量 500 = 7500。
分頁:
在分段機制中,尺寸是可變的,分頁中尺寸是不可變的;
物理(頁)幀的地址尋址方式:
(3,6),3表示的是幀號,幀的偏移量是6;
計算地址就是:2的9(幀的大小空間)次方乘以3(幀號),加上6(幀的偏移量)
邏輯頁的地址尋址方式:
、有個tlb 存了頁號和幀號的對應關系
具體步驟:
總結一下,對于一個內存地址轉換,其實就是這樣三個步驟:
-
把虛擬內存地址,切分成頁號和偏移量;
-
根據頁號,從頁表里面,查詢對應的物理頁號;
-
直接拿物理頁號,加上前面的偏移量,就得到了物理內存地址。
段頁式內存管理
內存分段和內存分頁并不是對立的,它們是可以組合起來在同一個系統中使用的,那么組合起來后,通常稱為段頁式內存管理。
段頁式內存管理實現的方式:
- 先將程序劃分為多個有邏輯意義的段,也就是前面提到的分段機制;
- 接著再把每個段劃分為多個頁,也就是對分段劃分出來的連續空間,再劃分固定大小的頁;
這樣,地址結構就由段號、段內頁號和頁內位移三部分組成。
用于段頁式地址變換的數據結構是每一個程序一張段表,每個段又建立一張頁表,段表中的地址是頁表的起始地址,而頁表中的地址則為某頁的物理頁號,如圖所示:
段頁式地址變換中要得到物理地址須經過三次內存訪問:
- 第一次訪問段表,得到頁表起始地址;
- 第二次訪問頁表,得到物理頁號;
- 第三次將物理頁號與頁內位移組合,得到物理地址。
可用軟、硬件相結合的方法實現段頁式地址變換,這樣雖然增加了硬件成本和系統開銷,但提高了內存的利用率。