1# Copyright (c) 2021 Intel Corporation 2# 3# SPDX-License-Identifier: Apache-2.0 4 5menu "Virtual Memory Support" 6 7config KERNEL_VM_SUPPORT 8 bool 9 help 10 Hidden option to enable virtual memory Kconfigs. 11 12if KERNEL_VM_SUPPORT 13 14DT_CHOSEN_Z_SRAM := zephyr,sram 15 16config KERNEL_VM_BASE 17 hex "Virtual address space base address" 18 default $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_SRAM)) 19 help 20 Define the base of the kernel's address space. 21 22 By default, this is the same as the DT_CHOSEN_Z_SRAM physical base SRAM 23 address from DTS, in which case RAM will be identity-mapped. Some 24 architectures may require RAM to be mapped in this way; they may have 25 just one RAM region and doing this makes linking much simpler, as 26 at least when the kernel boots all virtual RAM addresses are the same 27 as their physical address (demand paging at runtime may later modify 28 this for non-pinned page frames). 29 30 Otherwise, if RAM isn't identity-mapped: 31 1. It is the architecture's responsibility to transition the 32 instruction pointer to virtual addresses at early boot before 33 entering the kernel at z_cstart(). 34 2. The underlying architecture may impose constraints on the bounds of 35 the kernel's address space, such as not overlapping physical RAM 36 regions if RAM is not identity-mapped, or the virtual and physical 37 base addresses being aligned to some common value (which allows 38 double-linking of paging structures to make the instruction pointer 39 transition simpler). 40 41 Zephyr does not implement a split address space and if multiple 42 page tables are in use, they all have the same virtual-to-physical 43 mappings (with potentially different permissions). 44 45config KERNEL_VM_OFFSET 46 hex "Kernel offset within address space" 47 default 0 48 help 49 Offset that the kernel image begins within its address space, 50 if this is not the same offset from the beginning of RAM. 51 52 Some care may need to be taken in selecting this value. In certain 53 build-time cases, or when a physical address cannot be looked up 54 in page tables, the equation: 55 56 virt = phys + ((KERNEL_VM_BASE + KERNEL_VM_OFFSET) - 57 (SRAM_BASE_ADDRESS + SRAM_OFFSET)) 58 59 Will be used to convert between physical and virtual addresses for 60 memory that is mapped at boot. 61 62 This uncommon and is only necessary if the beginning of VM and 63 physical memory have dissimilar alignment. 64 65config KERNEL_VM_SIZE 66 hex "Size of kernel address space in bytes" 67 default 0x800000 68 help 69 Size of the kernel's address space. Constraining this helps control 70 how much total memory can be used for page tables. 71 72 The difference between KERNEL_VM_BASE and KERNEL_VM_SIZE indicates the 73 size of the virtual region for runtime memory mappings. This is needed 74 for mapping driver MMIO regions, as well as special RAM mapping use-cases 75 such as VSDO pages, memory mapped thread stacks, and anonymous memory 76 mappings. The kernel itself will be mapped in here as well at boot. 77 78 Systems with very large amounts of memory (such as 512M or more) 79 will want to use a 64-bit build of Zephyr, there are no plans to 80 implement a notion of "high" memory in Zephyr to work around physical 81 RAM size larger than the defined bounds of the virtual address space. 82 83config KERNEL_DIRECT_MAP 84 bool "Memory region direct-map support" 85 depends on MMU 86 help 87 This enables the direct-map support, namely the region can be 1:1 88 mapping between virtual address and physical address. 89 90 If the specific memory region is in the virtual memory space and 91 there isn't overlap with the existed mappings, it will reserve the 92 region from the virtual memory space and do the mapping, otherwise 93 it will fail. And any attempt across the boundary of the virtual 94 memory space will fail. 95 96 Note that this is for compatibility and portable apps shouldn't 97 be using it. 98 99endif # KERNEL_VM_SUPPORT 100 101menuconfig MMU 102 bool "MMU features" 103 depends on CPU_HAS_MMU 104 select KERNEL_VM_SUPPORT 105 help 106 This option is enabled when the CPU's memory management unit is active 107 and the arch_mem_map() API is available. 108 109if MMU 110config MMU_PAGE_SIZE 111 hex "Size of smallest granularity MMU page" 112 default 0x1000 113 help 114 Size of memory pages. Varies per MMU but 4K is common. For MMUs that 115 support multiple page sizes, put the smallest one here. 116 117menuconfig DEMAND_PAGING 118 bool "Demand paging [EXPERIMENTAL]" 119 depends on ARCH_HAS_DEMAND_PAGING 120 help 121 Enable demand paging. Requires architecture support in how the kernel 122 is linked and the implementation of an eviction algorithm and a 123 backing store for evicted pages. 124 125if DEMAND_PAGING 126config DEMAND_PAGING_ALLOW_IRQ 127 bool "Allow interrupts during page-ins/outs" 128 help 129 Allow interrupts to be serviced while pages are being evicted or 130 retrieved from the backing store. This is much better for system 131 latency, but any code running in interrupt context that page faults 132 will cause a kernel panic. Such code must work with exclusively pinned 133 code and data pages. 134 135 The scheduler is still disabled during this operation. 136 137 If this option is disabled, the page fault servicing logic 138 runs with interrupts disabled for the entire operation. However, 139 ISRs may also page fault. 140 141config DEMAND_PAGING_PAGE_FRAMES_RESERVE 142 int "Number of page frames reserved for paging" 143 default 32 if !LINKER_GENERIC_SECTIONS_PRESENT_AT_BOOT 144 default 0 145 help 146 This sets the number of page frames that will be reserved for 147 paging that do not count towards free memory. This is to 148 ensure that there are some page frames available for paging 149 code and data. Otherwise, it would be possible to exhaust 150 all page frames via anonymous memory mappings. 151 152config DEMAND_PAGING_STATS 153 bool "Gather Demand Paging Statistics" 154 help 155 This enables gathering various statistics related to demand paging, 156 e.g. number of pagefaults. This is useful for tuning eviction 157 algorithms and optimizing backing store. 158 159 Should say N in production system as this is not without cost. 160 161config DEMAND_PAGING_STATS_USING_TIMING_FUNCTIONS 162 bool "Use Timing Functions to Gather Demand Paging Statistics" 163 select TIMING_FUNCTIONS_NEED_AT_BOOT 164 help 165 Use timing functions to gather various demand paging statistics. 166 167config DEMAND_PAGING_THREAD_STATS 168 bool "Gather per Thread Demand Paging Statistics" 169 depends on DEMAND_PAGING_STATS 170 help 171 This enables gathering per thread statistics related to demand 172 paging. 173 174 Should say N in production system as this is not without cost. 175 176config DEMAND_PAGING_TIMING_HISTOGRAM 177 bool "Gather Demand Paging Execution Timing Histogram" 178 depends on DEMAND_PAGING_STATS 179 help 180 This gathers the histogram of execution time on page eviction 181 selection, and backing store page in and page out. 182 183 Should say N in production system as this is not without cost. 184 185config DEMAND_PAGING_TIMING_HISTOGRAM_NUM_BINS 186 int "Number of bins (buckets) in Demand Paging Timing Histogram" 187 depends on DEMAND_PAGING_TIMING_HISTOGRAM 188 default 10 189 help 190 Defines the number of bins (buckets) in the histogram used for 191 gathering execution timing information for demand paging. 192 193 This requires k_mem_paging_eviction_histogram_bounds[] and 194 k_mem_paging_backing_store_histogram_bounds[] to define 195 the upper bounds for each bin. See kernel/statistics.c for 196 information. 197 198endif # DEMAND_PAGING 199endif # MMU 200 201config KERNEL_VM_USE_CUSTOM_MEM_RANGE_CHECK 202 bool 203 help 204 Use custom memory range check functions instead of the generic 205 checks in k_mem_phys_addr() and k_mem_virt_addr(). 206 207 sys_mm_is_phys_addr_in_range() and 208 sys_mm_is_virt_addr_in_range() must be implemented. 209 210endmenu # Virtual Memory Support 211