天天看點

程序虛拟位址空間劃分

大體概括

當一個程式跑起來時,我們的作業系統會主動的配置設定此程式的虛拟位址空間,每個程序的虛拟位址空間會被劃分成為多個區間,當然,位址空間的劃分因為其依賴于作業系統而實作的,是以劃分方式會随着核心的不同而不同,可以肯定的是其分為兩大部分,核心空間和使用者空間。

提問:為什麼會有這麼個東西?

至于為什麼需要劃分虛拟位址空間我們提一嘴,是因為作業系統對程序位址空間的管理以及實體位址的隐蔽,我們所運作的程式代碼是無法直接通路實體記憶體的。早期的記憶體管理機制呢是在運作一個程式的時候将程式全部一股腦兒的加載到記憶體,這樣的操作對計算機的記憶體來說是一個挑戰,他需要足夠大,而且還不能同時運作多個程式,需要挂掉一個再補充一個,資料在磁盤和記憶體之間來回拷貝,費時費力,這伴随着相當多的問題:

1.程序位址空間沒有明确的隔離,不安全;

2.記憶體的使用效率極大地降低;

3.程式跑起來時資料位址不明确,因為是随機配置設定;

分段

首先我們明确一點就是程式設計在計算機上展示的行為就是指令+資料,作業系統為了更人性化更科學,改進後通過分段分頁的行為來進行記憶體位址管理;将記憶體通過CPU由段寄存器分割,這樣就解決了程式見的空間隔離,如果發生越界行為,就容易判斷,而且最妙的是通過首位址+位址偏移量來确定實際位址(虛拟位址),達到操作資料,這就說明實際代碼和資料的位址其實本質上是位址偏移量。

分頁

分段解決了一部分問題,之後又出現了一個分頁,用它來解決記憶體的實際使用效率問題;針對記憶體實體位址和虛拟位址的記憶體管理及兩者的映射機制,通過分頁,我們可以認為拿到一塊兒連續的但實際上不是連續的位址塊,通過頁表映射關系,既保證了對程式使用記憶體的連續,也可以保證對記憶體位址的通路權限,兩全其美。

概述優點:

1.為所有運作的程式程序提供了一緻的位址空間,給程序一個自身占用完全單機系統存儲資源的假象;

2.保護程序位址空間,實作位址隔離,保障安全;

3.建立實體位址和虛拟位址的映射,通過分頁行為,提高記憶體的使用效率;

瞅瞅

我們就以x86 32位作業系統核心劃分來具體看看:

程式虛拟位址空間劃分

如上圖呢,一塊完整的4G大小的記憶體空間被分割成了多塊區域,每個區域對應的會在程式運作期間存儲相對于的類型資料,存儲資料的類型呢大家可以自行了解;

算了還是說一下吧

.data 初始化且初始化不為0的全局變量,資料,編譯産生的符号

.bss 初始化或初始化為0的全局變量,資料,編譯産生的符号

.text 存放編譯指令

.dll .so 存放共享庫

.heap 大名鼎鼎的堆

.stack 同樣大名鼎鼎的棧

其中注意的是每一個程序的user space是私有的,其kernal space是共享的;user space是封閉的,原因是需要匿名管道通信。

繼續閱讀