内核空间中是malloc()吗?

时间:2017-01-29 05:04:07

标签: linux linux-kernel kernel

我知道kmalloc()可以替换内核空间上的malloc()。很多人认为malloc()无法在内核空间中运行;但是,我在linux-4.9.6/include/linux/decompress/mm.h

找到了这个定义
static void *malloc(int size)
{
    void *p;

    if (size < 0)
        return NULL;
    if (!malloc_ptr)
        malloc_ptr = free_mem_ptr;

    malloc_ptr = (malloc_ptr + 3) & ~3;     /* Align */

    p = (void *)malloc_ptr;
    malloc_ptr += size;

    if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr)
        return NULL;

    malloc_count++;
    return p;
}

这是否意味着我们可以在内核级别使用malloc()

1 个答案:

答案 0 :(得分:2)

总之:不。

该代码之前的注释解释了它的用途:

 * Memory management for pre-boot and ramdisk uncompressors

此代码仅在kmalloc()可用之前的系统初始化中很早就使用。 (甚至可能在它的代码被解压缩之前!)它非常有限 - 它不能*释放内存 - 因此它只能在非常小的范围内使用。

如果需要在内核中分配内存,则必须使用kmalloc()系列中的函数。

*:虽然有free()的实现与此malloc()配对,但它只能在一个非常特定的情况下释放内存:每个已分配的块都已被释放。