Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | Kernel Memory Layout on ARM Linux |
| 2 | |
| 3 | Russell King <rmk@arm.linux.org.uk> |
Russell King | 02b3083 | 2005-11-17 22:43:30 +0000 | [diff] [blame] | 4 | November 17, 2005 (2.6.15) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 5 | |
| 6 | This document describes the virtual memory layout which the Linux |
| 7 | kernel uses for ARM processors. It indicates which regions are |
| 8 | free for platforms to use, and which are used by generic code. |
| 9 | |
| 10 | The ARM CPU is capable of addressing a maximum of 4GB virtual memory |
| 11 | space, and this must be shared between user space processes, the |
| 12 | kernel, and hardware devices. |
| 13 | |
| 14 | As the ARM architecture matures, it becomes necessary to reserve |
| 15 | certain regions of VM space for use for new facilities; therefore |
| 16 | this document may reserve more VM space over time. |
| 17 | |
| 18 | Start End Use |
| 19 | -------------------------------------------------------------------------- |
| 20 | ffff8000 ffffffff copy_user_page / clear_user_page use. |
| 21 | For SA11xx and Xscale, this is used to |
| 22 | setup a minicache mapping. |
| 23 | |
Linus Walleij | e624859 | 2009-07-27 22:11:59 +0100 | [diff] [blame] | 24 | ffff4000 ffffffff cache aliasing on ARMv6 and later CPUs. |
| 25 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 26 | ffff1000 ffff7fff Reserved. |
| 27 | Platforms must not use this address range. |
| 28 | |
| 29 | ffff0000 ffff0fff CPU vector page. |
| 30 | The CPU vectors are mapped here if the |
| 31 | CPU supports vector relocation (control |
| 32 | register V bit.) |
| 33 | |
Nicolas Pitre | 5f0fbf9 | 2008-09-16 13:05:53 -0400 | [diff] [blame] | 34 | fffe0000 fffeffff XScale cache flush area. This is used |
| 35 | in proc-xscale.S to flush the whole data |
| 36 | cache. Free for other usage on non-XScale. |
| 37 | |
| 38 | fff00000 fffdffff Fixmap mapping region. Addresses provided |
| 39 | by fix_to_virt() will be located here. |
| 40 | |
| 41 | ffc00000 ffefffff DMA memory mapping region. Memory returned |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 42 | by the dma_alloc_xxx functions will be |
| 43 | dynamically mapped here. |
| 44 | |
| 45 | ff000000 ffbfffff Reserved for future expansion of DMA |
| 46 | mapping region. |
| 47 | |
| 48 | VMALLOC_END feffffff Free for platform use, recommended. |
Russell King | 02b3083 | 2005-11-17 22:43:30 +0000 | [diff] [blame] | 49 | VMALLOC_END must be aligned to a 2MB |
| 50 | boundary. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 51 | |
| 52 | VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space. |
| 53 | Memory returned by vmalloc/ioremap will |
| 54 | be dynamically placed in this region. |
| 55 | VMALLOC_START may be based upon the value |
| 56 | of the high_memory variable. |
| 57 | |
| 58 | PAGE_OFFSET high_memory-1 Kernel direct-mapped RAM region. |
| 59 | This maps the platforms RAM, and typically |
| 60 | maps all platform RAM in a 1:1 relationship. |
| 61 | |
| 62 | TASK_SIZE PAGE_OFFSET-1 Kernel module space |
| 63 | Kernel modules inserted via insmod are |
| 64 | placed here using dynamic mappings. |
| 65 | |
| 66 | 00001000 TASK_SIZE-1 User space mappings |
| 67 | Per-thread mappings are placed here via |
| 68 | the mmap() system call. |
| 69 | |
| 70 | 00000000 00000fff CPU vector page / null pointer trap |
| 71 | CPUs which do not support vector remapping |
| 72 | place their vector page here. NULL pointer |
| 73 | dereferences by both the kernel and user |
| 74 | space are also caught via this mapping. |
| 75 | |
| 76 | Please note that mappings which collide with the above areas may result |
| 77 | in a non-bootable kernel, or may cause the kernel to (eventually) panic |
| 78 | at run time. |
| 79 | |
| 80 | Since future CPUs may impact the kernel mapping layout, user programs |
| 81 | must not access any memory which is not mapped inside their 0x0001000 |
| 82 | to TASK_SIZE address range. If they wish to access these areas, they |
| 83 | must set up their own mappings using open() and mmap(). |