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

2021-06-09 06:14:09 字數 3208 閱讀 1603

#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 從裝置編號中抽取...