1. 程式人生 > >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之間,分配連續的虛擬記憶體,但是物理上不一定連續。

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


相關推薦

linux記憶體管理——kmallocvmalloc

直接對映區:線性空間中從3G開始最大896M的區間,為直接記憶體對映區,該區域的線性地址和實體地址存線上性轉換關係:線性地址=3G+實體地址。 動態記憶體對映區:該區域由核心函式vmalloc

linux記憶體管理-段式頁式管理

該博文參考國嵌視訊和http://www.cnblogs.com/image-eye/archive/2011/07/13/2105765.html,在此感謝作者。 一、地址型別 實體地址:CPU通過地址匯流排的定址,找到真實的實體記憶體對應地址。   邏輯地址:程式

Linux記憶體管理vmallockmalloc

vmalloc()函式的工作方式類似於kmalloc(),只不過前者分配的記憶體虛擬地址是連續的,而實體地址則無需連續。這也是使用者空間分配函式的工作方式:由malloc()(這個函式我們後續還會介紹,這也是我們在使用者空間進行開發的時候經常會碰到的一個記憶體分配函式)返回的頁在程序的虛擬地址空間內是連續的,

LINUX核心記憶體管理kmalloc,vmalloc

1 #include <linux/init.h> 2 #include <linux/thread_info.h> 3 #include <linux/module.h> 4 #include <linux/sched.h> 5

linux記憶體管理的 夥伴系統slab機制

夥伴系統 Linux核心中採用了一種同時適用於32位和64位系統的記憶體分頁模型,對於32位系統來說,兩級頁表足夠用了,而在x86_64系統中,用到了四級頁表。四級頁表分別為:  頁全域性目錄(Page Global Directory) 頁上級目錄(Page Upper Director

linux 記憶體管理kmalloc

在裝置驅動程式中動態開闢記憶體,不是用malloc,而是kmalloc,或者用get_free_pages直接申請頁。釋放記憶體用的是kfree,或free_pages.   對於提供了MMU(儲存 管理器,輔助作業系統進行記憶體管理,提供虛實地址轉換等硬體支援)的處理器而

linux 記憶體管理——核心的shmall shmmax 引數

核心的 shmall 和 shmmax 引數 SHMMAX= 配置了最大的記憶體segment的大小 ------>這個設定的比SGA_MAX_SIZE大比較好。 SHMMIN= 最小的記憶體segment的大小 SHMMNI= 整個系統的記憶體segment的總個

linux記憶體管理2:記憶體對映需求分頁(英文名字:demand Paging,又叫:缺頁中斷)

        圖 10-5 vm_area_struct 資料結構示意圖當可執行映象對映到程序的虛擬地址空間時,將產生一組 vm_area_struct 結構來描述虛擬記憶體區域的起始點和終止點,每個 vm_struct 結構代表可執行映象的一部分,可能是可執行程式碼,也可能是初始化的變數或未初始化的資料。

Linux記憶體管理之三 頁的分配釋放

如上圖,Linux分配頁時,只能分配2^n個頁。核心維護MAX_ORDER個連結串列,每個連結串列記錄著連續的空閒頁。第一個連結串列中的每一項為1個空閒頁,第二個連結串列中的每一項為2個空閒頁,第三個連結串列中的每一項為4個空閒頁。。。,依次類推。分配頁時,從對應的連結串列上摘除空閒頁;釋放頁時,將對應的頁歸

linux記憶體管理演算法 :夥伴演算法slab

良好的作業系統效能部分依賴於作業系統有效管理資源的能力。在過去,堆記憶體管理器是實際的規範,但是其效能會受到記憶體碎片和記憶體回收需求的影響。現在,Linux® 核心使用了源自於 Solaris 的一種方法,但是這種方法在嵌入式系統中已經使用了很長時間了,它是將記憶體作為物件按照大小進行分配。本文將探索

【原創】(十二)Linux記憶體管理之vmap與vmalloc

背景 Read the fucking source code! --By 魯迅 A picture is worth a thousand words. --By 高爾基 說明: Kernel版本:4.14 ARM64處理器,Contex-A53,雙核 使用工具:Source Insight 3.5,

KmallocVmalloc的區別

def atomic 動態加載 模塊 獲得 了解 sta 微處理器 ive kmalloc()和vmalloc()介紹kmalloc()用於申請較小的、連續的物理內存1. 以字節為單位進行分配,在<linux/slab.h>中2. void *kmalloc(s

Linux記憶體管理(最透徹的一篇)

摘要:本章首先以應用程式開發者的角度審視Linux的程序記憶體管理,在此基礎上逐步深入到核心中討論系統實體記憶體管理和核心記憶體的使用方法。力求從外到內、水到渠成地引導網友分析Linux的記憶體管理與使用。在本章最後,我們給出一個記憶體對映的例項,幫助網友們理解核心記憶體管理與使用者記憶體管理之

【轉】Linux記憶體管理

摘要:本章首先以應用程式開發者的角度審視Linux的程序記憶體管理,在此基礎上逐步深入到核心中討論系統實體記憶體管理和核心記憶體的使用方法。力求從外到內、水到渠成地引導網友分析Linux的記憶體管理與使用。在本章最後,我們給出一個記憶體對映的例項,幫助網友們理解核心記憶體管理與使用者記憶體管理之間的

linux記憶體管理---虛擬地址 邏輯地址 線性地址 實體地址的區別(一)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux記憶體管理之malloc實現

程序虛擬地址空間由一個一個VMA來表示,這裡先接收VMA相關操作. 1.1 查詢VMA函式find_vma() struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr) 找到的vma結果需滿足條件:

Linux記憶體描述之記憶體節點node--Linux記憶體管理(二)

1 記憶體節點node 1.1 為什麼要用node來描述記憶體 這點前面是說的很明白了, NUMA結構下, 每個處理器CPU與一個本地記憶體直接相連, 而不同處理器之前則通過匯流排進行進一步的連線, 因此相對於任何一個CPU訪問本地記憶體的速度比訪問遠端記憶體的速度要快 Linux適用於各種不同的體系結

Linux記憶體描述之記憶體區域zone--Linux記憶體管理(三)

1 記憶體管理域zone 為了支援NUMA模型,也即CPU對不同記憶體單元的訪問時間可能不同,此時系統的實體記憶體被劃分為幾個節點(node), 一個node對應一個記憶體簇bank,即每個記憶體簇被認為是一個節點 首先, 記憶體被劃分為結點. 每個節點關聯到系統中的一個處理器, 核心中表示為pg_

Linux記憶體描述之記憶體頁面page--Linux記憶體管理(四)

1 Linux如何描述實體記憶體 Linux把實體記憶體劃分為三個層次來管理 層次 描述 儲存節點(Node) CPU被劃分為多個節點(node), 記憶體則被分簇, 每個CPU對應一個本地實體記憶體, 即一個CPU-node對應

Linux分頁機制之概述--Linux記憶體管理(六)

1 分頁機制 在虛擬記憶體中,頁表是個對映表的概念, 即從程序能理解的線性地址(linear address)對映到儲存器上的實體地址(phisical address). 很顯然,這個頁表是需要常駐記憶體的東西, 以應對頻繁的查詢對映需要(實際上,現代支援VM的處理器都有一個叫TLB的硬體級頁表快取部件