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