W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
相關(guān)于內(nèi)存分配的函數(shù)和符號是:
#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)存分配如何進行的標(biāo)志, 從最少限制的到最多的. GFP_USER 和 GFP_KERNEL 優(yōu)先級允許當(dā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)存時.
#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)建和銷毀一個 slab 緩存. 這個緩存可被用來分配幾個相同大小的對象.
SLAB_NO_REAP
SLAB_HWCACHE_ALIGN
SLAB_CACHE_DMA
在創(chuàng)建一個緩存時可指定的標(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);
從緩存中分配和釋放一個單個對象. /proc/slabinfo 一個包含對 slab 緩存使用情況統(tǒng)計的虛擬文件.
#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è)備, 通過保持一個已分配項的"緊急列表".
void *mempool_alloc(mempool_t *pool, int gfp_mask);
void mempool_free(void *element, mempool_t *pool);
從(并且返回它們給)內(nèi)存池分配項的函數(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 返回一個單個的, 零填充的頁. 這個調(diào)用的所有的其他版本不初始化返回頁的內(nèi)容.
int get_order(unsigned long size);
返回關(guān)聯(lián)在當(dāng)前平臺的大小的分配級別, 根據(jù) PAGE_SIZE. 這個參數(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);
使用一個 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);
分配或釋放一個連續(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)
提供對靜態(tài)聲明的每-CPU變量存取的宏.
void *alloc_percpu(type);
void *__alloc_percpu(size_t size, size_t align);
void free_percpu(void *variable);
進行運行時分配和釋放每-CPU變量的函數(shù).
int get_cpu( );
void put_cpu( );
per_cpu_ptr(void *variable, int cpu_id)
get_cpu 獲得對當(dāng)前處理器的引用(因此, 阻止搶占和移動到另一個處理器)并且返回處理器的ID; put_cpu 返回這個引用. 為存取一個動態(tài)分配的每-CPU變量, 用應(yīng)當(dāng)被存取版本所在的 CPU 的 ID 來使用 per_cpu_ptr. 對一個動態(tài)的每-CPU 變量當(dāng)前 CPU 版本的操作, 應(yīng)當(dāng)用對 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)啟動時進行分配和釋放內(nèi)存的函數(shù)(只能被直接連接到內(nèi)核中去的驅(qū)動使用)
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: