Linux程序位址空間和虛擬記憶體

2021-09-07 17:00:53 字數 2271 閱讀 7037

一、虛擬記憶體

先來看一張圖(來自《linux核心完全剖析》),如下:

分段機制:即分成**段,資料段,堆疊段。每個記憶體段都與乙個特權級相關聯,即0~3,0具有最高特權級(核心),3則是最低特權級(使用者),每當程式試圖訪問(許可權又分為可讀、可寫和可執行)乙個段時,當前特權級cpl就會與段的特權級進行比較,以確定是否有許可權訪問。每個特權級都有自己的程式棧,當程式從乙個特權級切換到另乙個特權級上執行時,堆疊段也隨之改換到新級別的堆疊中。

分頁機制:當使用分頁機制時,每個段被劃分成頁面(通常每頁在4kb大小),頁面會被儲存於物理記憶體或硬碟上。如果禁用分頁機制,那麼線性位址空間就是實體地址空間。

c++ code 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

if(資料在物理記憶體中)

else

else

}else

}

其中mmu負責虛擬位址到實體地址的轉換工作,分段和分頁操作都使用駐留在記憶體中的段表和頁表來指定他們各自的交換資訊。如果使用者程式想要訪問乙個虛擬位址,經mmu檢查無權訪問(特權級),mmu產生乙個異常,cpu從使用者模式切換到特權模式,跳轉到核心**中執行異常服務程式,核心把這個異常解釋為段錯誤,把引發異常的程序終止掉。

二、linux程序位址空間

由前面可得知,程序有4g的定址空間,其中第一部分為「使用者空間」,用來對映其整個程序空間(0x0000 0000-0xbfff ffff)即3g位元組的虛擬位址;第二部分為「系統空間」,用來對映(0xc000 0000-0xffff ffff)1g位元組的虛擬位址。如下圖

將其更加詳細地展示如下:

程式路徑:完整的絕對路徑字串如 「/home/simba/code/asm/******」

環境變數:類似linux下的path,home等的環境變數,子程序會繼承父程序的環境變數。

命令列引數:類似ls -l 中-l 就是命令列引數,而ls 就是可執行程式。

對於函式棧來說,函式執行完畢就釋放記憶體,舉例遞迴來說,一直開闢向下函式棧,然後由下往上收復,所以遞迴太多層的話很可能造成棧溢位。

區域性變數(不包含靜態變數);區域性可讀變數(const)都分配在棧上。

共享庫和mmap記憶體對映區:比如很多程式都會用到的printf,函式共享庫 printf.o 固定在某個物理記憶體位置上,讓許多程序對映共享。mmap是個系統函式,可以把磁碟檔案的一部分直接對映到記憶體,這樣檔案中的位置直接就有對應的記憶體位址,對檔案的讀寫可以直接用指標來做而不需要read/write函式。此外,呼叫malloc 時正常是呼叫brk 系統呼叫分配記憶體,特定條件下是呼叫mmap 來對映物理記憶體到程序位址空間。

堆:即malloc申請的記憶體,使用free釋放,如果沒有主動釋放,在程序執行結束時也會被釋放。

text segment: 可執行程式(二進位制)(.text);全域性初始化唯讀變數(const)(.rodata);字串常量(.rodata);均在這裡分配。

data segment: 全域性變數(初始化的在.data,未初始化的在.bss);靜態變數(全域性和區域性)(初始化的在.data,未初始化的在.bss);全域性未初始化唯讀變數(.bss);均在這裡分配。

Linux 七 程序和虛擬位址空間

1.程序的概念 程序就是程式的一次動態執行過程,也就是執行中的程式。程序有三種基本狀態 就緒狀態 執行狀態 阻塞狀態 三種狀態之間的關係 作業系統是通過管理程序,讓程序執行來完成使用者指定的任務。程序是在記憶體上執行的,而程式是儲存在磁碟上的二進位制可執行檔案。2.程序和程式的區別 1 程式是永存的...

Linux虛擬記憶體和程序虛擬位址空間簡述

後台開發經常會問此類問題,雖說難度不大,但是知道和不知道還是有區別的。以下的內容總結自 深入理解linux核心 第一章,僅僅是簡述,沒有深入研究,畢竟記憶體管理這一塊內容超級多,感興趣的同學可以去啃啃這本書。虛擬記憶體 所有新近的unix系統都提供了一種有用的抽象,叫虛擬記憶體 virtual me...

程序位址空間與虛擬儲存空間

linux中的每個程序都有自己的虛擬位址空間。作業系統的乙個最重要的基本管理目的就是避免程序之間的相互影響。下面將介紹虛擬位址空間。通過虛擬位址訪問記憶體有以下優勢 某台計算機總的記憶體大小是 128m 現在同時執行兩個程式 a 和 b a 需占用記憶體 10m b 需占用記憶體 110 計算機在給...