Linux 内核提供了一系列用于内存管理的函数,主要可以分为以下几类:
struct page *alloc_pages(gfp_t gfp_mask, unsigned int order);
void *__get_free_pages(gfp_t gfp_mask, unsigned int order);
void free_pages(unsigned long addr, unsigned int order);
alloc_pages
: 分配连续的物理页,返回指向第一个页的指针__get_free_pages
: 分配连续的物理页,返回虚拟地址free_pages
: 释放分配的页void *kmalloc(size_t size, gfp_t flags);
void kfree(const void *objp);
kmalloc
: 分配内核内存,保证物理上连续kfree
: 释放由 kmalloc 分配的内存void *vmalloc(unsigned long size);
void vfree(const void *addr);
vmalloc
: 分配虚拟地址连续但物理地址不一定连续的内存vfree
: 释放由 vmalloc 分配的内存kmem_cache_t *kmem_cache_create(const char *name, size_t size,
size_t align, unsigned long flags,
void (*ctor)(void*));
void *kmem_cache_alloc(kmem_cache_t *cachep, gfp_t flags);
void kmem_cache_free(kmem_cache_t *cachep, void *objp);
void kmem_cache_destroy(kmem_cache_t *cachep);
unsigned long get_free_page(gfp_t gfp_mask);
unsigned long __get_dma_pages(gfp_t gfp_mask, unsigned int order);
int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr,
unsigned long pfn, unsigned long size, pgprot_t prot);
unsigned long si_meminfo(struct sysinfo *val);
unsigned long get_num_physpages(void);
void mb(void);
void rmb(void);
void wmb(void);
void smp_mb(void);
void smp_rmb(void);
void smp_wmb(void);
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n);
unsigned long copy_from_user(void *to, const void __user *from, unsigned long n);
这些函数是Linux内核内存管理的核心接口,开发者应根据具体需求选择合适的内存分配方式。