Linux malloc()在内核空间中吗?

Linux malloc()在内核空间中吗?,linux,linux-kernel,kernel,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;

我知道
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;
}
static void*malloc(整数大小)
{
void*p;
如果(尺寸<0)
返回NULL;
如果(!malloc_ptr)
malloc_ptr=自由_mem_ptr;
malloc_ptr=(malloc_ptr+3)和~3;/*对齐*/
p=(void*)malloc_ptr;
malloc_ptr+=尺寸;
if(free_mem_end_ptr&&malloc_ptr>=free_mem_end_ptr)
返回NULL;
malloc_count++;
返回p;
}
这是否意味着我们可以在内核级别使用
malloc()

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

 * Memory management for pre-boot and ramdisk uncompressors
此代码仅在系统初始化的早期,即
kmalloc()
可用之前使用。(甚至可能在它的代码被解压之前!)它是非常有限的——它不能*释放内存——所以它只能在非常小的规模上使用

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



*:虽然有一个
free()
的实现与这个
malloc()
相结合,但它只能在一种非常特殊的情况下释放内存:当每个分配的块都被释放时。

它不适用于一般的内核使用。文件头告诉您它的确切用途:“预引导和ramdisk解压器的内存管理”。阅读该函数并确定它是否适合作为通用malloc替换。