Linux 虛擬位址空間分布 筆記

2021-10-09 11:01:25 字數 1176 閱讀 1512

linux系統下,核心程序和使用者程序所佔的虛擬記憶體比例為1:3;

windows系統下,核心程序和使用者程序所佔的虛擬記憶體比例為2:2(也可以修改為1:3);

虛擬位址通過頁表對映到實體地址,頁表由作業系統維護並被處理器引用。(linux系統通過對棧、堆、記憶體對映段的起始位址加上隨機偏移量來打亂布局,避免惡意程式通過計算訪問棧、庫函式等位址);

使用者程序部分分段儲存內容按照位址遞減

核心空間:核心總是駐留在記憶體中,其是作業系統的一部分。核心空間所佔區域為核心所保留,不允許應用程式讀寫該區域或直接呼叫核心**定義的函式。

棧:又稱為堆疊,由編譯器自行分配釋放。有三個用途1.為函式內部宣告的非靜態區域性變數提供儲存空間。2.棧幀或過程活動記錄,記錄函式呼叫過程相關的維護性資訊,包括函式返回位址等等。3.臨時儲存區,用於儲存長算術表示式部分計算結果。在linux中ulimit -s命令可以檢視和設定堆疊的最大值,當程式使用超過該值時,發生棧溢位,程式會收到段錯誤,此時可向上或者向下調整棧的容量,這依賴於具體的實現。

堆:堆用來存放程序執行時動態分配的記憶體段,可以動態擴張或者縮減(末端break指標標識,通過系統呼叫brk()和sbrk()來移動break指標以擴張堆),但是其內容是匿名的,只能通過指標間接訪問。由於堆的記憶體申請和釋放是無序的,所以會在最後產生記憶體碎屑,如果程式設計師不釋放最後程式結束時作業系統會自行釋放收回記憶體。通常有兩類問題:記憶體洩露和記憶體破壞。

bss段:通常存放以下符號:未初始化的全域性變數和靜態區域性變數;初始值為0的全域性變數和靜態區域性變數;未定義且初值不為0的符號;

資料段:通常存放程式中已經初始化且初值不為0的全域性變數和靜態區域性變數,資料段屬於靜態記憶體分配(可讀可寫);

執行時,資料段和bss段通常合稱資料區。

**段:正文段、文字段、通常存放程式執行**(機器指令),頻繁執行的**段是共享的,只需要在用的時候拷貝乙份,通常唯讀。

保留區:虛擬位址空間的最底部,未給予實體地址,用於捕捉使用空指標和小整形指標引用記憶體的異常情況。

Linux虛擬位址空間

在多工作業系統中,每個程序都執行在屬於自己的記憶體沙盤中。這個沙盤就是虛擬位址空間 virtual address space 在32位模式下它是乙個4gb的記憶體位址塊,這篇部落格均是x86架構的 1.位址空間分布 2.核心位址空間 從pkmap base 到 fixaddr start用於對映高...

Linux虛擬位址空間

為了防止不同程序同一時刻在物理記憶體中執行而對物理記憶體的爭奪和踐踏,採用了虛擬記憶體。虛擬記憶體技術使得不同程序在執行過程中,它所看得到的是自己獨自占有了當前系統的4g記憶體。所有程序共享同一物理記憶體,每個程序只把自己目前需要的虛擬記憶體空間對映並儲存到物理記憶體上。事實上,在每個程序建立載入時...

虛擬位址空間

當處理器讀或寫入記憶體位置時,它會使用虛擬位址。作為讀或寫操作的一部分,處理器將虛擬位址轉換為實體地址。通過虛擬位址訪問記憶體有以下優勢 程序可用的虛擬位址範圍稱為該程序的 虛擬位址空間 每個使用者模式程序都有其各自的專用虛擬位址空間。對於 32 位程序,虛擬位址空間通常為 2 gb,範圍從 0x0...