1. 程式人生 > >記憶體為什麼要分段? 分成多少種段? 段與段暫存器的區別?

記憶體為什麼要分段? 分成多少種段? 段與段暫存器的區別?

把記憶體分段後,每一個段就有一個段基址,段暫存器儲存的就是這個段基址的高16位,這個16位的地址左移四位(後面加上4個0)就可構成20位的段基址。
一個是早期真實模式下,暫存器16位,地址線20位。為了用16位的暫存器定址20位的地址,引入了段(segment)的概念,所有的段都在一個地址空間。

第二個是保護模式下,段(segmentation)強調的是分割,用來把記憶體分成不同的地址空間,每個段一個空間,而後通過CPU的MMU轉換成實際實體地址。由於程式執行在不同的段裡,根本上保護了CPU保護模式下的各個不相關的程式碼,所謂程序或者作業。

注意,x86 CPU的段是永遠存在的,不論哪個模式,不能禁止,參看Intel開發手冊。

2.訪問記憶體空間與暫存器有啥關係啊?為什麼16不能尋到1M?還有記憶體是不是分成四種段啊?(CS/DS/SS/ES)?段暫存器就是其管理作用嗎?
暫存器是CPU內部的儲存部件與記憶體空間沒有關係,設定暫存器的原因是為了減少CPU與記憶體交換資料的次數,以提高計算機的工作速度。
記憶體空間和地址線的關係為:儲存容量=2^n(n是地址線的數量),所以16根地址線只能訪問2^16=64K的儲存空間。
記憶體是分成四種段,這是考慮到程式執行時需要的四個部分。但是,記憶體不止四個段,只是同時最多隻有四個段在工作,其他的在“睡眠”,需要時再“喚醒”。
記憶體分段後,記憶體的地址(又稱實體地址)就由兩部分組成:段地址和段內偏移地址,段暫存器管理的是段地址。