為了保證程序執行的安全性,作業系統使用保護模式,系統不會直接訪問資料真實的位址,採用虛擬記憶體,虛擬記憶體與真實記憶體對映,通過對映關係來獲取檔案和資料。系統會給每個程序都分配乙個4g大小的虛擬記憶體
虛擬記憶體空間的布局:分為使用者空間(3g)和核心空間(1g)資料區為了方便理解是我自己劃分的 實際沒有
1、保留區(128m),這段區域不存放任何東西,不可以被訪問
2、資料區,指令(區域性變數也屬於指令,執行時在棧中開闢)存放的區域:又分 為.txt .data .bss
.txt**段,存放**(包括操作碼、要操作的物件、具體的數值比如2)
.data存放已初始化的全域性變數和靜態全域性變數
.bss存放未初始化以及初始化為0的全域性變數和靜態全域性變數
3、堆區(從低位址->高位址開闢記憶體空間)由使用者自己管理,先進先出,像malloc申請的空間就在堆區存放
4、共享庫:程式執行所需要的共享庫,都存放在這個位置
5、棧區(從高位址->低位址開闢記憶體空間)由系統管理,先進後出,儲存區域性變數、函式形參等,函式的執行在棧區進行
6、命令列引數:存放程式名以及引數
核心空間(1g):分為3部分,直接訪問區,常用部分,高階記憶體
直接訪問區:cpu直接訪問,提高cpu效率(不過暫存器)
常用部分(892m):虛擬空間和記憶體的對映關係
高階記憶體:核心中對映超過1g的檔案時使用
linux下的4G虛擬記憶體管理
首先我們知道,記憶體可以分為三個部分,分別為靜態儲存區記憶體,棧區記憶體和堆區記憶體,其中他們各自有著好處和過人之處,在這裡主要來說明堆區記憶體 靜態儲存區儲存的變數為為全域性變數,或者可以用static修飾的變數,他的好處實是在整個程式的執行中一直存在,直到程式結束 棧區變數申請的是區域性變數或者...
arm linux虛擬記憶體布局
開始位置 結束位置 使用0xffff8000 0xffffffff 用於 copy user page clear user page。在sa11xx和xscale平台,用於建立乙個迷你快取對映 0xffff4000 0xffffffff armv6及以後的cpu cache混淆 0xffff100...
4G虛擬位址空間布局
一 其中,使用者程序部分分段儲存內容如下表所示 按位址遞增順序 名稱儲存內容 段 text 可執行 字串字面值 唯讀變數 資料段 data 已初始化且初始值為非0的全域性變數和靜態區域性變數 bss段 未初始化或初始值為0的全域性變數和靜態區域性變數 棧區域性變數 函式引數 返回位址等 堆動態分配的...