在Linux驱动开发中,内存管理是核心环节。kmalloc
/kfree
与malloc
/free
分别服务于内核空间和用户空间,其设计机制、适用场景及行为特性存在本质差异。以下从技术原理、使用规范、性能考量等维度进行系统性解析:
1. 归属空间与作用域
-
内核空间(Kernel Space):
kmalloc
/kfree
:属于Linux内核内存管理接口,仅能在内核模块、驱动或内核线程中调用。内存来源于内核逻辑地址空间(通过buddy system
和slab allocator
实现),物理内存连续(通常小于128KB
,大块内存需用vmalloc
或alloc_pages
)。- 特性:分配的内存默认未清零(可用
kzalloc
初始化零值),支持GFP标志位(如GFP_KERNEL
、GFP_ATOMIC
)控制分配行为(如是否可睡眠、是否使用紧急池)。
-
用户空间(User Space):
malloc
/free
:属于标准C库(如glibc)的内存管理函数,运行于用户进程上下文。内存来源于堆(heap),通过brk
/mmap
系统调用动态扩展,由glibc的内存分配器(如ptmalloc
、jemalloc
、tcmalloc
)管理,可能存在多级缓存和线程局部存储优化。
2. 函数原型与参数
-
kmalloc
:void *kmalloc(