天天看點

linux記憶體管理——kmalloc和vmalloc

linux記憶體管理——kmalloc和vmalloc

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

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

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

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

1.核心的線性位址空間 

程序的4GB記憶體空間被人為的分為兩個部分--使用者空間與核心空間。使用者空間位址分布從0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB為核心空間。

  核心空間中,從3G到vmalloc_start這段位址是實體記憶體映射區域(該區域中包含了核心鏡像、實體頁框表mem_map等等)。在實體記憶體映射區之後,就是vmalloc區域。對于 160M的系統而言,vmalloc_start位置應在3G+160M附近(在實體記憶體映射區與vmalloc_start期間還存在一個8M的gap 來防止躍界),vmalloc_end的位置接近4G(最後位置系統會保留一片128k大小的區域用于專用頁面映射)

  kmalloc和get_free_page申請的記憶體位于實體記憶體映射區域,而且在實體上也是連續的,它們與真實的實體位址隻有一個固定的偏移.

vmalloc申請的記憶體則位于vmalloc_start~vmalloc_end之間,與實體位址沒有簡單的轉換關系,雖然在邏輯上它們也是連續的,但是在實體上它們不要求連續

2.實體記憶體空間的布局

linux把每個節點的實體記憶體劃分為3個管理區(zone):ZONE_DMA(低于16MB的記憶體頁框), ZONE_NORMAL(16MB~896MB的記憶體頁框), ZONE_HIGHMEM(高于896MB的記憶體頁框)

vmalloc和kmalloc差別

1,kmalloc對應于kfree,配置設定的記憶體處于3GB~high_memory之間,這段核心空間與實體記憶體的映射一一對應,可以配置設定連續的實體記憶體; vmalloc對應于vfree,配置設定的記憶體在VMALLOC_START~4GB之間,配置設定連續的虛拟記憶體,但是實體上不一定連續。

繼續閱讀