天天看點

Linux核心--核心位址空間分布和程序位址空間_守候心田-ChinaUnix部落格

核心位址空間分布

直接映射區:線性空間中從3G開始最大896M的區間,為直接記憶體映射區,該區域的線性位址和實體位址存線上性轉換關系:線性位址=3G 實體位址。

動态記憶體映射區:該區域由核心函數vmalloc來配置設定,特點是:線性空間連續,但是對應的實體空間不一定連續。vmalloc配置設定的線性位址所對應的實體頁可能處于低端記憶體,也可能處于高端記憶體。(小于896M的實體記憶體頁稱為低端記憶體,反之稱高端記憶體)

永久記憶體映射區:該區域可通路高端記憶體。通路方法是使用alloc_page(_GFP_HIGHMEM)配置設定高端記憶體頁或者使用kmap函數将配置設定到的高端記憶體映射到該區域。

固定映射區:該區域和4G的頂端隻有4k的隔離帶,其每個位址項都服務于特定的用途,如ACPI_BASE等。

程序的位址空間

linux采用虛拟記憶體管理技術,每一個程序都有一個3G大小的獨立的程序位址空間,這個位址空間就是使用者空間。每個程序的使用者空間都是完全獨立、互補相幹的。程序通路核心空間的方式:系統調用和中斷。

建立程序等程序相關操作都需要配置設定記憶體給程序。這時程序申請和獲得的不是實體位址,僅僅是虛拟位址。

實 際的實體記憶體隻有當程序真的去通路新擷取的虛拟位址時,才會由“請頁機制”産生“缺頁”異常,進而進入配置設定實際葉框的程式。該異常是虛拟記憶體機制賴以存在 的基本保證---它會告訴核心去為程序配置設定實體頁,并建立對應的頁表,這之後虛拟位址才實實在在的映射到了實體位址上。

vmalloc和kmalloc差別

1,kmalloc對應于kfree,配置設定的記憶體處于3GB~high_memory之間,這段核心空間與實體記憶體的映射一一對應,可以配置設定連續的實體記憶體;

vmalloc對應于vfree,配置設定的記憶體在VMALLOC_START~4GB之間,配置設定連續的虛拟記憶體,但是實體上不一定連續。

2,vmalloc() 配置設定的實體位址無需連續,而kmalloc() 確定頁在實體上是連續的

3,kmalloc配置設定記憶體是基于slab,是以slab的一些特性包括着色,對齊等都具備,性能較好。實體位址和邏輯位址都是連續的。

4,最主要的差別是配置設定大小的問題,比如你需要28個位元組,那一定用KMALLOC,如果用VMALLOC,配置設定不多次機器就over了。

盡管僅僅在某些情況下才需要實體上連續的記憶體塊,但是,很多核心代碼都調用kmalloc(),而不是用vmalloc()獲得記憶體。這主要是出于性能的 考慮。vmalloc()函數為了把實體上不連續的頁面轉換為虛拟位址空間上連續的頁,必須專門建立頁表項。還有,通過 vmalloc()獲得的頁必須一個一個的進行映射(因為它們實體上不是連續的),這就會導緻比直接記憶體映射大得多的緩沖區重新整理。因為這些原 因,vmalloc()僅在絕對必要時才會使用——典型的就是為了獲得大塊記憶體時,例如,當子產品被動态插入到核心中時,就把子產品裝載到由 vmalloc()配置設定的記憶體上。

繼續閱讀