|  | .. _mpu_stack_objects: | 
|  |  | 
|  | MPU Stack Objects | 
|  | ################# | 
|  |  | 
|  | Thread Stack Creation | 
|  | ********************* | 
|  |  | 
|  | Thread stacks are declared statically with :c:macro:`K_THREAD_STACK_DEFINE()`. | 
|  |  | 
|  | For architectures which utilize memory protection unit (MPU) hardware, | 
|  | stacks are physically contiguous allocations.  This contiguous allocation | 
|  | has implications for the placement of stacks in memory, as well as the | 
|  | implementation of other features such as stack protection and userspace.  The | 
|  | implications for placement are directly attributed to the alignment | 
|  | requirements for MPU regions.  This is discussed in the memory placement | 
|  | section below. | 
|  |  | 
|  | Stack Guards | 
|  | ************ | 
|  |  | 
|  | Stack protection mechanisms require hardware support that can restrict access | 
|  | to memory.  Memory protection units can provide this kind of support. | 
|  | The MPU provides a fixed number of regions.  Each region contains information | 
|  | about the start, end, size, and access attributes to be enforced on that | 
|  | particular region. | 
|  |  | 
|  | Stack guards are implemented by using a single MPU region and setting the | 
|  | attributes for that region to not allow write access.  If invalid accesses | 
|  | occur, a fault ensues.  The stack guard is defined at the bottom (the lowest | 
|  | address) of the stack. | 
|  |  | 
|  | Memory Placement | 
|  | **************** | 
|  |  | 
|  | During stack creation, a set of constraints are enforced on the allocation of | 
|  | memory.  These constraints include determining the alignment of the stack and | 
|  | the correct sizing of the stack.  During linking of the binary, these | 
|  | constraints are used to place the stacks properly. | 
|  |  | 
|  | The main source of the memory constraints is the MPU design for the SoC.  The | 
|  | MPU design may require specific constraints on the region definition.  These | 
|  | can include alignment of beginning and end addresses, sizes of allocations, | 
|  | or even interactions between overlapping regions. | 
|  |  | 
|  | Some MPUs require that each region be aligned to a power of two.  These SoCs | 
|  | will have :kconfig:option:`CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT` defined. | 
|  | This means that a 1500 byte stack should be aligned to a 2kB boundary and the | 
|  | stack size should also be adjusted to 2kB to ensure that nothing else is | 
|  | placed in the remainder of the region.  SoCs which include the unmodified ARM | 
|  | v7m MPU will have these constraints. | 
|  |  | 
|  | Some ARM MPUs use start and end addresses to define MPU regions and both the | 
|  | start and end addresses require 32 byte alignment.  An example of this kind of | 
|  | MPU is found in the NXP FRDM K64F. | 
|  |  | 
|  | MPUs may have a region priority mechanisms that use the highest priority region | 
|  | that covers the memory access to determine the enforcement policy.  Others may | 
|  | logically OR regions to determine enforcement policy. | 
|  |  | 
|  | Size and alignment constraints may result in stack allocations being larger | 
|  | than the requested size.  Region priority mechanisms may result in | 
|  | some added complexity when implementing stack guards. |