1TF-A Memory Layout Tool 2======================= 3 4TF-A's memory layout tool is a Python script for analyzing the virtual 5memory layout of TF-A builds. 6 7Prerequisites 8~~~~~~~~~~~~~ 9 10#. Python (3.8 or later) 11#. `Poetry`_ Python package manager 12 13Getting Started 14~~~~~~~~~~~~~~~ 15 16#. Install Poetry 17 18 .. code:: shell 19 20 curl -sSL https://install.python-poetry.org | python3 - 21 22#. Install the required packages 23 24 .. code:: shell 25 26 poetry install --with memory 27 28#. Verify that the tool runs in the installed virtual environment 29 30 .. code:: shell 31 32 poetry run memory --help 33 34Symbol Virtual Map 35~~~~~~~~~~~~~~~~~~ 36 37The tool can be used to generate a visualisation of the symbol table. By 38default, it prints the symbols representing the start and end address of the 39main memory regions in an ELF file (i.e. text, bss, rodata) but can be modified 40to print any set of symbols. 41 42.. code:: shell 43 44 $ poetry run memory -s 45 build-path: build/fvp/release 46 Virtual Address Map: 47 +------------__BL1_RAM_END__------------+---------------------------------------+ 48 +---------__COHERENT_RAM_END__----------+ | 49 +--------__COHERENT_RAM_START__---------+ | 50 0x0403b000 +----------__XLAT_TABLE_END__-----------+ | 51 0x04036000 +---------__XLAT_TABLE_START__----------+ | 52 +--------__BASE_XLAT_TABLE_END__--------+ | 53 0x04035600 +--------------__BSS_END__--------------+ | 54 +-------__BASE_XLAT_TABLE_START__-------+ | 55 +-----__PMF_PERCPU_TIMESTAMP_END__------+ | 56 +---------__PMF_TIMESTAMP_END__---------+ | 57 0x04035400 +--------__PMF_TIMESTAMP_START__--------+ | 58 +-------------__BSS_START__-------------+ | 59 0x04034a00 +------------__STACKS_END__-------------+ | 60 0x04034500 +-----------__STACKS_START__------------+ | 61 0x040344c5 +-----------__DATA_RAM_END__------------+ | 62 +-----------__BL1_RAM_START__-----------+ | 63 0x04034000 +----------__DATA_RAM_START__-----------+ | 64 | +---------__COHERENT_RAM_END__----------+ 65 | +--------__COHERENT_RAM_START__---------+ 66 0x0402e000 | +----------__XLAT_TABLE_END__-----------+ 67 0x04029000 | +---------__XLAT_TABLE_START__----------+ 68 | +--------__BASE_XLAT_TABLE_END__--------+ 69 0x04028800 | +--------------__BSS_END__--------------+ 70 | +-------__BASE_XLAT_TABLE_START__-------+ 71 | +-----__PMF_PERCPU_TIMESTAMP_END__------+ 72 | +---------__PMF_TIMESTAMP_END__---------+ 73 0x04028580 | +--------__PMF_TIMESTAMP_START__--------+ 74 0x04028000 | +-------------__BSS_START__-------------+ 75 0x04027e40 | +------------__STACKS_END__-------------+ 76 0x04027840 | +-----------__STACKS_START__------------+ 77 0x04027000 | +------------__RODATA_END__-------------+ 78 | +------------__CPU_OPS_END__------------+ 79 | +-----------__CPU_OPS_START__-----------+ 80 | +--------__FCONF_POPULATOR_END__--------+ 81 | +--------------__GOT_END__--------------+ 82 | +-------------__GOT_START__-------------+ 83 | +---------__PMF_SVC_DESCS_END__---------+ 84 0x04026c10 | +--------__PMF_SVC_DESCS_START__--------+ 85 0x04026bf8 | +-------__FCONF_POPULATOR_START__-------+ 86 | +-----------__RODATA_START__------------+ 87 0x04026000 | +-------------__TEXT_END__--------------+ 88 0x04021000 | +------------__TEXT_START__-------------+ 89 0x000062b5 +------------__BL1_ROM_END__------------+ | 90 0x00005df0 +----------__DATA_ROM_START__-----------+ | 91 +------------__CPU_OPS_END__------------+ | 92 +--------------__GOT_END__--------------+ | 93 +-------------__GOT_START__-------------+ | 94 0x00005de8 +------------__RODATA_END__-------------+ | 95 +-----------__CPU_OPS_START__-----------+ | 96 +--------__FCONF_POPULATOR_END__--------+ | 97 +---------__PMF_SVC_DESCS_END__---------+ | 98 0x00005c98 +--------__PMF_SVC_DESCS_START__--------+ | 99 0x00005c80 +-------__FCONF_POPULATOR_START__-------+ | 100 +-----------__RODATA_START__------------+ | 101 0x00005000 +-------------__TEXT_END__--------------+ | 102 0x00000000 +------------__TEXT_START__-------------+---------------------------------------+ 103 104Addresses are displayed in hexadecimal by default but can be printed in decimal 105instead with the ``-d`` option. 106 107Because of the length of many of the symbols, the tool defaults to a text width 108of 120 chars. This can be increased if needed with the ``-w`` option. 109 110For more detailed help instructions, run: 111 112.. code:: shell 113 114 poetry run memory --help 115 116Memory Footprint 117~~~~~~~~~~~~~~~~ 118 119The tool enables users to view static memory consumption. When the options 120``-f``, or ``--footprint`` are provided, the script analyses the ELF binaries in 121the build path to generate a table (per memory type), showing memory allocation 122and usage. This is the default output generated by the tool. 123 124.. code:: shell 125 126 $ poetry run memory -f 127 build-path: build/fvp/release 128 +----------------------------------------------------------------------------+ 129 | Memory Usage (bytes) [RAM] | 130 +-----------+------------+------------+------------+------------+------------+ 131 | Component | Start | Limit | Size | Free | Total | 132 +-----------+------------+------------+------------+------------+------------+ 133 | BL1 | 4034000 | 4040000 | 7000 | 5000 | c000 | 134 | BL2 | 4021000 | 4034000 | d000 | 6000 | 13000 | 135 | BL2U | 4021000 | 4034000 | a000 | 9000 | 13000 | 136 | BL31 | 4003000 | 4040000 | 1e000 | 1f000 | 3d000 | 137 +-----------+------------+------------+------------+------------+------------+ 138 139 +----------------------------------------------------------------------------+ 140 | Memory Usage (bytes) [ROM] | 141 +-----------+------------+------------+------------+------------+------------+ 142 | Component | Start | Limit | Size | Free | Total | 143 +-----------+------------+------------+------------+------------+------------+ 144 | BL1 | 0 | 4000000 | 5df0 | 3ffa210 | 4000000 | 145 +-----------+------------+------------+------------+------------+------------+ 146 147The script relies on symbols in the symbol table to determine the start, end, 148and limit addresses of each bootloader stage. 149 150Memory Tree 151~~~~~~~~~~~ 152 153A hierarchical view of the memory layout can be produced by passing the option 154``-t`` or ``--tree`` to the tool. This gives the start, end, and size of each 155module, their ELF segments as well as sections. 156 157.. code:: shell 158 159 $ poetry run memory -t 160 build-path: build/fvp/release 161 name start end size 162 bl1 0 400c000 400c000 163 ├── 00 0 5de0 5de0 164 │ ├── .text 0 5000 5000 165 │ └── .rodata 5000 5de0 de0 166 ├── 01 4034000 40344c5 4c5 167 │ └── .data 4034000 40344c5 4c5 168 ├── 02 4034500 4034a00 500 169 │ └── .stacks 4034500 4034a00 500 170 ├── 04 4034a00 4035600 c00 171 │ └── .bss 4034a00 4035600 c00 172 └── 03 4036000 403b000 5000 173 └── .xlat_table 4036000 403b000 5000 174 bl2 4021000 4034000 13000 175 ├── 00 4021000 4027000 6000 176 │ ├── .text 4021000 4026000 5000 177 │ └── .rodata 4026000 4027000 1000 178 └── 01 4027000 402e000 7000 179 ├── .data 4027000 4027809 809 180 ├── .stacks 4027840 4027e40 600 181 ├── .bss 4028000 4028800 800 182 └── .xlat_table 4029000 402e000 5000 183 bl2u 4021000 4034000 13000 184 ├── 00 4021000 4025000 4000 185 │ ├── .text 4021000 4024000 3000 186 │ └── .rodata 4024000 4025000 1000 187 └── 01 4025000 402b000 6000 188 ├── .data 4025000 4025065 65 189 ├── .stacks 4025080 4025480 400 190 ├── .bss 4025600 4025c00 600 191 └── .xlat_table 4026000 402b000 5000 192 bl31 4003000 4040000 3d000 193 ├── 02 ffe00000 ffe03000 3000 194 │ └── .el3_tzc_dram ffe00000 ffe03000 3000 195 ├── 00 4003000 4010000 d000 196 │ └── .text 4003000 4010000 d000 197 └── 01 4010000 4021000 11000 198 ├── .rodata 4010000 4012000 2000 199 ├── .data 4012000 401219d 19d 200 ├── .stacks 40121c0 40161c0 4000 201 ├── .bss 4016200 4018c00 2a00 202 ├── .xlat_table 4019000 4020000 7000 203 └── .coherent_ram 4020000 4021000 1000 204 205 206The granularity of this view can be modified with the ``--depth`` option. For 207instance, if you only require the tree up to the level showing segment data, 208you can specify the depth with: 209 210.. code:: 211 212 $ poetry run memory -t --depth 2 213 build-path: build/fvp/release 214 name start end size 215 bl1 0 400c000 400c000 216 ├── 00 0 5df0 5df0 217 ├── 01 4034000 40344c5 4c5 218 ├── 02 4034500 4034a00 500 219 ├── 04 4034a00 4035600 c00 220 └── 03 4036000 403b000 5000 221 bl2 4021000 4034000 13000 222 ├── 00 4021000 4027000 6000 223 └── 01 4027000 402e000 7000 224 bl2u 4021000 4034000 13000 225 ├── 00 4021000 4025000 4000 226 └── 01 4025000 402b000 6000 227 bl31 4003000 4040000 3d000 228 ├── 02 ffe00000 ffe03000 3000 229 ├── 00 4003000 4010000 d000 230 └── 01 4010000 4021000 11000 231 232-------------- 233 234*Copyright (c) 2023, Arm Limited. All rights reserved.* 235 236.. _Poetry: https://python-poetry.org/docs/ 237