Linux内核里面,内存申请的函数,各自的区别

在 Linux 内核中,内存申请有以下几个函数:

  1. kmalloc()

    • 函数原型:void *kmalloc(size_t size, gfp_t flags);
    • 功能:用于分配指定大小的内存块。
    • 参数:
      • size:要分配的内存块的大小。
      • flags:内存分配标志,用于指定内存分配的行为和特性,例如 GFP_KERNEL、GFP_ATOMIC 等。
    • 返回值:返回分配的内存块的指针,如果分配失败,则返回 NULL。
    • 区别:
      • kmalloc() 主要用于分配较小的内存块,大小一般不超过页框(通常是 4KB)。
      • kmalloc() 分配的内存是虚拟地址空间的连续区域。
  2. kzalloc()

    • 函数原型:void *kzalloc(size_t size, gfp_t flags);
    • 功能:用于分配指定大小的内存块,并将其初始化为 0。
    • 参数:
      • size:要分配的内存块的大小。
      • flags:内存分配标志,用于指定内存分配的行为和特性。
    • 返回值:返回分配的内存块的指针,如果分配失败,则返回 NULL。
    • 区别:
      • kzalloc() 和 kmalloc() 的功能基本相同,但是额外会将分配的内存块清零。
  3. vmalloc()

    • 函数原型:void *vmalloc(unsigned long size);
    • 功能:用于分配较大的内存块,大小超过页框(通常是 4KB)。
    • 参数:
      • size:要分配的内存块的大小。
    • 返回值:返回分配的内存块的指针,如果分配失败,则返回 NULL。
    • 区别:
      • vmalloc() 分配的内存块不要求在物理地址上连续,可能会通过页表映射来实现。

这些函数可以根据应用程序的需要选择合适的函数进行内存分配。kmalloc() 和 kzalloc() 主要用于分配较小的内存块,而 vmalloc() 则用于分配较大的内存块。请注意,在内核编程中使用这些函数时,需要了解每个函数的使用场景和潜在限制,并采取适当的内存管理策略。

猜你喜欢

转载自blog.csdn.net/weixin_37787043/article/details/132024815