虛擬記憶體布局 記憶體的分工 堆與棧

2021-09-07 12:44:36 字數 1000 閱讀 6108

程序的虛擬記憶體空間分為兩個部分。低2gb(或3gb_)由應用程式使用。高2gb(或1gb)

由系統核心程式使用。

系統核心的記憶體空間中包含驅動程式,系統核心可執行程式、用於記憶體管理的資料結構(頁資料夾、頁表等),用於程序管理、執行緒排程的資料結構、各種中斷處理程式,系統快取等。

應用程式可使用的低位址空間中包含了應用程式的**、資料(全域性變數等)、系統和使用者dll的**、各執行緒的棧、堆等。

棧和堆是兩種重要的內在管理形式。

程序的每乙個執行緒都有自己的棧,棧與函式的呼叫、執行和返回及區域性變數的儲存相關,普通情況下,棧中儲存著函式的引數、返回位址和區域性變數,呼叫函式將引數入棧,呼叫指令將函式返回位址入棧,被呼叫函式負責儲存呼叫函式的相關棧指標,為區域性變數分配空間等,而堆是一種能夠動態分配和釋放的記憶體,由堆管理器進行管理,使用者在程式中使用的記憶體分配函式都是通過堆進行分配的。

開發者僅僅須要了解下面內容

(1)虛擬位址空間中的資料是分頁管理的。

(2)應用程式不用考慮系統中其它應用程式的記憶體使用情況,如占用了多少記憶體、占用了哪些記憶體等。

(3)虛擬位址並非實體地址空間中的位址。不是資料在記憶體中真實存在的位址。作業系統會將程序的虛擬位址對映到真實的物理記憶體的位址。

(4)程序也不用考慮真實的物理記憶體有多大。僅僅須要了解能夠使用2gb(普通情況下)的記憶體。作業系統負責轉換。

(5)假設系統中沒有足夠的物理記憶體供使用,那麼作業系統會將當前沒有使用的記憶體分頁「排程」到硬碟上儲存起來。頁面排程不會造成記憶體中的資料在虛擬位址空間中位址的改變。所以程序不須要知道記憶體分頁是怎樣排程的。不須要知道記憶體中儲存的資料是在記憶體中還是在硬碟上,僅僅須要知道其虛擬位址就能夠了。

在建立程序時,系統將應用程式的可執行檔案載入到記憶體中,設定相關環境後,開始啟動執行。要執行乙個程式(exe檔案),系統會建立程序。

系統先在自己的記憶體管理單元中構造出乙個虛擬位址空間,供程序使用,然後將exe檔案載入到程序的虛擬位址空間記憶體中指定的位置,配置程式資料和呼叫介面等,然後再建立主線程。程序是正在執行的程式。即程式的執行例項。

堆 虛擬記憶體

虛擬記憶體 交換空間 keyword 堆 虛擬記憶體 虛擬記憶體是在磁碟上的一塊區域,用以擴充主存的容量。虛擬記憶體裡放的資料是核心不常用的資訊,記憶體管理機制會把這些不常用的記憶體塊儲存到磁碟上,當要使用時再重新調入主存。虛擬記憶體的速度比主存慢很多。用作虛擬記憶體的磁碟空間叫交換空間 swap ...

arm linux虛擬記憶體布局

開始位置 結束位置 使用0xffff8000 0xffffffff 用於 copy user page clear user page。在sa11xx和xscale平台,用於建立乙個迷你快取對映 0xffff4000 0xffffffff armv6及以後的cpu cache混淆 0xffff100...

linux記憶體與虛擬記憶體

linux支援虛擬記憶體 記憶體 記憶體條 物理記憶體 實際存在 程式中的記憶體 虛擬記憶體 os對映出來的 直接對映 檔案對映 提速 檔案io操作 耗時長 記憶體操作 耗時短 mmap函式可以把檔案對映成虛擬記憶體,像操作記憶體一樣去操作檔案。mmap函式可以直接對映一塊虛擬記憶體。include...