在 Linux 内核中,内存申请有以下几个函数:
-
kmalloc()
- 函数原型:
void *kmalloc(size_t size, gfp_t flags);
- 功能:用于分配指定大小的内存块。
- 参数:
size
:要分配的内存块的大小。flags
:内存分配标志,用于指定内存分配的行为和特性,例如 GFP_KERNEL、GFP_ATOMIC 等。
- 返回值:返回分配的内存块的指针,如果分配失败,则返回 NULL。
- 区别:
- kmalloc() 主要用于分配较小的内存块,大小一般不超过页框(通常是 4KB)。
- kmalloc() 分配的内存是虚拟地址空间的连续区域。
- 函数原型:
-
kzalloc()
- 函数原型:
void *kzalloc(size_t size, gfp_t flags);
- 功能:用于分配指定大小的内存块,并将其初始化为 0。
- 参数:
size
:要分配的内存块的大小。flags
:内存分配标志,用于指定内存分配的行为和特性。
- 返回值:返回分配的内存块的指针,如果分配失败,则返回 NULL。
- 区别:
- kzalloc() 和 kmalloc() 的功能基本相同,但是额外会将分配的内存块清零。
- 函数原型:
-
vmalloc()
- 函数原型:
void *vmalloc(unsigned long size);
- 功能:用于分配较大的内存块,大小超过页框(通常是 4KB)。
- 参数:
size
:要分配的内存块的大小。
- 返回值:返回分配的内存块的指针,如果分配失败,则返回 NULL。
- 区别:
- vmalloc() 分配的内存块不要求在物理地址上连续,可能会通过页表映射来实现。
- 函数原型:
这些函数可以根据应用程序的需要选择合适的函数进行内存分配。kmalloc() 和 kzalloc() 主要用于分配较小的内存块,而 vmalloc() 则用于分配较大的内存块。请注意,在内核编程中使用这些函数时,需要了解每个函数的使用场景和潜在限制,并采取适当的内存管理策略。