到底能訪問多大記憶體空間?從實模式到保護模式?

2021-10-11 18:36:55 字數 1311 閱讀 6179

《深度探索 linux 系統虛擬化 原理與實現》王柏生 機械工業出版社.

1978 年,intel 發布了第一款 16 位微處理器 8086 這款處理器有 20 根位址線,可以支援的位址空間是 1mb(220b),但是,這款處理器的資料匯流排寬度是 16 位,也就是說,指令指標暫存器 ip 以及其它通用暫存器都是 16 位的,那麼指令最大只能定址 64kb(216b)空間。

支援的記憶體空間(位址匯流排寬度)和實際真的能夠訪問的記憶體位址(機器字長有關)是有區別的。

8086

為了解決這個問題,引入了段的概念(實模式)。

8086 微處理器有 4 個段暫存器 cs、ds、es、ss,每個段暫存器也是 16 位的,用於儲存段的起始位址,其他暫存器儲存的則是段內偏移,使用邏輯位址(結合段暫存器)來訪問不能夠訪問到的記憶體空間。

s eg

ment

base

:seg

ment

offs

et

segment base:segment offset

segmen

tbas

e:se

gmen

toff

set eg

ment

base

<

<4+

segm

ento

ffes

t=20位

實體地址

segment base << 4 + segment offest = 20位實體地址

segmen

tbas

e<

<4+

segm

ento

ffes

t=20

位物理地

址 實模式下存在的問題:沒有記憶體保護。乙個程式可以訪問整個 1 mb 的位址空間,它也可以訪問另乙個程式的資料或**。除了程式之外,實模式對程式訪問的資源、執行的指令也沒有保護,任何程式都可以執行任何可能導致意外後果的 cpu 指令。

80286

80286 開始,intel 逐漸引入了段描述符表(保護模式)。

段描述符表中的每乙個描述符對應乙個段,包括段的基質、段的長度限制,段的各種屬性(訪問許可權)。段描述符表包括了 gdt 和 ldt 兩個部分,gdt 儲存全域性的段,每個任務都有自己的 ldt,儲存任務自己的段。每個段描述符長度為 64 位,相比較段暫存器只能儲存段基址,段描述符可以記錄更多的段資訊,實現了對記憶體訪問的保護。在有了段描述符表後,段暫存器中儲存的不再是段基址,而是乙個索引,用於從段描述符表中索引具體的段。

malloc一次性最大能申請多大記憶體空間

受使用者態記憶體位址空間的限制。64 位系統下分配幾個 t 不成問題。著作權歸作者所有。考慮32位linux情況的話,依據版本的話 如果是2.4版本之前的話,因為對映區是在1g位址位置,而且對映區與棧相對生長,malloc申請的空間大於128kb的話,呼叫的是mmap函式,因此分配的位址起始在1g位...

Bitmap到底占多大記憶體

學習自 由xxhdpi這種資料夾控制,稱之為density1 由機型控制,稱之為density2 斜長 螢幕寸號 這兩者決定了一張圖在記憶體中轉化成的bitmap實際的width height xwidth width density1 density2 0.5 xheight height den...

大記憶體會變成雞肋,到底還要多大?

說起當下什麼是可以時刻伴隨著我們的東西,那麼手機絕對是當之無愧的。而說起手機不得不說的就是許多人在關注手機時非常關注的手機記憶體,從當初最開始的128kb,256kb在到最後智慧型手機出現為我們帶來的上gb的手機記憶體。再到現在的16gb,32gb.甚至是128gb或者256gb,這些都是手機記憶體...