插件窝 干货文章 linux内存管理相关的几个函数

linux内存管理相关的几个函数

void unsigned 内存 分配 446    来源:    2025-04-29

Linux 内存管理相关函数

Linux 内核提供了一系列用于内存管理的函数,主要可以分为以下几类:

1. 页分配函数

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: 释放分配的页

2. kmalloc/kfree 系列

void *kmalloc(size_t size, gfp_t flags);
void kfree(const void *objp);
  • kmalloc: 分配内核内存,保证物理上连续
  • kfree: 释放由 kmalloc 分配的内存

3. vmalloc/vfree 系列

void *vmalloc(unsigned long size);
void vfree(const void *addr);
  • vmalloc: 分配虚拟地址连续但物理地址不一定连续的内存
  • vfree: 释放由 vmalloc 分配的内存

4. slab 分配器函数

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);
  • 用于高效分配和释放相同大小的对象

5. 内存映射函数

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);
  • 用于处理特殊内存区域如DMA等

6. 内存统计函数

unsigned long si_meminfo(struct sysinfo *val);
unsigned long get_num_physpages(void);
  • 获取系统内存信息

7. 内存屏障函数

void mb(void);
void rmb(void);
void wmb(void);
void smp_mb(void);
void smp_rmb(void);
void smp_wmb(void);
  • 保证内存访问顺序

8. 用户空间内存访问

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内核内存管理的核心接口,开发者应根据具体需求选择合适的内存分配方式。