日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内存管理——kmalloc和vmalloc

發布時間:2025/3/21 linux 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。