kmalloc, vmalloc分配的記憶體結構

2021-05-28 08:26:34 字數 1110 閱讀 6275

kmalloc對應於kfree,可以分配連續的物理記憶體;

vmalloc對應於vfree,分配連續的虛擬記憶體,但是物理上不一定連續。

vmalloc分配記憶體的時候邏輯位址是連續的,但實體地址一般是不連續的,適用於那種一下需要分配大量記憶體的情況,如insert模組的時候。這種分配方式效能不入kmalloc。

kmalloc分配記憶體是基於slab,因此slab的一些特性包括著色,對齊等都具備,效能較好。實體地址和邏輯位址都是連續的

最主要的區別是

分配大小的問題。

比如你需要28個位元組,那一定用kmalloc,如果用vmalloc,分配不多次機器就罷工了。

npage_offset為3gb,high_memory為儲存實體地址最高值的變數,vmalloc_start為非連續區的起始位址

在實體地址的末尾與第乙個記憶體區之間插入了乙個8mb的區間,這是乙個安全區,目的是為了「捕獲」對非連續區的非法訪問。出於同樣的理由,在其他非連續的記憶體區之間也插入了4k大小的安全區。每個非連續記憶體區的大小都是4096的倍數。

n        vmalloc()與 kmalloc()都可用於分配記憶體

ü        kmalloc()分配的記憶體處於3gb~high_memory之間,這段核心空間與物理記憶體的對映一一對應

ü        vmalloc()分配的內存在vmalloc_start~4gb之間,這段非連續記憶體區對映到物理記憶體也可能是非連續的

n        vmalloc() 分配的實體地址無需連續,而kmalloc() 確保頁在物理上是連續的

n        儘管僅僅在某些情況下才需要物理上連續的記憶體塊,但是,很多核心**都呼叫kmalloc(),而不是用vmalloc()獲得記憶體。

n   

這主要是出於效能的考慮。vmalloc()函式為了把物理上不連續的頁面轉換為虛擬位址空間上連續的頁,必須專門建立頁表項。還有,通過

vmalloc()獲得的頁必須乙個乙個的進行對映(因為它們物理上不是連續的),這就會導致比直接記憶體對映大得多的緩衝區重新整理。

n        因為這些原因,vmalloc()僅在絕對必要時才會使用——典型的就是為了獲得大塊記憶體時,例如,當模組被動態插入到核心中時,就把模組裝載到由vmalloc()分配的記憶體上。

kmalloc, vmalloc分配的記憶體結構

kmalloc,vmalloc分配的記憶體結構 vmalloc和kmalloc區別 kmalloc對應於kfree,可以分配連續的物理記憶體 vmalloc對應於vfree,分配連續的虛擬記憶體,但是物理上不一定連續。vmalloc分配記憶體的時候邏輯位址是連續的,但實體地址一般是不連續的,適用於那...

分目錄 分埠

分目錄站點 意義 可能有多個cms或框架組成,對於滲透 相當於滲透目標是多個 入侵分目錄下的站點 主站也跟著被入侵 主站與分目錄站點搭建的cms可能不同 找到乙個有漏洞可利用的cms即可對 進行入侵 分埠站點 同理 www.com www.com 8080 www.com 8888 意義 可能有多個...

分糖果 差分約束

description 幼兒園裡有n 個小朋友,lxhgww 老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww 需要滿足小朋友們的 k個要求。幼兒園的糖果總是有限的,l...