LDD3學習筆記(11) 記憶體分配

2021-05-26 16:12:55 字數 4423 閱讀 6326

kmalloc分配記憶體快並且不清零獲得的記憶體區,記憶體區保留它原來的內容,分配的區在物理記憶體中連續。

#include 

void *kmalloc(size_t size, int flags);

void kfree(void *obj);

記憶體分配的最常用介面.

#include 

gfp_user

gfp_kernel

gfp_nofs

gfp_noio

gfp_atomic 

控制記憶體分配如何進行的標誌, 

從最少限制的到最多的

. gfp_user 

和 gfp_kernel 

優先順序 允許當前程序被置為睡眠來滿足請求. gfp_nofs 

和 gfp_noio 

禁止檔案系統操作和所有

的 i/o 

操作, 

分別地, 

而 gfp_atomic 

分配根本不能睡眠

. __gfp_dma

__gfp_highmem

__gfp_cold

__gfp_nowarn

__gfp_high

__gfp_repeat

__gfp_nofail

__gfp_noretry 

這些標誌修改核心的行為, 

當分配記憶體時

. #include 

kmem_cache_t *kmem_cache_create(char *name, size_t size, size_t offset, unsigned long flags, constructor

(), destructor( ));

int kmem_cache_destroy(kmem_cache_t *cache);

建立和銷毀乙個 slab 

快取. 

這個快取可被用來分配幾個相同大小的物件

. slab_no_reap

slab_hwcache_align

slab_cache_dma 

在建立乙個快取時可指定的標誌.

slab_ctor_atomic

slab_ctor_constructor 

分配器可用傳遞給建構函式和析構函式的標誌.

void *kmem_cache_alloc(kmem_cache_t *cache, int flags);

void kmem_cache_free(kmem_cache_t *cache, const void *obj);

從快取中分配和釋放乙個單個物件. /proc/slabinfo 

乙個包含對 

slab 

快取使用情況統計的虛擬

檔案.#include 

mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, mempool_free_t *free_fn, void 

*data);

void mempool_destroy(mempool_t *pool);

建立記憶體池的函式, 

它試圖避免記憶體分配裝置

, 通過保持乙個已分配項的

"緊急列表

". void *mempool_alloc(mempool_t *pool, int gfp_mask);

void mempool_free(void *element, mempool_t *pool);

從(並且返回它們給

)記憶體池分配項的函式

. unsigned long get_zeroed_page(int flags);

unsigned long __get_free_page(int flags);

unsigned long __get_free_pages(int flags, unsigned long order);

面向頁的分配函式. get_zeroed_page 

返回乙個單個的

, 零填充的頁

. 這個呼叫的所有的其他版

本不初始化返回頁的內容.

int get_order(unsigned long size);

返回關聯在當前平台的大小的分配級別, 

根據 page_size. 

這個引數必須是 

2 的冪

, 並且返回

值至少是 0.

void free_page(unsigned long addr);

void free_pages(unsigned long addr, unsigned long order);

釋放面向頁分配的函式.

struct page *alloc_pages_node(int nid, unsigned int flags, unsigned int order);

struct page *alloc_pages(unsigned int flags, unsigned int order);

struct page *alloc_page(unsigned int flags);

linux 核心中最底層頁分配器的所有變體

. void __free_page(struct page *page);

void __free_pages(struct page *page, unsigned int order);

void free_hot_page(struct page *page);

使用乙個 alloc_page 

形式分配的頁的各種釋放方法

. #include 

void * vmalloc(unsigned long size);

void vfree(void * addr);

#include 

void * ioremap(unsigned long offset, unsigned long size);

void iounmap(void *addr);

分配或釋放乙個連續虛擬位址空間的函式. iormap 

訪問物理記憶體通過虛擬位址

, 而 

vmalloc 

分 配空閒頁. 

使用 ioreamp 

對映的區是 

iounmap 

釋放, 

而從 vmalloc 

獲得的頁使用 

vfree 

來釋放.

#include 

define_per_cpu(type, name);

declare_per_cpu(type, name);

定義和宣告每-cpu

變數的巨集

. per_cpu(variable, int cpu_id)

get_cpu_var(variable)

put_cpu_var(variable)

提供對靜態宣告的每-cpu

變數訪問的巨集

. void *alloc_percpu(type);

void *__alloc_percpu(size_t size, size_t align);

void free_percpu(void *variable);

進行執行時分配和釋放每-cpu

變數的函式

. int get_cpu( );

void put_cpu( );

per_cpu_ptr(void *variable, int cpu_id)

get_cpu 獲得對當預處理器的引用(因此

, 阻止搶占和移動到另乙個處理器

)並且返回處理器

的id; put_cpu 

返回這個引用

. 為訪問乙個動態分配的每

-cpu

變數, 

用應當被訪問版本所在

的 cpu 

的 id 

來使用 

per_cpu_ptr. 

對乙個動態的每

-cpu 

變數當前 

cpu 

版本的操作

, 應當用

對 get_cpu 

和 put_cpu 

的呼叫來包圍

.  #include 

void *alloc_bootmem(unsigned long size);

void *alloc_bootmem_low(unsigned long size);

void *alloc_bootmem_pages(unsigned long size);

void *alloc_bootmem_low_pages(unsigned long size);

void free_bootmem(unsigned long addr, unsigned long size);

在系統啟動時進行分配和釋放記憶體的函式(

只能被直接連線到核心中去的驅動使用

)

LDD3學習筆記(11) 記憶體分配

kmalloc分配記憶體快並且不清零獲得的記憶體區,記憶體區保留它原來的內容,分配的區在物理記憶體中連續。include void kmalloc size tsize,intflags voidkfree void obj 記憶體分配的最常用介面.include gfp user gfp kern...

LDD3讀書筆記(第5章 記憶體分配)

include void kmalloc size t size,int flags 記憶體分配函式 後備快取記憶體 include kmem cache t kmem cache create const char name,size t size,size t offset,unsigned l...

LDD3學習筆記 模組的編譯

新手上路,ldd3學習之旅開始,以下內容純屬筆記,若有錯誤,望見諒!1.什麼是 模組 可以在系統執行時加入到核心中的 故 模組包括但不限於裝置驅動程式。2.如何寫乙個模組?1 c檔案 2 實現module init,module exit3.ldd3中makefile編寫規則 照搬 ifneq ke...