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

2021-08-25 23:55:10 字數 3689 閱讀 6130

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

#include

void*kmalloc(size_tsize,intflags);

voidkfree(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_tsize,size_toffset,unsignedlongflags,constructor

(),destructor());

intkmem_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,intflags);

voidkmem_cache_free(kmem_cache_t*cache,constvoid*obj);

從快取中分配和釋放乙個單個物件./proc/slabinfo乙個包含對slab快取使用情況統計的虛擬

檔案.

#include

mempool_t*mempool_create(intmin_nr,mempool_alloc_t*alloc_fn,mempool_free_t*free_fn,void

*data);

voidmempool_destroy(mempool_t*pool);

建立記憶體池的函式,它試圖避免記憶體分配裝置,通過保持乙個已分配項的"緊急列表".

void*mempool_alloc(mempool_t*pool,intgfp_mask);

voidmempool_free(void*element,mempool_t*pool);

從(並且返回它們給)記憶體池分配項的函式.

unsignedlongget_zeroed_page(intflags);

unsignedlong__get_free_page(intflags);

unsignedlong__get_free_pages(intflags,unsignedlongorder);

面向頁的分配函式.get_zeroed_page返回乙個單個的,零填充的頁.這個呼叫的所有的其他版

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

intget_order(unsignedlongsize);

返回關聯在當前平台的大小的分配級別,根據page_size.這個引數必須是2的冪,並且返回

值至少是0.

voidfree_page(unsignedlongaddr);

voidfree_pages(unsignedlongaddr,unsignedlongorder);

釋放面向頁分配的函式.

structpage*alloc_pages_node(intnid,unsignedintflags,unsignedintorder);

structpage*alloc_pages(unsignedintflags,unsignedintorder);

structpage*alloc_page(unsignedintflags);

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

void__free_page(structpage*page);

void__free_pages(structpage*page,unsignedintorder);

voidfree_hot_page(structpage*page);

使用乙個alloc_page形式分配的頁的各種釋放方法.

#include

void*vmalloc(unsignedlongsize);

voidvfree(void*addr);

#include

void*ioremap(unsignedlongoffset,unsignedlongsize);

voidiounmap(void*addr);

分配或釋放乙個連續虛擬位址空間的函式.iormap訪問物理記憶體通過虛擬位址,而vmalloc分

配空閒頁.使用ioreamp對映的區是iounmap釋放,而從vmalloc獲得的頁使用vfree來釋放.

#include

define_per_cpu(type,name);

declare_per_cpu(type,name);

定義和宣告每-cpu變數的巨集.

per_cpu(variable,intcpu_id)

get_cpu_var(variable)

put_cpu_var(variable)

提供對靜態宣告的每-cpu變數訪問的巨集.

void*alloc_percpu(type);

void*__alloc_percpu(size_tsize,size_talign);

voidfree_percpu(void*variable);

進行執行時分配和釋放每-cpu變數的函式.

intget_cpu();

voidput_cpu();

per_cpu_ptr(void*variable,intcpu_id)

get_cpu獲得對當預處理器的引用(因此,阻止搶占和移動到另乙個處理器)並且返回處理器

的id;put_cpu返回這個引用.為訪問乙個動態分配的每-cpu變數,用應當被訪問版本所在

的cpu的id來使用per_cpu_ptr.對乙個動態的每-cpu變數當前cpu版本的操作,應當用

對get_cpu和put_cpu的呼叫來包圍.

#include

void*alloc_bootmem(unsignedlongsize);

void*alloc_bootmem_low(unsignedlongsize);

void*alloc_bootmem_pages(unsignedlongsize);

void*alloc_bootmem_low_pages(unsignedlongsize);

voidfree_bootmem(unsignedlongaddr,unsignedlongsize);

在系統啟動時進行分配和釋放記憶體的函式(只能被直接連線到核心中去的驅動使用)

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

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

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...