學了很久linux核心了,但對於linux核心對於記憶體管理這塊始終有許多疑問,學而不思則罔!看了許多書籍和部落格但還是沒有搞得很明白。今天仔細思考了為什麼需要虛擬記憶體的問題,突然覺得很有收穫,所以記下來和大家分享,也是為了給自己留下更深刻的印象!
1.理解程序使用的全部資源是』虛擬『的,我們知道我們編寫的應用程式最終要以程序的形式來執行,因而程序就相當於乙個虛擬機器(虛擬的計算機),所以我們很容易感受到自己編寫的應用程式似乎使用的是所有的計算機資源,32bit的計算機我們程序似乎就是使用完整的4g記憶體,但是對系統稍有了解,我們就知道乙個程序使用的物理記憶體實際可能不到幾百m甚至幾m!這就是一種虛擬,程序使用的是虛擬的全部計算機資源!回來再看記憶體,實際上使用幾m的記憶體,但每個程序的虛擬記憶體卻是4g!這就是虛擬記憶體的奧妙!虛擬記憶體分為使用者空間和核心空間,在虛擬記憶體中,我們的所使用的位址是邏輯位址,例如我們現在一段**:
#include
using namespace std;
char strname = " hello world";
int main()
對其編譯: g++ -o test test.cpp 反彙編: objdump -h test
可以看到虛擬位址空間是從0開始的布局的,所以看來我們編寫的源**,在經過編譯器處理後所有的資料,**等等位址空間都被按照從0x00000000開始定義。這下是不 是很好理解,因為如果按照物理空間位址定義,那可能完成嗎? 虛擬位址空間的概念不知您充分理解沒有,沒有可以看看編譯,鏈結方面的書籍。下面就是虛擬位址空間的分布問題,虛擬位址空間分為:使用者空間和核心空間
在使用者空間中有資料段,**段,全域性資料段等等,這個大家應該是清楚的,所以不再贅述了,我們主要分析核心空間的虛擬位址空間布局。核心位址空間有三個分類:
1.zone_dma,包含低於16mb的記憶體頁框
2.zone_normal,包含高於16mb低於896mb的記憶體頁框
3.zone_highmem,包含高於896mb的頁框
zone_dma記憶體區是可以直接用於dma的記憶體區,而zone_normal是乙個正常的記憶體區域,重點是zone_highmem既然是1g空間為什麼不將高於896mb的區域分類到
zone_normal中呢?假如現在我們的32bit物理機有8g物理記憶體,那麼如果按照使用者3g,核心1g的分配方法,我們的應用程式不久無法使用完整的8g物理記憶體了嗎?我們
知道程序相當於乙個虛擬的物理機,我們的程序要能夠使用整個計算機的資源,因此當物理機有8g物理記憶體時,我們的程序就應該有8g的虛擬記憶體!!然而我們的32bit編譯
器在編譯適用於32bit的應用程式時,他所編譯的應用程式的虛擬位址空間只能是4g,因此為了使用另外的4g記憶體,我們讓核心去使用另外的4g物理空間,此時我們的核心
空間就是5g啦,但是他是使用896-1024這段空間去靈活使用剩下的4g空間,具體怎麼用您可以去看看相關資料。這裡就不說了。
Linux虛擬位址空間
在多工作業系統中,每個程序都執行在屬於自己的記憶體沙盤中。這個沙盤就是虛擬位址空間 virtual address space 在32位模式下它是乙個4gb的記憶體位址塊,這篇部落格均是x86架構的 1.位址空間分布 2.核心位址空間 從pkmap base 到 fixaddr start用於對映高...
Linux虛擬位址空間
為了防止不同程序同一時刻在物理記憶體中執行而對物理記憶體的爭奪和踐踏,採用了虛擬記憶體。虛擬記憶體技術使得不同程序在執行過程中,它所看得到的是自己獨自占有了當前系統的4g記憶體。所有程序共享同一物理記憶體,每個程序只把自己目前需要的虛擬記憶體空間對映並儲存到物理記憶體上。事實上,在每個程序建立載入時...
虛擬位址空間
當處理器讀或寫入記憶體位置時,它會使用虛擬位址。作為讀或寫操作的一部分,處理器將虛擬位址轉換為實體地址。通過虛擬位址訪問記憶體有以下優勢 程序可用的虛擬位址範圍稱為該程序的 虛擬位址空間 每個使用者模式程序都有其各自的專用虛擬位址空間。對於 32 位程序,虛擬位址空間通常為 2 gb,範圍從 0x0...