Catalin Marinas | 4f04d8f | 2012-03-05 11:49:27 +0000 | [diff] [blame] | 1 | Memory Layout on AArch64 Linux |
| 2 | ============================== |
| 3 | |
| 4 | Author: Catalin Marinas <catalin.marinas@arm.com> |
Catalin Marinas | 4f04d8f | 2012-03-05 11:49:27 +0000 | [diff] [blame] | 5 | |
| 6 | This document describes the virtual memory layout used by the AArch64 |
| 7 | Linux kernel. The architecture allows up to 4 levels of translation |
| 8 | tables with a 4KB page size and up to 3 levels with a 64KB page size. |
| 9 | |
Catalin Marinas | 0837519 | 2014-07-16 17:42:43 +0100 | [diff] [blame] | 10 | AArch64 Linux uses either 3 levels or 4 levels of translation tables |
| 11 | with the 4KB page configuration, allowing 39-bit (512GB) or 48-bit |
| 12 | (256TB) virtual addresses, respectively, for both user and kernel. With |
| 13 | 64KB pages, only 2 levels of translation tables, allowing 42-bit (4TB) |
Jungseok Lee | 4edae01 | 2014-05-12 10:40:44 +0100 | [diff] [blame] | 14 | virtual address, are used but the memory layout is the same. |
Catalin Marinas | 4f04d8f | 2012-03-05 11:49:27 +0000 | [diff] [blame] | 15 | |
Catalin Marinas | 0837519 | 2014-07-16 17:42:43 +0100 | [diff] [blame] | 16 | User addresses have bits 63:48 set to 0 while the kernel addresses have |
Catalin Marinas | 4f04d8f | 2012-03-05 11:49:27 +0000 | [diff] [blame] | 17 | the same bits set to 1. TTBRx selection is given by bit 63 of the |
| 18 | virtual address. The swapper_pg_dir contains only kernel (global) |
| 19 | mappings while the user pgd contains only user (non-global) mappings. |
Alex Bennée | a24637d | 2014-07-22 16:14:42 +0100 | [diff] [blame] | 20 | The swapper_pg_dir address is written to TTBR1 and never written to |
Catalin Marinas | 4f04d8f | 2012-03-05 11:49:27 +0000 | [diff] [blame] | 21 | TTBR0. |
| 22 | |
| 23 | |
Jungseok Lee | 4edae01 | 2014-05-12 10:40:44 +0100 | [diff] [blame] | 24 | AArch64 Linux memory layout with 4KB pages + 3 levels: |
Catalin Marinas | 4f04d8f | 2012-03-05 11:49:27 +0000 | [diff] [blame] | 25 | |
| 26 | Start End Size Use |
| 27 | ----------------------------------------------------------------------- |
| 28 | 0000000000000000 0000007fffffffff 512GB user |
Catalin Marinas | 0837519 | 2014-07-16 17:42:43 +0100 | [diff] [blame] | 29 | ffffff8000000000 ffffffffffffffff 512GB kernel |
Catalin Marinas | 4f04d8f | 2012-03-05 11:49:27 +0000 | [diff] [blame] | 30 | |
| 31 | |
Jungseok Lee | 4edae01 | 2014-05-12 10:40:44 +0100 | [diff] [blame] | 32 | AArch64 Linux memory layout with 4KB pages + 4 levels: |
| 33 | |
| 34 | Start End Size Use |
| 35 | ----------------------------------------------------------------------- |
| 36 | 0000000000000000 0000ffffffffffff 256TB user |
Catalin Marinas | 0837519 | 2014-07-16 17:42:43 +0100 | [diff] [blame] | 37 | ffff000000000000 ffffffffffffffff 256TB kernel |
Jungseok Lee | 4edae01 | 2014-05-12 10:40:44 +0100 | [diff] [blame] | 38 | |
| 39 | |
| 40 | AArch64 Linux memory layout with 64KB pages + 2 levels: |
Catalin Marinas | 847264fb | 2013-10-23 16:50:07 +0100 | [diff] [blame] | 41 | |
| 42 | Start End Size Use |
| 43 | ----------------------------------------------------------------------- |
| 44 | 0000000000000000 000003ffffffffff 4TB user |
Catalin Marinas | 0837519 | 2014-07-16 17:42:43 +0100 | [diff] [blame] | 45 | fffffc0000000000 ffffffffffffffff 4TB kernel |
Catalin Marinas | 847264fb | 2013-10-23 16:50:07 +0100 | [diff] [blame] | 46 | |
| 47 | |
Catalin Marinas | 383c279 | 2014-07-21 15:54:50 +0100 | [diff] [blame] | 48 | AArch64 Linux memory layout with 64KB pages + 3 levels: |
| 49 | |
| 50 | Start End Size Use |
| 51 | ----------------------------------------------------------------------- |
| 52 | 0000000000000000 0000ffffffffffff 256TB user |
| 53 | ffff000000000000 ffffffffffffffff 256TB kernel |
| 54 | |
| 55 | |
Catalin Marinas | 0837519 | 2014-07-16 17:42:43 +0100 | [diff] [blame] | 56 | For details of the virtual kernel memory layout please see the kernel |
| 57 | booting log. |
Catalin Marinas | 4f04d8f | 2012-03-05 11:49:27 +0000 | [diff] [blame] | 58 | |
| 59 | |
Catalin Marinas | 0837519 | 2014-07-16 17:42:43 +0100 | [diff] [blame] | 60 | Translation table lookup with 4KB pages: |
Jungseok Lee | 4edae01 | 2014-05-12 10:40:44 +0100 | [diff] [blame] | 61 | |
| 62 | +--------+--------+--------+--------+--------+--------+--------+--------+ |
| 63 | |63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0| |
| 64 | +--------+--------+--------+--------+--------+--------+--------+--------+ |
| 65 | | | | | | | |
| 66 | | | | | | v |
| 67 | | | | | | [11:0] in-page offset |
| 68 | | | | | +-> [20:12] L3 index |
| 69 | | | | +-----------> [29:21] L2 index |
| 70 | | | +---------------------> [38:30] L1 index |
| 71 | | +-------------------------------> [47:39] L0 index |
| 72 | +-------------------------------------------------> [63] TTBR0/1 |
| 73 | |
| 74 | |
Catalin Marinas | 0837519 | 2014-07-16 17:42:43 +0100 | [diff] [blame] | 75 | Translation table lookup with 64KB pages: |
Catalin Marinas | 4f04d8f | 2012-03-05 11:49:27 +0000 | [diff] [blame] | 76 | |
| 77 | +--------+--------+--------+--------+--------+--------+--------+--------+ |
| 78 | |63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0| |
| 79 | +--------+--------+--------+--------+--------+--------+--------+--------+ |
| 80 | | | | | | |
| 81 | | | | | v |
| 82 | | | | | [15:0] in-page offset |
| 83 | | | | +----------> [28:16] L3 index |
Catalin Marinas | 0837519 | 2014-07-16 17:42:43 +0100 | [diff] [blame] | 84 | | | +--------------------------> [41:29] L2 index |
| 85 | | +-------------------------------> [47:42] L1 index |
Catalin Marinas | 4f04d8f | 2012-03-05 11:49:27 +0000 | [diff] [blame] | 86 | +-------------------------------------------------> [63] TTBR0/1 |
Marc Zyngier | aa4a73a | 2013-05-02 14:31:03 +0100 | [diff] [blame] | 87 | |
Catalin Marinas | 0837519 | 2014-07-16 17:42:43 +0100 | [diff] [blame] | 88 | |
Marc Zyngier | aa4a73a | 2013-05-02 14:31:03 +0100 | [diff] [blame] | 89 | When using KVM, the hypervisor maps kernel pages in EL2, at a fixed |
| 90 | offset from the kernel VA (top 24bits of the kernel VA set to zero): |
| 91 | |
| 92 | Start End Size Use |
| 93 | ----------------------------------------------------------------------- |
| 94 | 0000004000000000 0000007fffffffff 256GB kernel objects mapped in HYP |