虛擬記憶體,虛擬位址空間,使用者空間,核心空間

2022-07-16 18:33:11 字數 1061 閱讀 4300

虛擬記憶體,就是用磁碟作為介質,暫時性儲存資料,和主存進行換入換出,使程式能夠使用更多的記憶體。虛擬記憶體是單位是頁,固定大小的資料方便資料的交換。如果乙個應用程式要訪問某段記憶體,通過mmu得到相應的頁號,然後就去主存中去尋找相應的頁,如果該頁被換到了磁碟上,就會發生乙個缺頁,然後核心就會從磁碟上將需要的頁換入主存,然後進行訪問。還有乙個問題就是核心空間和使用者空間的資料交換,由於使用者空間的資料是可以換入到磁碟上的,而核心資料永遠是放在主存上的,所以如果核心訪問使用者資料時可能該位址的資料並不在主存中,所以要使用copytousr和copyfromusr這種機制來完成處理。

虛擬位址空間,空間個人理解就是一組位址的集合。linux的應用程式在編譯後就擁有4g大小的位址空間,這4g大小的記憶體通過頁機制對映到4g大小的實體地址,頁是該機制的最小單位。至於虛擬位址對映到哪一塊物理記憶體,這是由硬體決定的,採用一套不同的頁目錄,頁表就能夠做到虛擬位址相同但對應的實體地址不同。這就是作業系統能夠做到多個應用程式同時執行但是資料之間不會相互干擾的原因,每個程序的頁表資訊都存放在pcb結構裡,當要執行該程序時,將頁表資訊交給cpu就能夠做到轉換。

使用者空間就是4g虛擬位址空間中的低3g的虛擬位址空間,是cpu使用者態享有的,使用者空間對應的頁是可以在主存和磁碟之間進行交換的。

核心空間就是4g虛擬位址空間中的高1g的虛擬位址空間,是cpu核心態享有的,該空間對應的實體地址永遠是位於主存當中的,不會被換到磁碟上。

個人覺得還有乙個很重要的問題就是使用者空間和核心空間的到物理記憶體的對映是不同的。

首先使用者空間是通過頁表進行對映到實體地址,而核心空間是通過線性一一對映到實體地址,即用虛擬位址減去乙個偏移量0xc0000000。

使用者態最多只能訪問3g的記憶體,而核心態能訪問所有的物理記憶體,這裡若核心空間的對映是按照這種線性對映的話,顯然核心態是不能夠訪問大於1g的記憶體的,所以這裡就引入了高階記憶體的概念,簡單的介紹一下就是將核心虛擬位址空間中開闢一段位址,然後將實體地址高於1g的位址中的某一段對映到我們開闢的虛擬位址上,然後就能夠實現訪問大於1g的記憶體了。

核心態下分配記憶體的函式kmalloc,傳遞給函式不同的標誌來通知函式分配哪一部分的記憶體,kmallocgfp__kernel就是分配和物理記憶體一一對映的部分的記憶體

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

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

虛擬位址空間

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

虛擬位址空間

14 共 14 對本文的評價是有幫助 評價此主題 程序可用的虛擬位址範圍稱為該程序的 虛擬位址空間 每個使用者模式程序都有其各自的專用虛擬位址空間。對於 32 位程序,虛擬位址空間通常為 2 gb,範圍從 0x00000000 至 0x7fffffff。對於 64 位程序,虛擬位址空間為 8 tb,...