Linux通用記憶體分配器genalloc

2021-09-05 12:22:12 字數 1708 閱讀 2239

核心的genalloc是給一些需要自己維護記憶體分配的核心模組使用的,如sram, tcm, shared-memory,ion等,記憶體可以通過預留,或者從夥伴系統分配,然後新增到memory pool。

它提供了最先適配 fist-fit和最佳匹配 best-fit兩種分配演算法。

irst-fit 和 best-fit

這兩種都是通過bitmap來標記記憶體中每個分配單元的狀態,空閒或已分配。 最先分配是將第乙個可容納請求大小的的連續空閒空間分配出去。 最佳分配是將可容納請求大小的的最小連續空閒空間分配出去。 假設某片記憶體被劃分為10個最小單 元.

這兩種方法都會產生記憶體碎片,特別是first-fit,但是分配和釋放都非常高效,實現也簡單,沒有buddy system那麼複雜,不用考慮記憶體的**,規整等等.

1、基礎資料結構

首先看下分配器用到的幾個資料結構,struct gen_pool 用來描述乙個記憶體池:

struct gen_pool ;

在使用的時候需要向記憶體池中加入記憶體塊,乙個記憶體塊即一大塊連續的物理記憶體,用 struct gen_pool_chunk 來描述:

struct gen_pool_chunk ;

2、函式介面及呼叫方法

genalloc 用到的函式介面有下面幾個:

/* 建立乙個記憶體池,主要工作是完成 struct gen_pool 的初始化 */

struct gen_pool *gen_pool_create(int min_alloc_order, int nid);

/* 向記憶體池中加入記憶體塊,addr 為起始位址,size 為大小 */

int gen_pool_add(struct gen_pool *pool, unsigned long addr, size_t size, int nid);

/* 銷毀乙個記憶體池 */

void gen_pool_destroy(struct gen_pool *pool);

/* 記憶體池分配記憶體的函式 */

unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size);

/* 記憶體池釋放記憶體的函式 */

void gen_pool_free(struct gen_pool *pool, unsigned long addr, size_t size);

3.使用方法

1. 建立記憶體池

//min_alloc_order最小分配單位

struct gen_pool *gen_pool_create(int min_alloc_order, int nid)

2. 新增記憶體到記憶體池

//記憶體**可以是預留,也可以從夥伴系統分配.

int gen_pool_add_virt(struct gen_pool *pool, unsigned long virt, phys_addr_t phys,

size_t size, int nid)

3. 分配/釋放記憶體

unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size)

void gen_pool_free(struct gen_pool *pool, unsigned long addr, size_t size)

4.銷毀記憶體池

void gen_pool_destroy(struct gen_pool *pool)

記憶體分配 定長記憶體分配器

在各種記憶體分配演算法中,有一種很實用,實現起來也簡單 定長的記憶體分配器。即每次分配的記憶體大小是固定的。大概邏輯是 在一些區域性的單執行緒邏輯中,可以有效提高效率。很短,很容易看懂 fallocator.h pragma once 固定長度的記憶體分配器 include include incl...

記憶體分配器一

glibc記憶體管理學習 x86平台linux程序記憶體布局 text elf格式程式 data 程式執行時就能確定的資料,可讀可寫 bss 沒有初始化的全域性變數和靜態表裡 heap stack 由編譯器自動分配釋放,存放函式引數 區域性變數等 mmap 對映區域 實現乙個malloc 分頁與位址...

(六)記憶體分配器

c 的stl中定義了很多容器,容器的第二個模板引數通常為allocator型別。標準庫中allocator類定義在標頭檔案memory中,用於幫助將記憶體分配和物件的構造分離開來。它分配的記憶體是原始的 未構造的。allocatoralloc 定義了乙個可以分配string的allocator物件 ...