3822d88669
This patch adds definitions to support user space device mappings that allows devices like frame buffer to be accessible from user space in kernel mode. The are mainly two changes: - in `mm/`: added vm_map_region(), vm_unmap_region() for drivers to do device mapping easily. - in `arch/`: extended ARCH_SHM_NPAGES as user-space mapping region size. decoupled ARCH_SHM_MAXREGIONS from region size calculations and limit its usage only for SysV shm purposes. Signed-off-by: Yanfeng Liu <yfliu2008@qq.com>
389 lines
12 KiB
Plaintext
389 lines
12 KiB
Plaintext
#
|
|
# For a description of the syntax of this configuration file,
|
|
# see the file kconfig-language.txt in the NuttX tools repository.
|
|
#
|
|
|
|
choice
|
|
prompt "Build heap manager"
|
|
default MM_DEFAULT_MANAGER
|
|
|
|
config MM_DEFAULT_MANAGER
|
|
bool "Default heap manager"
|
|
---help---
|
|
NuttX original memory manager strategy.
|
|
|
|
config MM_TLSF_MANAGER
|
|
bool "TLSF heap manager"
|
|
---help---
|
|
TLSF memory manager strategy.
|
|
|
|
config MM_CUSTOMIZE_MANAGER
|
|
bool "Customized heap manager"
|
|
---help---
|
|
Customized memory manager policy. The build will fail
|
|
if the MM heap module not defined by customer.
|
|
|
|
endchoice
|
|
|
|
config MM_KERNEL_HEAP
|
|
bool "Kernel dedicated heap"
|
|
default BUILD_PROTECTED || BUILD_KERNEL
|
|
---help---
|
|
Under Flat build, this option will enable a separate heap for the kernel.
|
|
By separating the kernel and userspace heaps, the user is granted more
|
|
control over the heaps placement within the memory hierarchy, which is
|
|
specially useful for microcontrollers that provide External RAM.
|
|
Besides segregating the kernel and userspace allocations, this feature
|
|
does not prevent the userspace from accessing the kernel heap.
|
|
|
|
As for Protected and Kernel builds, this feature partitions heap memory
|
|
into two parts:
|
|
(1) a protected, kernel-mode heap accessible only by the NuttX kernel,
|
|
and (2) an unprotected user-mode heap for use by applications.
|
|
If you are only interested in protecting the kernel from read access,
|
|
then this option is not necessary. If you wish to secure the kernel data
|
|
as well, then this option should be selected.
|
|
|
|
The kernel heap size that is used is provided a a platform-specific
|
|
up_allocate_kheap() interface. This configuration setting is made
|
|
available to that platform specific code. However, the
|
|
up_allocate_kheap() interface may chose to ignore this setting if it
|
|
has a more appropriate heap allocation strategy.
|
|
|
|
config MM_KERNEL_HEAPSIZE
|
|
int "Kernel heap size"
|
|
default 8192
|
|
depends on MM_KERNEL_HEAP
|
|
---help---
|
|
This is the size of the a protected, kernel-mode heap (in bytes).
|
|
The remaining of available memory is given to the unprotected
|
|
user-mode heap. This value may need to be aligned to units of the
|
|
size of the smallest memory protection region.
|
|
|
|
config MM_DEFAULT_ALIGNMENT
|
|
int "Memory default alignment in bytes"
|
|
default 0
|
|
range 0 64
|
|
---help---
|
|
The memory default alignment in bytes, if this value is 0, the real
|
|
memory default alignment is equal to sizoef(uintptr), if this value
|
|
is not 0, this value must be 2^n and at least sizeof(uintptr).
|
|
|
|
config MM_SMALL
|
|
bool "Small memory model"
|
|
default n
|
|
depends on MM_DEFAULT_MANAGER
|
|
---help---
|
|
Each memory allocation has a small allocation overhead. The size
|
|
of that overhead is normally determined by the "width" of the
|
|
address support by the MCU. MCUs that support 16-bit addressability
|
|
have smaller overhead than devices that support 32-bit addressability.
|
|
However, there are many MCUs that support 32-bit addressability *but*
|
|
have internal SRAM of size less than or equal to 64Kb. In this case,
|
|
MM_SMALL can be defined so that those MCUs will also benefit
|
|
from the smaller, 16-bit-based allocation overhead.
|
|
|
|
WARNING: This selection will also change the alignment of allocated
|
|
memory. For example, on ARM memory will have 8-byte alignment by
|
|
default. If MM_SMALL is selected, then allocated memory will have
|
|
only 4-byte alignment. This may be important on some platforms where
|
|
64-bit data is in allocated structures and 8-byte alignment is required.
|
|
|
|
config MM_REGIONS
|
|
int "Number of memory regions"
|
|
default 1
|
|
---help---
|
|
If the architecture includes multiple, non-contiguous regions of
|
|
memory to allocate from, this specifies the number of memory regions
|
|
that the memory manager must handle and enables the API
|
|
mm_addregion(heap, start, end);
|
|
|
|
config MM_MAP_COUNT_MAX
|
|
int "The maximum number of memory map areas for each task"
|
|
default 1024
|
|
---help---
|
|
The maximum number of memory map areas for each task.
|
|
|
|
config ARCH_HAVE_HEAP2
|
|
bool
|
|
default n
|
|
|
|
if ARCH_HAVE_HEAP2
|
|
|
|
config HEAP2_BASE
|
|
hex "Start address of second user heap region"
|
|
default 0x00000000
|
|
---help---
|
|
The base address of the second heap region.
|
|
|
|
config HEAP2_SIZE
|
|
int "Size of the second user heap region"
|
|
default 0
|
|
---help---
|
|
The size of the second heap region.
|
|
|
|
endif # ARCH_HAVE_HEAP2
|
|
|
|
config GRAN
|
|
bool "Enable Granule Allocator"
|
|
default n
|
|
---help---
|
|
Enable granule allocator support. Allocations will be aligned to the
|
|
granule size; allocations will be in units of the granule size.
|
|
Larger granules will give better performance and less overhead but
|
|
more losses of memory due to alignment and quantization waste.
|
|
|
|
NOTE: The current implementation also restricts the maximum
|
|
allocation size to 32 granules. That restriction could be
|
|
eliminated with some additional coding effort.
|
|
|
|
config GRAN_INTR
|
|
bool "Interrupt level support"
|
|
default n
|
|
depends on GRAN
|
|
---help---
|
|
Normally mutual exclusive access to granule allocator data is assured
|
|
using a semaphore. If this option is set then, instead, mutual
|
|
exclusion logic will disable interrupts. While this options is more
|
|
invasive to system performance, it will also support use of the granule
|
|
allocator from interrupt level logic.
|
|
|
|
config DEBUG_GRAN
|
|
bool "Granule Allocator Debug"
|
|
default n
|
|
depends on GRAN && DEBUG_FEATURES
|
|
---help---
|
|
Just like DEBUG_MM, but only generates output from the gran
|
|
allocation logic.
|
|
|
|
config MM_PGALLOC
|
|
bool "Enable Page Allocator"
|
|
default n
|
|
depends on ARCH_USE_MMU
|
|
select GRAN
|
|
---help---
|
|
Enable support for a MMU physical page allocator based on the
|
|
granule allocator.
|
|
|
|
if MM_PGALLOC
|
|
|
|
config MM_PGSIZE
|
|
int "Page Size"
|
|
default 4096
|
|
---help---
|
|
The MMU page size. Must be one of {1024, 2048, 4096, 8192, or
|
|
16384}. This is easily extensible, but only those values are
|
|
currently support.
|
|
|
|
config DEBUG_PGALLOC
|
|
bool "Page Allocator Debug"
|
|
default n
|
|
depends on DEBUG_FEATURES
|
|
---help---
|
|
Just like DEBUG_MM, but only generates output from the page
|
|
allocation logic.
|
|
|
|
endif # MM_PGALLOC
|
|
|
|
config MM_SHM
|
|
bool "Shared memory support"
|
|
default n
|
|
depends on MM_PGALLOC && BUILD_KERNEL
|
|
select ARCH_VMA_MAPPING
|
|
---help---
|
|
Build support for mapping physical memory to user-space via
|
|
shared memory interfaces like shmget(), shmat(), shmctl(),
|
|
etc, or device mapping interfaces like vm_map_region() etc.
|
|
|
|
config MM_KMAP
|
|
bool "Support for dynamic kernel virtual mappings"
|
|
default n
|
|
depends on MM_PGALLOC && BUILD_KERNEL
|
|
select ARCH_KVMA_MAPPING
|
|
---help---
|
|
Build support for dynamically mapping pages from the page pool into
|
|
kernel virtual memory. This includes pages that are already mapped
|
|
for user.
|
|
|
|
config MM_HEAP_MEMPOOL_THRESHOLD
|
|
int "The size of threshold to avoid using multiple mempool in heap"
|
|
default 0
|
|
---help---
|
|
If the size of the memory requested by the user is less
|
|
than the threshold, the memory will be requested from the
|
|
multiple mempool by default.
|
|
|
|
config MM_HEAP_MEMPOOL_EXPAND_SIZE
|
|
int "The expand size for each mempool in multiple mempool"
|
|
default 4096
|
|
depends on MM_HEAP_MEMPOOL_THRESHOLD != 0
|
|
---help---
|
|
This size describes the size of each expansion of each memory
|
|
pool with insufficient memory in the multi-level memory pool.
|
|
|
|
config MM_HEAP_MEMPOOL_DICTIONARY_EXPAND_SIZE
|
|
int "The expand size for multiple mempool's dictionary"
|
|
default MM_HEAP_MEMPOOL_EXPAND_SIZE
|
|
depends on MM_HEAP_MEMPOOL_THRESHOLD != 0
|
|
---help---
|
|
This size describes the multiple mempool dictionary expand.
|
|
|
|
config MM_HEAP_MEMPOOL_CHUNK_SIZE
|
|
int "The multiples pool chunk size"
|
|
default 0
|
|
depends on MM_HEAP_MEMPOOL_THRESHOLD != 0
|
|
---help---
|
|
This size describes the multiple mempool chunk size.
|
|
|
|
config MM_HEAP_MEMPOOL_BACKTRACE_SKIP
|
|
int "The skip depth of backtrace for mempool"
|
|
default 6
|
|
depends on MM_HEAP_MEMPOOL_THRESHOLD != 0 && MM_BACKTRACE > 0
|
|
---help---
|
|
This number is the skipped backtrace depth for mempool.
|
|
|
|
config FS_PROCFS_EXCLUDE_MEMPOOL
|
|
bool "Exclude mempool"
|
|
default DEFAULT_SMALL
|
|
depends on FS_PROCFS
|
|
|
|
config MM_KASAN
|
|
bool "Kernel Address Sanitizer"
|
|
default n
|
|
---help---
|
|
KASan is a fast compiler-based tool for detecting memory
|
|
bugs in native code. After turn on this option, Please
|
|
add -fsanitize=kernel-address to CFLAGS/CXXFLAGS too.
|
|
|
|
config MM_KASAN_ALL
|
|
bool "Enable KASan for the entire image"
|
|
depends on MM_KASAN
|
|
default y
|
|
---help---
|
|
This option activates address sanitizer for the entire image.
|
|
If you don't enable this option, you have to explicitly specify
|
|
"-fsanitize=kernel-address" for the files/directories you want
|
|
to check. Enabling this option will get image size increased
|
|
and performance decreased significantly.
|
|
|
|
config MM_KASAN_DISABLE_READS_CHECK
|
|
bool "Disable reads check"
|
|
depends on MM_KASAN
|
|
default n
|
|
---help---
|
|
This option disable kasan reads check. It speeds up performance
|
|
compared with default read/write check. Only disable it when you are
|
|
sure there's no need to do so. Or performance is too bad and only focus
|
|
on writes check.
|
|
|
|
config MM_KASAN_DISABLE_WRITES_CHECK
|
|
bool "Disable writes check"
|
|
depends on MM_KASAN
|
|
default n
|
|
---help---
|
|
This option disable kasan writes check.
|
|
|
|
config MM_KASAN_GLOBAL
|
|
bool "Enable global data check"
|
|
depends on MM_KASAN
|
|
default n
|
|
---help---
|
|
This option enables KASan global data check.
|
|
It's used to extract segments in the linker script.
|
|
Two new segments need to be created, one being
|
|
".kasan.unused: { *(.data..LASANLOC*) }",
|
|
used to eliminate excess data generated.
|
|
One is ".kasan.global:{
|
|
KEEP ( *(. data.. LASAN0))
|
|
KEEP ( *(. data. rel. local.. LASAN0))
|
|
}", used to extract data generated by the compiler
|
|
|
|
config MM_UBSAN
|
|
bool "Undefined Behavior Sanitizer"
|
|
default n
|
|
---help---
|
|
UBSan is a fast undefined behavior detector. UBSan modifies
|
|
the program at compile-time to catch various kinds of
|
|
undefined behavior during program execution
|
|
|
|
config MM_UBSAN_ALL
|
|
bool "Enable UBSan for the entire image"
|
|
depends on MM_UBSAN
|
|
default y
|
|
---help---
|
|
This option activates UBSan instrumentation for the
|
|
entire image. If you don't enable this option, you have to
|
|
explicitly specify "-fsanitize=undefined" for
|
|
the files/directories you want to check. Enabling this option
|
|
will get image size increased and performance decreased
|
|
significantly.
|
|
|
|
config MM_UBSAN_OPTION
|
|
string "UBSan options"
|
|
depends on MM_UBSAN
|
|
default "-fsanitize=undefined"
|
|
---help---
|
|
This option activates specified UBSan instrumentation. Please
|
|
refer to https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
|
|
for available options.
|
|
|
|
config MM_UBSAN_TRAP_ON_ERROR
|
|
bool "Enable UBSan trap on error to crash immediately"
|
|
depends on MM_UBSAN
|
|
default n
|
|
---help---
|
|
The undefined instruction trap should cause your program to crash,
|
|
save the code space significantly.
|
|
|
|
config MM_FILL_ALLOCATIONS
|
|
bool "Fill allocations with debug value"
|
|
default n
|
|
---help---
|
|
Fill all malloc() allocations with MM_ALLOC_MAGIC.
|
|
Fill all add_addregion() with MM_INIT_MAGIC.
|
|
Fill all free() with MM_FREE_MAGIC.
|
|
This helps detecting uninitialized variable errors.
|
|
|
|
config MM_BACKTRACE
|
|
int "The depth of backtrace"
|
|
default -1
|
|
---help---
|
|
Config the depth of backtrace in memory block by specified this
|
|
config: disable backtrace by -1, only record pid info by zero and
|
|
enable record backtrace info by 8(fixed depth).
|
|
|
|
config MM_BACKTRACE_SKIP
|
|
int "The skip depth of backtrace"
|
|
depends on MM_BACKTRACE > 0
|
|
default 3
|
|
|
|
config MM_BACKTRACE_DEFAULT
|
|
bool "Enable the backtrace record by default"
|
|
default n
|
|
depends on MM_BACKTRACE > 0
|
|
|
|
config MM_DUMP_ON_FAILURE
|
|
bool "Dump heap info on allocation failure"
|
|
default n
|
|
depends on DEBUG_MM
|
|
|
|
config MM_DUMP_DETAILS_ON_FAILURE
|
|
bool "Dump all used memory blocks on allocation failure"
|
|
default n
|
|
depends on MM_DUMP_ON_FAILURE
|
|
|
|
config MM_PANIC_ON_FAILURE
|
|
bool "Panic on allocation failure"
|
|
default n
|
|
depends on DEBUG_MM
|
|
|
|
config MM_FREE_DELAYCOUNT_MAX
|
|
int "Maximum memory nodes can be delayed to free"
|
|
default 0
|
|
---help---
|
|
Set to 0 to disable the delayed free mechanism. Otherwise,
|
|
the value decides the maximum number of memory nodes that
|
|
will be delayed to free.
|
|
|
|
source "mm/iob/Kconfig"
|