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>