#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 long flags,
void (*constructor)(void *,kmem_cache_t *,unsigned long flags),
void (*destructor)(void *,kmem_cache_t *,unsigned long flags));
int kmem_cache_destroy(kmem_cache_t *cache);
linux記憶體快取記憶體管理有時候稱為「slab分配器」
一旦某個物件的快取記憶體被建立,就可以呼叫kmem_cache_alloc/kmem_cache_free從中分配/釋放記憶體物件:
void *kmem_cache_alloc(kmem_cache_t *cache,int flags);
void kmem_cache_free(kmem_cache_t *cache,const void *obj);
快取記憶體的使用統計情況可以從/proc/slabinfo獲得.
記憶體區段
mm/page_alloc.c,記憶體區段初始化mm/init.c
可用於dma的記憶體、常規記憶體、高階記憶體。通常的記憶體分配都發生在常規記憶體區。
記憶體池某種形式的後備快取記憶體,它試圖始終儲存空閒的記憶體,以便在緊急情況下使用.
#include
mempool_t *mempool_create(int min_nr,mempool_alloc_t *alloc_fn,
mempool_free_t *free_fn,void *pool_data);
void mempool_destroy(mempool_t *pool);
建立記憶體池物件
typedef void *(mempool_alloc_t)(int gfp_mask,void *pool_data);
typedef void (mempool_free_t)(void *element,void *pool_data);
int mempool_resize(mempool_t *pool,int new_min_nr,int gfp_mask);
調整mempool大小
get_zeroed_page(unsigned int flags);
返回指向新頁面的指標並將頁面清零
__get_free_page(unsigned int flags);
類似於get_zeroed_page,但不清零頁面
__get_free_page(unsigned int flags,unsigned int order);
分配若干(屋裡連續)頁面,並返回指向該記憶體區域第乙個位元組的指標,但不清零頁面
/proc/buddyinfo可告訴你系統中每個記憶體區段上每個階數下可獲得的資料塊數目.
void free_page(unsigned long addr);
void free_pages(unsigned long addr,unsigned long order);
記憶體區段的分配和釋放
alloc_pages介面
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);
分配記憶體頁
void __free_page(struct page *page);
void __free_pages(struct page *page,unsigned int order);
void free_hot_page(struct page *page);
void free_cold_page(struct page *page);
釋放記憶體頁
虛擬位址空間
#include
void *vmalloc(unsigned long size);
void vfree(void *addr);
void *ioremap(unsigned long offset,unsigned long size);
void iounmap(void *addr);
per-cpu變數
#include
靜態分配
define_per_cpu(type,name);
define_per_cpu(int[3],my_percpu_array);
get_cpu_var(sockets_in_use)++;
put_cpu_var(sockets_in_use);
per_cpu(variable,int cpu_id);
動態分配
void *alloc_percpu(type);
void *__alloc_percpu(size_t size,size_t align);
per_cpu_ptr(void *per_cpu_var,int cpu_id);
export_per_cpu_symbol(per_cpu_var);
export_per_cpu_symbol_gpl(per_cpu_var);
declare_per_cpu(type,name);
通過呼叫下列函式之一則可完成引導時的記憶體分配:
#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讀書筆記(第3章 字元驅動)
include dev t dev t 是用來在核心裡代表裝置號的型別.int major dev t dev int minor dev t dev 從裝置編號中抽取主次編號的巨集.dev t mkdev unsigned int major,unsigned int minor 從主次編號來建立...
LDD3讀書筆記(第6章 記憶體對映和DMA)
1 介紹性材料 include include 和記憶體管理相關的大部分函式和結構,原型和定義在這些標頭檔案.void va unsigned long physaddr unsigned long pa void kaddr 在核心邏輯位址和實體地址之間轉換的巨集定義.page size page...
LDD3 讀書筆記 之 第 3 章 字元驅動
本章介紹了下面符號和標頭檔案.struct file operations 和 struct file 中的成員的列表這裡不重複了.include dev t dev t 是用來在核心裡代表裝置號的型別.int major dev t dev int minor dev t dev 從裝置編號中抽取...