2017-01-29 6 views
2

Я знаю, что kmalloc() может заменить malloc() на пространство ядра. Многие думают, что malloc() не может работать в пространстве ядра; Однако, я нашел это определение в linux-4.9.6/include/linux/decompress/mm.hЯвляется ли malloc() в пространстве ядра?

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() на уровне ядра?

+2

Это не для общего использования ядра. Заголовок файла сообщает вам, для чего он предназначен: «Управление памятью для предварительных загрузок и дискомпрессоров ramdisk». – kaylum

+0

Прочтите эту функцию и выясните, подходит ли она для замены универсальной замены malloc. –

ответ

2

Одним словом: Нет

Комментарий, который предшествует код объясняет, что это для:

* Memory management for pre-boot and ramdisk uncompressors 

Этот код используется только в самом начале инициализации системы до kmalloc() доступна. (Возможно, еще до того, как код был распакован!) Он невероятно ограничен - он не может * освободить память, поэтому его можно использовать только в очень малом масштабе.

Если вам нужно выделить память в ядре, вы должны использовать функцию из семейства kmalloc().


*: В то время как есть реализация free() в паре с этим malloc(), он может только свободная память под одним очень специфическим обстоятельством: когда каждый выделенный блок был освобожден.