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之間,分配連續的虛擬內存,但是物理上不一定連續。
2,vmalloc() 分配的物理地址無需連續,而kmalloc() 確保頁在物理上是連續的?
3,kmalloc分配內存是基于slab,因此slab的一些特性包括著色,對齊等都具備,性能較好。物理地址和邏輯地址都是連續的。?
4,最主要的區別是分配大小的問題,比如你需要28個字節,那一定用kmalloc,如果用vmalloc,分配不多次機器就罷工了。?
??? 盡管僅僅在某些情況下才需要物理上連續的內存塊,但是,很多內核代碼都調用kmalloc(),而不是用vmalloc()獲得內存。這主要是出于性能的考慮。vmalloc()函數為了把物理上不連續的頁面轉換為虛擬地址空間上連續的頁,必須專門建立頁表項。還有,通過 vmalloc()獲得的頁必須一個一個的進行映射(因為它們物理上不是連續的),這就會導致比直接內存映射大得多的緩沖區刷新。因為這些原因,vmalloc()僅在絕對必要時才會使用,最典型的就是為了獲得大塊內存時,例如,當模塊被動態插入到內核中時,就把模塊裝載到由vmalloc()分配的內存上。
總結
以上是生活随笔為你收集整理的linux内存管理——kmalloc和vmalloc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IO模型(select, poll, e
- 下一篇: 内核页表和进程页表