^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) =================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) Kernel Memory Layout on ARM Linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) =================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) Russell King <rmk@arm.linux.org.uk>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) November 17, 2005 (2.6.15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) This document describes the virtual memory layout which the Linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) kernel uses for ARM processors. It indicates which regions are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) free for platforms to use, and which are used by generic code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) The ARM CPU is capable of addressing a maximum of 4GB virtual memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) space, and this must be shared between user space processes, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) kernel, and hardware devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) As the ARM architecture matures, it becomes necessary to reserve
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) certain regions of VM space for use for new facilities; therefore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) this document may reserve more VM space over time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) =============== =============== ===============================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) Start End Use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) =============== =============== ===============================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) ffff8000 ffffffff copy_user_page / clear_user_page use.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) For SA11xx and Xscale, this is used to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) setup a minicache mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) ffff4000 ffffffff cache aliasing on ARMv6 and later CPUs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ffff1000 ffff7fff Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) Platforms must not use this address range.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) ffff0000 ffff0fff CPU vector page.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) The CPU vectors are mapped here if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) CPU supports vector relocation (control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) register V bit.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) fffe0000 fffeffff XScale cache flush area. This is used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) in proc-xscale.S to flush the whole data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) cache. (XScale does not have TCM.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) fffe8000 fffeffff DTCM mapping area for platforms with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) DTCM mounted inside the CPU.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) fffe0000 fffe7fff ITCM mapping area for platforms with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) ITCM mounted inside the CPU.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) ffc80000 ffefffff Fixmap mapping region. Addresses provided
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) by fix_to_virt() will be located here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) ffc00000 ffc7ffff Guard region
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ff800000 ffbfffff Permanent, fixed read-only mapping of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) firmware provided DT blob
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) fee00000 feffffff Mapping of PCI I/O space. This is a static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) mapping within the vmalloc space.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) Memory returned by vmalloc/ioremap will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) be dynamically placed in this region.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) Machine specific static mappings are also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) located here through iotable_init().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) VMALLOC_START is based upon the value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) of the high_memory variable, and VMALLOC_END
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) is equal to 0xff800000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) PAGE_OFFSET high_memory-1 Kernel direct-mapped RAM region.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) This maps the platforms RAM, and typically
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) maps all platform RAM in a 1:1 relationship.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) PKMAP_BASE PAGE_OFFSET-1 Permanent kernel mappings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) One way of mapping HIGHMEM pages into kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) space.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) MODULES_VADDR MODULES_END-1 Kernel module space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) Kernel modules inserted via insmod are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) placed here using dynamic mappings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) 00001000 TASK_SIZE-1 User space mappings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) Per-thread mappings are placed here via
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) the mmap() system call.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) 00000000 00000fff CPU vector page / null pointer trap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) CPUs which do not support vector remapping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) place their vector page here. NULL pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) dereferences by both the kernel and user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) space are also caught via this mapping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) =============== =============== ===============================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) Please note that mappings which collide with the above areas may result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) in a non-bootable kernel, or may cause the kernel to (eventually) panic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) at run time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) Since future CPUs may impact the kernel mapping layout, user programs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) must not access any memory which is not mapped inside their 0x0001000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) to TASK_SIZE address range. If they wish to access these areas, they
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) must set up their own mappings using open() and mmap().