分段管理是從邏輯記憶體的角度來分的,就是將使用者程式位址空間分成若干個大小不等的段,每段可以定義一組相對完整的邏輯資訊;
分頁是從物理記憶體的角度,將記憶體按頁劃分,便於減小記憶體碎片;
最早的處理器儲存空間較小,採用的是直接物理記憶體訪問的方式,這種稱為實模式;為了支援更大的儲存器,在8086時將位址匯流排擴充套件到20位,可以支援1m的定址空間;
但8086的資料處理匯流排為16位,無法直接定址1mb記憶體空間,所以8086提供了段位址加偏移位址的位址轉換機制,就是我們常見的」段位址(16位):偏移位址(16位或有效位址)」,實際的計算方法為:」段位址*0x10h+偏移位址」;作為段位址的資料是放在段暫存器中的(16位),而作為位偏移位址的資料則是通過8086提供的定址方式來計算而來的(16位);
下面簡單的示意圖簡單的描述計算過程:
+-----------------+
| 20 | 20位位址匯流排
+-----------------+
+------------+
| 16 | 16位段位址
+------------+
+-------------+
| 12 | 4 | 16位記憶體位址(段內偏移量)
+--------+----+
實際實體地址 = (段暫存器位址 << 4) + (cpu 提交的訪存位址)
cpu將乙個虛擬記憶體空間中的位址轉換為實體地址,需要進行兩步:
首先,將給定乙個邏輯位址(段識別符號:段內偏移),cpu要利用其段式記憶體管理單元,先將這個邏輯位址轉換成乙個線性位址,其次,再利用其頁式記憶體管理單元,轉換為最終實體地址。
乙個邏輯位址由兩部份組成,段識別符號: 段內偏移量。段識別符號是由乙個16位長的字段組成,稱為段選擇符。其中前13位是乙個索引號。後面3位包含一些硬體細節,如圖
索引號就是「段描述符(segment descriptor)」,段描述符具體描述了乙個段。這樣,很多個段描述符,就組了乙個陣列,叫「段描述符表」,這樣,可以通過段識別符號的前13位,直接在段描述符表中找到乙個具體的段描述符,這個描述符就描述了乙個段,每乙個段描述符由8個位元組組成,如下圖:
其中段描述符表又分為gdt跟ldt,一些全域性的段描述符,就放在「全域性段描述符表(gdt)」中,一些區域性的,例如每個程序自己的,就放在所謂的「區域性段描述符表(ldt)」中;
而gdt或者ldt的選擇要看段描述符的t1欄位的值,0表示用gdt,1用ldt;
首先,給定乙個完整的邏輯位址[段選擇符:段內偏移位址],
1、看段選擇符的t1=0還是1,知道當前要轉換是gdt中的段,還是ldt中的段,再根據相應暫存器,得到其位址和大小。我們就有了乙個陣列了。
2、拿出段選擇符中前13位,可以在這個陣列中,查詢到對應的段描述符,這樣,它了base,即基位址就知道了。
3、把base + offset,就是要轉換的線性位址了。
X86記憶體管理之分段管理
最近一直在學習x86彙編,自己打算從基礎的開始學習,對以後做嵌入式開發有一定的幫助。今天看了關於在x86處理上兩種關於記憶體管理的方式 分段管理和分頁管理,以及課程中沒有講到的段頁式管理。一.分段管理 在286以下的cpu中 8086,8088 位址線是20位,可定址範圍220b 1m。而在8088...
作業系統 記憶體管理 基本分段記憶體管理方式
引入分頁記憶體管理方式的目的是提高記憶體空間利用率,而引入分段記憶體管理的目的是滿足程式設計師在程式設計和使用上的多方面要求 方便程式設計 使用者可以把自己的作業按照邏輯關係劃分為若干個段,而且每乙個段的位址都是從0開始編址的,並且具有自己的段名和長度。邏輯位址是由段名 段號 和段內偏移量 段內位址...
儲存管理 分段
1 位址結構劃分 作業的位址空間被劃分為若干個段,每個段定義了一組邏輯資訊,如有主程式段main,子程式段x,資料段d及棧段s,每個段都有自己的名字,每個段從0開始編址,並採用一段連續的位址空間,段的長度由相應的邏輯資訊組的長度決定,因而各段長度不等,整個作業的位址空間由於是分成多個段,因而是二維的...