1. 程式人生 > >15---程序地址空間

15---程序地址空間

什麼是程序地址空間?

系統中每個使用者空間程序所看到的記憶體

程序地址空間有什麼特點?

  • 核心允許程序使用虛擬記憶體
  • 系統中所有程序之間以虛擬方式共享記憶體
  • 對一個程序而言,它好像可以訪問系統中所有的實體記憶體,它擁有的地址空間可以遠大於系統實體記憶體
  • 每個程序擁有32位或64位的一個獨立的連續(平坦)地址空間
  • 任何有效的地址只能位於唯一的區域,這些區域不能相互重合

什麼是記憶體區域?

32位系統中一個程序可定址的地址空間為4GB,但不代表它可以訪問所有的虛擬地址空間。那些可被訪問的合法地址空間稱為記憶體區域(虛擬記憶體區域(VMA))。

記憶體區域有什麼作用?

  • 通過核心,程序可以動態的增加或減少記憶體區域
  • 記憶體區域對相關程序具有讀、寫、執行許可權
  • 記憶體區域有權終止訪問出錯的程序

記憶體區域包含哪些記憶體物件?

  • 可執行檔案程式碼的記憶體對映------程式碼段
  • 可執行檔案的已初始化全域性變數的記憶體對映-----資料段
  • 未初始化全域性變數的記憶體對映----bss段
  • 用於程序使用者空間棧的零頁的記憶體對映
  • 共享庫的資料段、程式碼段和bss段
  • 任何記憶體對映檔案
  • 任何共享記憶體段
  • 任何匿名的記憶體對映

什麼是記憶體描述符?

記憶體描述符由mm_struct結構體表示,它包含了所有與程序地址空間有關的資訊。核心執行緒不需要訪問使用者空間的記憶體,它使用前一個程序的記憶體描述符來訪問核心。

如何描述記憶體區域?

用vm_area_struct結構體表示記憶體區域,描述指定地址空間內連續區間上的一個獨立記憶體範圍。核心將每個記憶體區域作為一個單獨的記憶體物件來管理,每個記憶體區域擁有一致性的訪問許可權和操作。

為什麼要將虛擬地址轉換為實體地址?

應用程式的操作物件是對映到實體記憶體之上的虛擬記憶體,但處理器直接操作的卻是實體記憶體,將虛擬地址轉換為實體地址後,處理器才能解析地址訪問請求。

怎樣進行地址轉換?

Linux使用三級頁表,通過查詢頁表完成地址轉換,具體來講,就是將虛擬地址分段,使每段虛擬地址都作為一個索引指向頁表,而頁表項又指向下一級頁表或最終的物理頁面。

什麼是翻譯後緩衝器(TLB)

TLB是一個將虛擬地址對映為實體地址的硬體快取,當請求訪問一個實體地址時,處理首先檢查TLB是否快取了該虛擬地址到實體地址的對映,如果快取中直接命中,實體地址立即返回,否則通過頁表搜尋需要的實體地址。