|
|
@@ -4,25 +4,165 @@ config RT_USING_MEM_PROTECTION
|
|
|
bool "Enable memory protection"
|
|
|
default n
|
|
|
select RT_USING_HEAP
|
|
|
+ help
|
|
|
+ Enable memory protection framework using MPU (Memory Protection Unit).
|
|
|
+
|
|
|
+ Provides hardware-based memory protection to prevent:
|
|
|
+ - Stack overflow and underflow
|
|
|
+ - Buffer overruns
|
|
|
+ - Unauthorized access to memory regions
|
|
|
+ - Corruption of kernel data structures
|
|
|
+
|
|
|
+ Features:
|
|
|
+ - Per-thread memory protection
|
|
|
+ - Stack guard regions
|
|
|
+ - Configurable memory regions with access permissions
|
|
|
+ - Exclusive regions for sensitive data
|
|
|
+
|
|
|
+ Requirements:
|
|
|
+ - CPU with MPU support (Cortex-M3/M4/M7/M33/R52, etc.)
|
|
|
+ - ARCH_MM_MPU or ARCH_ARM_MPU enabled
|
|
|
+ - RT_USING_HEAP (dynamic memory)
|
|
|
+
|
|
|
+ Benefits:
|
|
|
+ - Catch memory bugs early (development)
|
|
|
+ - Improve system safety (production)
|
|
|
+ - Isolate thread memory spaces
|
|
|
+
|
|
|
+ Costs:
|
|
|
+ - Context switch overhead (save/restore MPU regions)
|
|
|
+ - Configuration complexity
|
|
|
+ - Slight runtime overhead
|
|
|
+
|
|
|
+ Ideal for safety-critical applications and debugging memory issues.
|
|
|
|
|
|
config RT_USING_HW_STACK_GUARD
|
|
|
bool "Enable hardware stack guard"
|
|
|
default n
|
|
|
select RT_USING_MEM_PROTECTION
|
|
|
+ help
|
|
|
+ Enable hardware-based stack overflow protection using MPU.
|
|
|
+
|
|
|
+ Automatically creates guard regions at the end of each thread's stack
|
|
|
+ to detect stack overflow at the moment it occurs.
|
|
|
+
|
|
|
+ How it works:
|
|
|
+ - Configures MPU region below stack as no-access
|
|
|
+ - Stack overflow triggers immediate MPU fault
|
|
|
+ - Exception handler identifies the overflowing thread
|
|
|
+
|
|
|
+ Benefits:
|
|
|
+ - Immediate detection (vs periodic checks)
|
|
|
+ - Precise identification of overflow location
|
|
|
+ - No runtime overhead (hardware-based)
|
|
|
+ - Catches stack corruption before it spreads
|
|
|
+
|
|
|
+ Requirements:
|
|
|
+ - RT_USING_MEM_PROTECTION enabled
|
|
|
+ - Sufficient MPU regions (at least 1 per thread)
|
|
|
+
|
|
|
+ Recommended for:
|
|
|
+ - Development and debugging
|
|
|
+ - Safety-critical systems
|
|
|
+ - Systems with limited stack space
|
|
|
+
|
|
|
+ Note: Requires one MPU region per thread. Check NUM_MEM_REGIONS configuration.
|
|
|
|
|
|
if RT_USING_MEM_PROTECTION
|
|
|
config USE_MEM_PROTECTION_EXAMPLES
|
|
|
bool "Use memory protection examples"
|
|
|
default y
|
|
|
+ help
|
|
|
+ Build and include memory protection example code.
|
|
|
+
|
|
|
+ Provides demonstration code showing how to:
|
|
|
+ - Configure memory protection regions
|
|
|
+ - Set up stack guards
|
|
|
+ - Add exclusive regions
|
|
|
+ - Handle protection faults
|
|
|
+
|
|
|
+ Useful for:
|
|
|
+ - Learning memory protection concepts
|
|
|
+ - Testing MPU functionality
|
|
|
+ - Debugging protection configurations
|
|
|
+
|
|
|
+ Disable for production builds to save code space.
|
|
|
|
|
|
config NUM_MEM_REGIONS
|
|
|
int "Total number of memory protection regions supported by hardware"
|
|
|
+ help
|
|
|
+ Total number of MPU regions available in hardware.
|
|
|
+
|
|
|
+ This depends on your CPU architecture:
|
|
|
+ - Cortex-M3/M4: Typically 8 regions
|
|
|
+ - Cortex-M7: 8 or 16 regions
|
|
|
+ - Cortex-M33/M85: 8 or 16 regions (configurable in silicon)
|
|
|
+ - Cortex-R52: 16 or 32 regions
|
|
|
+
|
|
|
+ Check your MCU datasheet or reference manual for exact count.
|
|
|
+
|
|
|
+ Usage breakdown:
|
|
|
+ - Stack guard per thread: 1 region per thread
|
|
|
+ - Exclusive regions: NUM_EXCLUSIVE_REGIONS
|
|
|
+ - Configurable per thread: NUM_CONFIGURABLE_REGIONS
|
|
|
+
|
|
|
+ Formula: NUM_MEM_REGIONS = 1 (stack) + NUM_EXCLUSIVE_REGIONS + NUM_CONFIGURABLE_REGIONS
|
|
|
+
|
|
|
+ Example for 8-region MPU with 2 threads:
|
|
|
+ - Thread 1 stack guard: 1 region
|
|
|
+ - Thread 2 stack guard: 1 region
|
|
|
+ - Shared exclusive regions: 2 regions
|
|
|
+ - Per-thread config: 2 regions per thread
|
|
|
+ Total: 2 + 2 + 4 = 8 regions
|
|
|
|
|
|
config NUM_EXCLUSIVE_REGIONS
|
|
|
int "Total number of exclusive memory regions added using rt_mprotect_add_exclusive_region API"
|
|
|
+ help
|
|
|
+ Number of shared exclusive memory protection regions.
|
|
|
+
|
|
|
+ Exclusive regions are memory areas with specific access permissions
|
|
|
+ shared across all threads (e.g., peripheral registers, kernel data).
|
|
|
+
|
|
|
+ Use cases:
|
|
|
+ - Protect peripheral registers from thread access
|
|
|
+ - Mark flash memory as read-only/execute-only
|
|
|
+ - Protect kernel data structures
|
|
|
+ - Define shared memory with specific permissions
|
|
|
+
|
|
|
+ Example configurations:
|
|
|
+ - Peripheral protection: 1-2 regions
|
|
|
+ - Kernel data protection: 1 region
|
|
|
+ - Shared buffers: 0-2 regions
|
|
|
+
|
|
|
+ Note: These regions are configured once and apply to all threads.
|
|
|
+ Set based on your system's protection requirements.
|
|
|
|
|
|
config NUM_CONFIGURABLE_REGIONS
|
|
|
int "Maximum number of configurable memory regions for each thread, excluding stack guard and exclusive regions added using rt_mprotect_add_exclusive_region API"
|
|
|
+ help
|
|
|
+ Per-thread configurable memory protection regions.
|
|
|
+
|
|
|
+ These regions are specific to each thread and can be configured independently
|
|
|
+ for thread-specific memory protection needs.
|
|
|
+
|
|
|
+ Use cases:
|
|
|
+ - Protect thread's private data buffers
|
|
|
+ - Restrict access to thread-local peripherals
|
|
|
+ - Define custom memory permissions per thread
|
|
|
+
|
|
|
+ Calculation:
|
|
|
+ NUM_CONFIGURABLE_REGIONS = NUM_MEM_REGIONS - 1 (stack) - NUM_EXCLUSIVE_REGIONS
|
|
|
+
|
|
|
+ Example for 8-region MPU with 2 exclusive regions:
|
|
|
+ NUM_CONFIGURABLE_REGIONS = 8 - 1 - 2 = 5 regions per thread
|
|
|
+
|
|
|
+ More regions = more flexibility but:
|
|
|
+ - Increased configuration complexity
|
|
|
+ - Longer context switch time
|
|
|
+ - More memory for region descriptors
|
|
|
+
|
|
|
+ Set based on your application's per-thread protection needs.
|
|
|
+ Typical values: 1-4 regions per thread.
|
|
|
endif
|
|
|
|
|
|
endmenu
|