#include <stdlib.h>
void *malloc(size_t size);
void free(void *ptr);
#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
#include <alloca.h>
void *alloca(size_t size);
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);
#include <unistd.h>
int brk(void *addr);
void *sbrk(intptr_t increment);
#include <stdlib.h>
int posix_memalign(void **memptr, size_t alignment, size_t size);
#include <malloc.h>
void *memalign(size_t alignment, size_t size);
void *valloc(size_t size);
#include <linux/slab.h>
void *kmalloc(size_t size, gfp_t flags);
void kfree(const void *objp);
#include <linux/vmalloc.h>
void *vmalloc(unsigned long size);
void vfree(const void *addr);
#include <linux/gfp.h>
struct page *alloc_pages(gfp_t gfp_mask, unsigned int order);
void free_pages(unsigned long addr, unsigned int order);
#include <linux/gfp.h>
unsigned long get_zeroed_page(gfp_t gfp_mask);
unsigned long __get_free_page(gfp_t gfp_mask);
unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order);
void free_page(unsigned long addr);
void free_pages(unsigned long addr, unsigned int order);
#include <linux/slab.h>
struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align,
unsigned long flags, void (*ctor)(void *));
void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags);
void kmem_cache_free(struct kmem_cache *cachep, void *objp);
void kmem_cache_destroy(struct kmem_cache *cachep);
#include <linux/slab.h>
void *kzalloc(size_t size, gfp_t flags);
#include <linux/device.h>
void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp);
用户空间: - 一般用途:malloc/calloc/realloc - 需要对齐:posix_memalign - 大内存或特殊需求:mmap
内核空间: - 小内存(通常<1页):kmalloc/kzalloc - 大内存:vmalloc - 频繁分配释放的固定大小对象:slab分配器 - 页级分配:alloc_pages/get_free_pages - 设备驱动:devm_kmalloc
理解这些内存分配方法的区别和适用场景对于开发高效、稳定的Linux应用程序和内核模块至关重要。