1. 程式人生 > >dpdk記憶體管理

dpdk記憶體管理

dpdk的兩大特色igb_uio和共享記憶體,而igb_uio也是建立在共享記憶體的基礎上的。本文就dpdk記憶體相關的知識做一下梳理,加深一下對這方面知識的理解,並提供一些解決問題的手段。 1、dpdk共享記憶體採用的hugepage技術 hugepage的配置之前的文章已經講解過了,這兒需要了解 一下hugepage的基本原理。 因為dpdk涉及到虛擬地址到實體地址的轉換:   physaddr= ((page & 0x7fffffffffffffULL) * page_size) + ((unsigned long)virtaddr % page_size); dpdk涉及到的共享記憶體有: a、 hugapage用於資料轉發,程序之間共享資料結構等用途 b、物理網絡卡配置部分的貢獻記憶體,暫存器地址 2、hugepage
a)記憶體訪問時間取決於處理器的記憶體位置,cpu訪問本地記憶體的速度要快。 b) 檔案 -page - memory的對映關係,檔案對映的虛擬記憶體在mapping segment
3、dpdk hugepage初始化 1)需根據系統配置的hugepage,獲取page型別以及對應的page數量,並生成對應page檔案,並通過相應的資料結構記錄hugepage相關的資訊 eal_hugepage_info_init(); hugepage 資訊記錄到internal_config的 struct hugepage_info hugepage_info[MAX_HUGEPAGE_SIZES]; 2)有了hugepage資訊以後,後續就是記憶體對映,初始化記憶體,保證使用者維護和使用簡單。也就是dpdk的記憶體管理。 rte_eal_memory_init() master core初始化記憶體 slave core通過獲取記憶體配置資訊在初始化自己的記憶體 a、建立每個page檔案的資料結構 主要用於記錄,每個檔案對映後的虛擬記憶體地址,實體記憶體地址等資訊 struct hugepage_file { void *orig_va; /**< virtual addr of first mmap() */
void *final_va; /**< virtual addr of 2nd mmap() */ uint64_t physaddr; /**< physical addr */ size_t size; /**< the page size */ int socket_id; /**< NUMA socket ID */ int file_id; /**< the '%d' in HUGEFILE_FMT */ int memseg_id; /**< the memory segment to which page belongs */ #ifdef RTE_EAL_SINGLE_FILE_SEGMENTS int repeated; /**< number of times the page size is repeated */ #endif char filepath[MAX_HUGEPAGE_PATH]; /**< path to backing file on filesystem */ }; b、進行hugepage地址對映 10個page 每個page2M aa)第一次對映。對映10*2M的虛擬記憶體空間vir_addr,保證每個page的虛擬地址是連續的,虛擬地址首地址可以指定 static void* hugepage_addr = (void*)(0x7b0000000000); static void* hugepage_info_addr = (void*)(0x7a0000000000); static void* rte_config_addr = (void*)(0x7a1000000000); 虛擬地址為什麼要連續?
bb)把每個hugepage依次對映到,vir_addr範圍內 rtemap_0 : vir_addr rtemap_1 : vir_addr + page_size …… rtemap_n : vir_addr + n*page_size c、實體地址到虛擬地址轉換 把每一個page的虛擬地址對映到對應的實體地址。 physaddr = ((page & 0x7fffffffffffffULL) * page_size)+ ((unsigned long)virtaddr % page_size); 從/proc/self/pagemap獲取page 思考一下如何進行的TLB轉換,特別是細節,對於Linux記憶體管理會進一步加深理解?
d、把每個hugepage按實體地址大小進行排序, e、重新對映hugepage 保證虛擬地址儘可能連續 保證實體地址儘可能連續 上圖描述了 第一次對映,虛擬地址連續,實體地址肯能不連續 實體地址排序,排序後page順序發生變化,虛擬地址不再連續 第二次對映,實體地址連續,虛擬地址也連續 f、unmap第一次對映的虛擬地址 g、對映共享記憶體。儲存記錄記憶體資訊的資料結構,此後對記憶體的訪問都要基於這個資料結構。如果這部分記憶體被破壞,對大頁記憶體的訪問將會出現異常。 h、實體記憶體資訊記錄到memseg中。
4、heap的構造以及如何使用 構造heap的基本原因,把屬於對應socket的memseg插入對應的list。
待續。。。。。。

相關推薦

dpdk記憶體管理--------初始化

DPDK的記憶體初始化工作,主要是將hugetlbfs的配置的大記憶體頁,根據其對映的實體地址是否連續、屬於哪個Socket等,有效的組織起來,為後續管理提供便利。 eal_hugepage_info_init() 主要是獲取配置好的Hugetlbfs的相關資訊,

dpdk記憶體管理

dpdk的兩大特色igb_uio和共享記憶體,而igb_uio也是建立在共享記憶體的基礎上的。本文就dpdk記憶體相關的知識做一下梳理,加深一下對這方面知識的理解,並提供一些解決問題的手段。 1、dpdk共享記憶體採用的hugepage技術 hugepage的配置之前的文

DPDK-記憶體管理分析一

前言《DPDK-大頁記憶體使用分析》中粗略分析了DPDK獲取hugepage配置和記憶體對映的流程,並提到儲存了相關資訊在全域性的memseg陣列中。到此為止,DPDK相關程序就可以像使用普通記憶體一樣使用這些hugepage。但是具體如何使用,還需要進一步的分析DPDK的記

第四節:FreeRTOS 記憶體管理

目錄 記憶體管理的介紹 記憶體碎片 Heap_1-5記憶體分配的區別 Heap_1:適用於一旦建立好記憶體,就不刪除的任務。       (本質是分配的大陣列做記憶體堆.) Heap_2:適用於重複分配和刪除具有相同堆疊空間任務。(本質是分配的大

Objective-C高階程式設計:iOS與OS X多執行緒和記憶體管理

這篇文章主要給大家講解一下GCD的平時不太常用的API,以及文末會貼出GCD定時器的一個小例子。 需要學習的朋友可以通過網盤免費下載pdf版 (先點選普通下載-----再選擇普通使用者就能免費下載了)http://putpan.com/fs/cy1i1beebn7s0h4u9/ 1.G

找工作筆試面試那些事兒(3)---記憶體管理那些事

作者:寒小陽 時間:2013年8月。 出處:http://blog.csdn.net/han_xiaoyang/article/details/10676931。 宣告:版權所有,轉載請註明出處,謝謝。   七、記憶體管理        

記憶體管理+記憶體佈局

記憶體管理 8.1 作用域 C語言變數的作用域分為: l  程式碼塊作用域(程式碼塊是{}之間的一段程式碼) l  函式作用域 l  檔案作用域 8.1.1 區域性變數 區域性變數也叫auto自動變數(auto可寫可不寫),一般情況下程式碼塊{}內部定義的變數都是自

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

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

[讀書筆記]iOS與OS X多執行緒和記憶體管理 [GCD部分]

3.2 GCD的API 蘋果對GCD的說明:開發者要做的只是定義想執行的任務並追加到適當的Dispatch Queue中。 “Dispatch Queue”是執行處理的等待佇列。通過dispatch_async函式等API,在Block

c++之動態記憶體管理

1.new/delete 和operator new/operator delete和malloc/free的關係 ①new呼叫operator new分配空間②new呼叫建構函式初始化物件。③delete呼叫解構函式清理物件 ④delete呼叫operator delete釋放空間 ⑤ope

Java_記憶體管理和繼承

Java 記憶體管理 例項 public class Test { public static void main(String[] args) { // TODO Auto-generated method

Android 記憶體管理記錄

專案中用到大量大圖,造成快速切換Activity後記憶體不足,如登入介面用到3M高清大圖,裝置選擇用到5張大圖背景疊加效果,主介面用到了5張遮罩大圖,設定介面總的子activity中也有大圖出現。 啟動Splash——裝置選擇介面(保留棧低,不finish,但會把背景圖片回收)-->主介面-

AMS之記憶體管理

原文地址:http://www.jianshu.com/p/72045d243b44 參考資料地址:http://book.51cto.com/art/201109/291375.htm 記憶體管理包括兩個部分 1.當應用程式關閉後,後臺對應的程序並沒有真正退出,以便下次啟動時能夠

三、Java虛擬機器自動記憶體管理機制、物件建立及記憶體分配

  1、物件是如何建立: 步驟:    (1)、虛擬機器遇到new <類名>的指令---->根據new的引數是否在常量池中定位一個類的符號引用    (2)、檢測該符號引用代表的類是否已經被載入、解析、和初始化。(如果沒有則

第七章—記憶體管理【計算機作業系統】

7.1 記憶體管理需要滿足哪些需求? 重定位、保護、共享、邏輯組織和物理組織。 7.2 為什麼需要重定位程序的能力? 通常情況下,並不能事先知道在某個程式執行期間會有哪個程式駐留在主存中。此外還希望通過提供一個巨大的就緒程序池,能夠把活動程序換入和換出主存,以便使處理器的利用率

【c/c++】記憶體管理

文章目錄 1.c/c++記憶體分配 2.C語言中動態記憶體管理方式malloc/calloc/realloc與free 3.C++記憶體管理方式 3.1new/delete操作內建型別 3.2new和delete操

8、【C++】記憶體管理

C++記憶體管理 一、記憶體分配方式     在C++中記憶體被分為5個區,分別是:棧區、堆區、自由儲存區、全域性/靜態儲存區和常量儲存區。 1、棧區     在執行函式時,函式內區域性變數的儲存單元都可一在棧上建立,函式執行結束時,這些儲存單元自動被釋放。棧記憶體分配運算內建與

QEMU深入淺出: guest實體記憶體管理

原  文:http://blog.vmsplice.net/2016/01/qemu-internals-how-guest-physical-ram.html 作  者:Stefan Hajnoczi 領  域:Open source and virtuali

記憶體管理函式(C++學習筆記 14)

一、C語言中的記憶體管理函式 記憶體分配函式主要有malloc( )和calloc( ),記憶體釋放函式是free( )。 這兩類函式的原型在stdlib.h中,要使用這些函式時,首先要用檔案包含: #include"stdlib.h" 或#include<stdli

【Java】「深入理解Java虛擬機器」學習筆記(2)-記憶體管理

 一、執行時資料區   JVM在執行Java程式的時候,將其執行時資料區劃分為若干不同區域。它們的用途和建立及銷燬的時間不同。      1、程式計數器(Program Counter Register)     是一塊很小的記憶體空間。當執行緒執行的是Java方法,它記錄的是當前正在執行的