Linux內核--內核地址空間分佈和進程地址空間

內核地址空間分佈

2011-11-8-13-51

直接映射區:線性空間中從3G開始最大896M的區間,爲直接內存映射區,該區域的線性地址和物理地址存在線性轉換關係:線性地址=3G+物理地址。

動態內存映射區:該區域由內核函數vmalloc來分配,特點是:線性空間連續,但是對應的物理空間不一定連續。vmalloc分配的線性地址所對應的物理頁可能處於低端內存,也可能處於高端內存。

永久內存映射區:該區域可訪問高端內存。訪問方法是使用alloc_page(_GFP_HIGHMEM)分配高端內存頁或者使用kmap函數將分配到的高端內存映射到該區域。

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

進程的地址空間

    linux採用虛擬內存管理技術,每一個進程都有一個3G大小的獨立的進程地址空間,這個地址空間就是用戶空間。每個進程的用戶空間都是完全獨立、互補相干的。進程訪問內核空間的方式:系統調用和中斷。 
    創建進程等進程相關操作都需要分配內存給進程。這時進程申請和獲得的不是物理地址,僅僅是虛擬地址。 
實 際的物理內存只有當進程真的去訪問新獲取的虛擬地址時,纔會由“請頁機制”產生“缺頁”異常,從而進入分配實際葉框的程序。該異常是虛擬內存機制賴以存在 的基本保證---它會告訴內核去爲進程分配物理頁,並建立對應的頁表,這之後虛擬地址才實實在在的映射到了物理地址上。

 

2011-11-8-13-50

vmalloc和kmalloc區別 
1,kmalloc對應於kfree,分配的內存處於3GB~high_memory之間,這段內核空間與物理內存的映射一一對應,可以分配連續的物理內存; 
vmalloc對應於vfree,分配的內存在VMALLOC_START~4GB之間,分配連續的虛擬內存,但是物理上不一定連續。

2,vmalloc() 分配的物理地址無需連續,而kmalloc() 確保頁在物理上是連續的 
3,kmalloc分配內存是基於slab,因此slab的一些特性包括着色,對齊等都具備,性能較好。物理地址和邏輯地址都是連續的。 
4,最主要的區別是分配大小的問題,比如你需要28個字節,那一定用KMALLOC,如果用VMALLOC,分配不多次機器就罷*工了。 
    儘管僅僅在某些情況下才需要物理上連續的內存塊,但是,很多內核代碼都調用kmalloc(),而不是用vmalloc()獲得內存。這主要是出於性能的 考慮。vmalloc()函數爲了把物理上不連續的頁面轉換爲虛擬地址空間上連續的頁,必須專門建立頁表項。還有,通過 vmalloc()獲得的頁必須一個一個的進行映射(因爲它們物理上不是連續的),這就會導致比直接內存映射大得多的緩衝區刷新。因爲這些原 因,vmalloc()僅在絕對必要時纔會使用——典型的就是爲了獲得大塊內存時,例如,當模塊被動態插入到內核中時,就把模塊裝載到由 vmalloc()分配的內存上。

發佈了6 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章