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