8.6. 快速參考

2018-02-24 15:49 更新

8.6.?快速參考

相關(guān)于內(nèi)存分配的函數(shù)和符號(hào)是:

#include <linux/slab.h>
void *kmalloc(size_t size, int flags);
void kfree(void *obj);

內(nèi)存分配的最常用接口.

#include <linux/mm.h>
GFP_USER
GFP_KERNEL
GFP_NOFS
GFP_NOIO
GFP_ATOMIC

控制內(nèi)存分配如何進(jìn)行的標(biāo)志, 從最少限制的到最多的. GFP_USER 和 GFP_KERNEL 優(yōu)先級(jí)允許當(dāng)前進(jìn)程被置為睡眠來滿足請(qǐng)求. GFP_NOFS 和 GFP_NOIO 禁止文件系統(tǒng)操作和所有的 I/O 操作, 分別地, 而 GFP_ATOMIC 分配根本不能睡眠.

__GFP_DMA
__GFP_HIGHMEM
__GFP_COLD
__GFP_NOWARN
__GFP_HIGH
__GFP_REPEAT
__GFP_NOFAIL
__GFP_NORETRY

這些標(biāo)志修改內(nèi)核的行為, 當(dāng)分配內(nèi)存時(shí).

#include <linux/malloc.h>
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);

創(chuàng)建和銷毀一個(gè) slab 緩存. 這個(gè)緩存可被用來分配幾個(gè)相同大小的對(duì)象.

SLAB_NO_REAP
SLAB_HWCACHE_ALIGN
SLAB_CACHE_DMA

在創(chuàng)建一個(gè)緩存時(shí)可指定的標(biāo)志.

SLAB_CTOR_ATOMIC
SLAB_CTOR_CONSTRUCTOR

分配器可用傳遞給構(gòu)造函數(shù)和析構(gòu)函數(shù)的標(biāo)志.

void *kmem_cache_alloc(kmem_cache_t *cache, int flags);
void kmem_cache_free(kmem_cache_t *cache, const void *obj);

從緩存中分配和釋放一個(gè)單個(gè)對(duì)象. /proc/slabinfo 一個(gè)包含對(duì) slab 緩存使用情況統(tǒng)計(jì)的虛擬文件.

#include <linux/mempool.h>
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);

創(chuàng)建內(nèi)存池的函數(shù), 它試圖避免內(nèi)存分配設(shè)備, 通過保持一個(gè)已分配項(xiàng)的"緊急列表".

void *mempool_alloc(mempool_t *pool, int gfp_mask);
void mempool_free(void *element, mempool_t *pool);

從(并且返回它們給)內(nèi)存池分配項(xiàng)的函數(shù).

unsigned long get_zeroed_page(int flags);
unsigned long __get_free_page(int flags);
unsigned long __get_free_pages(int flags, unsigned long order);

面向頁的分配函數(shù). get_zeroed_page 返回一個(gè)單個(gè)的, 零填充的頁. 這個(gè)調(diào)用的所有的其他版本不初始化返回頁的內(nèi)容.

int get_order(unsigned long size);

返回關(guān)聯(lián)在當(dāng)前平臺(tái)的大小的分配級(jí)別, 根據(jù) PAGE_SIZE. 這個(gè)參數(shù)必須是 2 的冪, 并且返回值至少是 0.

void free_page(unsigned long addr);
void free_pages(unsigned long addr, unsigned long order);

釋放面向頁分配的函數(shù).

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 內(nèi)核中最底層頁分配器的所有變體.

void __free_page(struct page *page);
void __free_pages(struct page *page, unsigned int order);
void free_hot_page(struct page *page);

使用一個(gè) alloc_page 形式分配的頁的各種釋放方法.

#include <linux/vmalloc.h>
void * vmalloc(unsigned long size);
void vfree(void * addr);
#include <asm/io.h>
void * ioremap(unsigned long offset, unsigned long size);
void iounmap(void *addr);

分配或釋放一個(gè)連續(xù)虛擬地址空間的函數(shù). iormap 存取物理內(nèi)存通過虛擬地址, 而 vmalloc 分配空閑頁. 使用 ioreamp 映射的區(qū)是 iounmap 釋放, 而從 vmalloc 獲得的頁使用 vfree 來釋放.

#include <linux/percpu.h>
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)

提供對(duì)靜態(tài)聲明的每-CPU變量存取的宏.

void *alloc_percpu(type);
void *__alloc_percpu(size_t size, size_t align);
void free_percpu(void *variable);

進(jìn)行運(yùn)行時(shí)分配和釋放每-CPU變量的函數(shù).

int get_cpu( );
void put_cpu( );
per_cpu_ptr(void *variable, int cpu_id)

get_cpu 獲得對(duì)當(dāng)前處理器的引用(因此, 阻止搶占和移動(dòng)到另一個(gè)處理器)并且返回處理器的ID; put_cpu 返回這個(gè)引用. 為存取一個(gè)動(dòng)態(tài)分配的每-CPU變量, 用應(yīng)當(dāng)被存取版本所在的 CPU 的 ID 來使用 per_cpu_ptr. 對(duì)一個(gè)動(dòng)態(tài)的每-CPU 變量當(dāng)前 CPU 版本的操作, 應(yīng)當(dāng)用對(duì) get_cpu 和 put_cpu 的調(diào)用來包圍.

#include <linux/bootmem.h>
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);

在系統(tǒng)啟動(dòng)時(shí)進(jìn)行分配和釋放內(nèi)存的函數(shù)(只能被直接連接到內(nèi)核中去的驅(qū)動(dòng)使用)

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)