memory.txt 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. Memory Layout on AArch64 Linux
  2. ==============================
  3. Author: Catalin Marinas <catalin.marinas@arm.com>
  4. This document describes the virtual memory layout used by the AArch64
  5. Linux kernel. The architecture allows up to 4 levels of translation
  6. tables with a 4KB page size and up to 3 levels with a 64KB page size.
  7. AArch64 Linux uses either 3 levels or 4 levels of translation tables
  8. with the 4KB page configuration, allowing 39-bit (512GB) or 48-bit
  9. (256TB) virtual addresses, respectively, for both user and kernel. With
  10. 64KB pages, only 2 levels of translation tables, allowing 42-bit (4TB)
  11. virtual address, are used but the memory layout is the same.
  12. User addresses have bits 63:48 set to 0 while the kernel addresses have
  13. the same bits set to 1. TTBRx selection is given by bit 63 of the
  14. virtual address. The swapper_pg_dir contains only kernel (global)
  15. mappings while the user pgd contains only user (non-global) mappings.
  16. The swapper_pg_dir address is written to TTBR1 and never written to
  17. TTBR0.
  18. AArch64 Linux memory layout with 4KB pages + 3 levels:
  19. Start End Size Use
  20. -----------------------------------------------------------------------
  21. 0000000000000000 0000007fffffffff 512GB user
  22. ffffff8000000000 ffffffffffffffff 512GB kernel
  23. AArch64 Linux memory layout with 4KB pages + 4 levels:
  24. Start End Size Use
  25. -----------------------------------------------------------------------
  26. 0000000000000000 0000ffffffffffff 256TB user
  27. ffff000000000000 ffffffffffffffff 256TB kernel
  28. AArch64 Linux memory layout with 64KB pages + 2 levels:
  29. Start End Size Use
  30. -----------------------------------------------------------------------
  31. 0000000000000000 000003ffffffffff 4TB user
  32. fffffc0000000000 ffffffffffffffff 4TB kernel
  33. AArch64 Linux memory layout with 64KB pages + 3 levels:
  34. Start End Size Use
  35. -----------------------------------------------------------------------
  36. 0000000000000000 0000ffffffffffff 256TB user
  37. ffff000000000000 ffffffffffffffff 256TB kernel
  38. For details of the virtual kernel memory layout please see the kernel
  39. booting log.
  40. Translation table lookup with 4KB pages:
  41. +--------+--------+--------+--------+--------+--------+--------+--------+
  42. |63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0|
  43. +--------+--------+--------+--------+--------+--------+--------+--------+
  44. | | | | | |
  45. | | | | | v
  46. | | | | | [11:0] in-page offset
  47. | | | | +-> [20:12] L3 index
  48. | | | +-----------> [29:21] L2 index
  49. | | +---------------------> [38:30] L1 index
  50. | +-------------------------------> [47:39] L0 index
  51. +-------------------------------------------------> [63] TTBR0/1
  52. Translation table lookup with 64KB pages:
  53. +--------+--------+--------+--------+--------+--------+--------+--------+
  54. |63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0|
  55. +--------+--------+--------+--------+--------+--------+--------+--------+
  56. | | | | |
  57. | | | | v
  58. | | | | [15:0] in-page offset
  59. | | | +----------> [28:16] L3 index
  60. | | +--------------------------> [41:29] L2 index
  61. | +-------------------------------> [47:42] L1 index
  62. +-------------------------------------------------> [63] TTBR0/1
  63. When using KVM, the hypervisor maps kernel pages in EL2, at a fixed
  64. offset from the kernel VA (top 24bits of the kernel VA set to zero):
  65. Start End Size Use
  66. -----------------------------------------------------------------------
  67. 0000004000000000 0000007fffffffff 256GB kernel objects mapped in HYP