NAME

memoryallocators - introduction to kernel memory allocators

DESCRIPTION

The NetBSD kernel provides several memory allocators, each with different characteristics and purpose. This document summarizes the main differences between them.

The Malloc Allocator

The malloc(9) allocator can be used for variable-sized allocations in the kernel address space. It is interrupt-safe, requires no setup (see below), and is considered to be stable (given the number of years it has been in the kernel).

This interface also allows associating a ``type'' with an allocation to indicate what subsystem is using the memory allocated, thus providing statistics as to the memory usage of different kernel subsystems. To define a type, one should use the MALLOC_DEFINE macro, otherwise, one of the built-in types, like M_TEMP can be used.

See malloc(9) for more details.

The Kmem Allocator

The kmem allocator is modelled after an interface of similar name implemented in Solaris, and is under active development.

It is implemented on-top of the vmem(9) resource allocator (beyond the scope of this document), meaning it will be using pool_cache(9) internally to speed-up common (small) sized allocations.

Like malloc(9), it requires no setup, but can't be used yet from interrupt context.

See kmem_alloc(9), kmem_zalloc(9), and kmem_free(9) for more details.

The Pool Allocator

The pool(9) allocator is a fixed-size memory allocator. It requires setup (to initialize a memory pool) and is interrupt-safe.

See pool(9) for more details.

The Pool Cache Allocator

The pool cache allocator works on-top of the pool(9) allocator, also allowing fixed-size allocation only, requires setup, and is interrupt-safe.

The pool cache allocator is expected to be faster than other allocators, including the ``normal'' pool allocator.

In the future this allocator is expected to have a per-CPU cache.

See pool_cache(9) for more details.

The UVM Kernel Memory Allocator

This is a low-level memory allocator interface. It allows variable-sized allocations in multiples of PAGE_SIZE, and can be used to allocate both wired and pageable kernel memory.

See uvm(9) for more details.

SEE ALSO

free(9), intro(9), kmem_alloc(9), kmem_free(9), kmem_zalloc(9), malloc(9), pool(9), pool_cache(9), uvm(9), vmem(9)

AUTHORS

Elad Efrat <elad@NetBSD.org>
YAMAMOTO Takashi <yamt@NetBSD.org>