一、虛擬記憶體:
1、系統會為每個程序分4g的虛擬記憶體空間。
32個0 ~ 32個1 位址範圍。
2、使用者只能使用虛擬位址,無法直接使用物理記憶體。
3、虛擬位址與物理記憶體進行對映才能使用,否則就會產生段錯誤。
4、虛擬位址與物理記憶體的對映由作業系統動態維護。
5、讓使用者使用虛擬位址一方面為了安全,另一方面作業系統可以讓應用程式使用比實際物理記憶體更的位址空間。
6、4g的虛擬位址分為兩部分
[0~3) 使用者空間
[3~4) 核心空間
7、使用者空間中的**不能直接訪問核心空間**和資料,可以通過呼叫系統api切換到核心態,間接的與核心交換資料。
8、對虛擬記憶體越界訪問(使用沒有對映過的記憶體)將導致段錯誤。
二、對映虛擬記憶體與物理記憶體的函式:
#include
void *sbrk(intptr_t increment);
功能:根據增量引數調整該指標的位置,既能對映也能取消對映。
increment:增量
0 獲取指標的位置
<0 取消釋放
>0 對映記憶體
返回值:該指標原來的位置。
int brk(void *addr);
功能:直接用addr的值修改指標的位置。
addr:
> 位置指標,對映記憶體
< 位置指標,取消對映
返回值:成功返回0,失敗返回-1。
注意:brk/sbrk是posix標準的記憶體對映函式,都有單獨對映、取消對映的功能,但配合使用最方便。
#include void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
功能:對映虛擬記憶體與物理記憶體,sbrk和brk底層呼叫的就是它們。
length:對映的位元組長度
port:對映的許可權
prot_exec 執行許可權
prot_read 讀許可權
prot_write 寫許可權
prot_none 沒有許可權
flags:對映標誌
map_fixed 如果提供的addr無法對映,則失敗,系統不會自動調整。
map_anonymous 將虛擬對映到物理記憶體,而不是檔案,忽略fd等引數。
map_shared 對對映區域的寫操作直接反映到檔案中。
map_private 對對映區域的寫操作只反映到檔案的緩衝區,不會真正寫入檔案。
map_denywrite 拒絕檔案的寫入操作
fd:檔案描述符
offset:檔案的偏移量
int munmap(void *addr, size_t length);
功能:取消對映
length:記憶體位元組數
返回值:成功返回0,失敗返回-1。
總結:
1、mmap/munmap 底層不維護任何東西,只返回乙個對映後的記憶體首位址,所對映的記憶體位於堆中。
2、brk/sbrk底層維護乙個指標,記錄所對映的記憶體結尾,所對映的記憶體也位於堆中,底層呼叫的是mmap/munmap。
3、malloc/free底層維護乙個雙向鍊錶和必須的控制資訊,所對映的記憶體也位於堆中,底層呼叫的是brk/sbrk。
4、每個程序都有4g(32位系統)的虛擬記憶體空間,虛擬記憶體只是個資料,必須與物理記憶體建立對映關係才能使用。
5、平時所說記憶體的分配與釋放有兩層含義。
1、許可權的分配與釋放
2、對映關係的取消與建立
6、重點是理解linux系統的記憶體管理機制,而不是brk/sbrk/mmap/munmap的用法。
Linux虛擬記憶體
linux採用虛擬段頁式儲存方式來管理記憶體,程式的基本邏輯儲存單元,也可以說是程式段。linux中有四個段,段,資料段,bss段,堆疊段。虛擬位址從低到高依次是 段,資料段,bss段,堆疊段。其中 段為程式本身 二進位制指令 資料段為 中初始化了的全域性變數和靜態變數,bss段為為初始化的全域性變...
linux記憶體與虛擬記憶體
linux支援虛擬記憶體 記憶體 記憶體條 物理記憶體 實際存在 程式中的記憶體 虛擬記憶體 os對映出來的 直接對映 檔案對映 提速 檔案io操作 耗時長 記憶體操作 耗時短 mmap函式可以把檔案對映成虛擬記憶體,像操作記憶體一樣去操作檔案。mmap函式可以直接對映一塊虛擬記憶體。include...
Linux虛擬記憶體 brk sbrk
虛擬記憶體 問題 乙個程式不能訪問另外乙個程式的位址指向的空間.理解 1.每個程式的開始位址0x80084000 2.程式中使用的位址不是物理,而是邏輯位址 虛擬記憶體 邏輯位址僅僅是編號.編號使用int 4位元組整數表示.每個程式提供了4g的訪問能力 問題 邏輯位址與實體地址關聯才有意義 過程稱為...