Linux驱动中的内存管理是一个关键且复杂的主题,涉及多种机制和技术。以下是Linux驱动内存管理的核心内容:
void *kmalloc(size_t size, gfp_t flags);
void kfree(const void *objp);
void *vmalloc(unsigned long size);
void vfree(const void *addr);
常用标志:
- GFP_KERNEL
- 标准内核分配,可能睡眠
- GFP_ATOMIC
- 原子分配,不会睡眠
- GFP_DMA
- 分配DMA可用内存
struct page *alloc_pages(gfp_t gfp_mask, unsigned int order);
void free_pages(unsigned long addr, unsigned int order);
void *dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t flag);
void dma_free_coherent(struct device *dev, size_t size,
void *cpu_addr, dma_addr_t dma_handle);
dma_addr_t dma_map_single(struct device *dev, void *ptr,
size_t size, enum dma_data_direction dir);
void dma_unmap_single(struct device *dev, dma_addr_t addr,
size_t size, enum dma_data_direction dir);
mempool_t *mempool_create(int min_nr,
mempool_alloc_t *alloc_fn,
mempool_free_t *free_fn,
void *pool_data);
void *mempool_alloc(mempool_t *pool, gfp_t gfp_mask);
void mempool_free(void *element, mempool_t *pool);
kmem_cache
管理频繁分配释放的对象slabtop
:查看内核slab分配情况/proc/meminfo
:系统内存信息vmstat
:虚拟内存统计kmemleak
:内核内存泄漏检测器理解这些内存管理机制对于编写高效、稳定的Linux驱动程序至关重要。不同类型的驱动(如字符设备、块设备、网络设备)可能需要不同的内存管理策略。