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

2021-09-26 23:26:25 字數 1056 閱讀 9250

後台開發經常會問此類問題,雖說難度不大,但是知道和不知道還是有區別的。以下的內容總結自《深入理解linux核心》第一章,僅僅是簡述,沒有深入研究,畢竟記憶體管理這一塊內容超級多,感興趣的同學可以去啃啃這本書。

虛擬記憶體

所有新近的unix系統都提供了一種有用的抽象,叫虛擬記憶體(virtual memory)。虛擬記憶體作為一種邏輯層,處於應用程式的記憶體請求與硬體記憶體管理單元(memory management unit, mmu)之間。虛擬記憶體有很多用途和優點:

虛擬記憶體子系統的主要成分是虛擬位址空間(virutal address space)的概念。程序所用的一組記憶體位址不同於物理記憶體位址。當程序使用乙個虛擬位址時,核心和mmu協同定位其在記憶體中的實際物理位置。

現在的cpu包含了能自動把虛擬位址轉換成實體地址的硬體電路。為了達到這個目標,把可用ram劃分成4kb或8kb的頁框(page frame),並且引入一組頁表來指定虛擬位址和實體地址之間的對應關係。這些電路使得記憶體分配變得簡單,因為一塊連續的虛擬位址請求可以通過分配一組非連續的實體地址頁框而得到滿足。

2.        程序虛擬位址空間處理

程序的虛擬位址空間包括了程序可以引用的所有虛擬記憶體位址。核心通常用一組記憶體區描述符(mm_struct)描述程序虛擬位址空間。例如,當程序通過exec()類系統呼叫開始某個程式的執行時,核心分配給程序的虛擬位址空間由以下幾個記憶體區組成:

所有現代unix作業系統都採用了所謂請求調頁(demand paging)的記憶體分配策略。有了請求調頁,程序可以在它的頁還沒有在記憶體時就開始執行。當程序訪問乙個不存在的頁時,mmu產生乙個異常:異常處理程式找到受影響的記憶體區,分配乙個空閒的頁,並用適當的資料把它初始化。同理,當程序通過malloc或者brk系統呼叫動態的請求記憶體時,核心僅僅修改程序的堆記憶體區的大小。只有試圖引用程序的虛擬記憶體位址而產生異常時,才給程序分配頁框。

1. 《深入理解linux核心》

2. 《linux裝置驅動程式》​​​​​​​

linux應用程式、核心、驅動、後台開發交流討論群(745510310),感興趣的同學可以**討論、交流、資料查詢等,前進的道路上,你不是乙個人奧^_^。

Linux程序虛擬記憶體簡介

使用者態和核心態 程序在執行時一般存在兩種狀態 使用者態 核心態。使用者態是指程序在執行使用者 核心態時指程序在執行核心 所以在linux中每個程序都存在兩個棧分別使用者使用者態和核心態的執行。使用者空間和核心空間 在32位系統中linux程序的虛擬記憶體為4gb,linux核心將這4g位元組的空間...

Linux程序的虛擬記憶體

使用者程序的虛擬位址空間是linux的乙個重要的抽象 它為每個執行程序提供了同樣的系統檢視,這使得多個程序可以同時執行,而不會干擾到其他程序記憶體中的內容。每個應用程式都有自己的線性位址空間,與所有其他應用程式隔開。各程序虛擬位址空間起始於0,延伸到task sieze 1,其上是核心位址空間。使用...

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

一 虛擬記憶體 先來看一張圖 來自 linux核心完全剖析 如下 分段機制 即分成 段,資料段,堆疊段。每個記憶體段都與乙個特權級相關聯,即0 3,0具有最高特權級 核心 3則是最低特權級 使用者 每當程式試圖訪問 許可權又分為可讀 可寫和可執行 乙個段時,當前特權級cpl就會與段的特權級進行比較,...