mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-13 08:04:27 +00:00

Add support for tabulating static memory consumption data from ELF binaries. This relies on static symbols, defined in the linker files, that provide information about the memory ranges. Change-Id: Ie19cd2b80a7b591607640feeb84c63266963ea4d Signed-off-by: Harrison Mutai <harrison.mutai@arm.com>
154 lines
8.6 KiB
ReStructuredText
154 lines
8.6 KiB
ReStructuredText
TF-A Memory Layout Tool
|
|
=======================
|
|
|
|
TF-A's memory layout tool is a Python script for analyzing the virtual
|
|
memory layout of TF-A builds.
|
|
|
|
Prerequisites
|
|
~~~~~~~~~~~~~
|
|
|
|
#. Python (3.8 or later)
|
|
#. `Poetry`_ Python package manager
|
|
|
|
Getting Started
|
|
~~~~~~~~~~~~~~~
|
|
|
|
#. Install Poetry
|
|
|
|
.. code:: shell
|
|
|
|
curl -sSL https://install.python-poetry.org | python3 -
|
|
|
|
#. Install the required packages
|
|
|
|
.. code:: shell
|
|
|
|
poetry install --with memory
|
|
|
|
#. Verify that the tool runs in the installed virtual environment
|
|
|
|
.. code:: shell
|
|
|
|
poetry run memory --help
|
|
|
|
Symbol Virtual Map
|
|
~~~~~~~~~~~~~~~~~~
|
|
|
|
The tool can be used to generate a visualisation of the symbol table. By
|
|
default, it prints the symbols representing the start and end address of the
|
|
main memory regions in an ELF file (i.e. text, bss, rodata) but can be modified
|
|
to print any set of symbols.
|
|
|
|
.. code:: shell
|
|
|
|
$ poetry run memory -s
|
|
build-path: build/fvp/release
|
|
Virtual Address Map:
|
|
+------------__BL1_RAM_END__------------+---------------------------------------+
|
|
+---------__COHERENT_RAM_END__----------+ |
|
|
+--------__COHERENT_RAM_START__---------+ |
|
|
0x0403b000 +----------__XLAT_TABLE_END__-----------+ |
|
|
0x04036000 +---------__XLAT_TABLE_START__----------+ |
|
|
+--------__BASE_XLAT_TABLE_END__--------+ |
|
|
0x04035600 +--------------__BSS_END__--------------+ |
|
|
+-------__BASE_XLAT_TABLE_START__-------+ |
|
|
+-----__PMF_PERCPU_TIMESTAMP_END__------+ |
|
|
+---------__PMF_TIMESTAMP_END__---------+ |
|
|
0x04035400 +--------__PMF_TIMESTAMP_START__--------+ |
|
|
+-------------__BSS_START__-------------+ |
|
|
0x04034a00 +------------__STACKS_END__-------------+ |
|
|
0x04034500 +-----------__STACKS_START__------------+ |
|
|
0x040344c5 +-----------__DATA_RAM_END__------------+ |
|
|
+-----------__BL1_RAM_START__-----------+ |
|
|
0x04034000 +----------__DATA_RAM_START__-----------+ |
|
|
| +---------__COHERENT_RAM_END__----------+
|
|
| +--------__COHERENT_RAM_START__---------+
|
|
0x0402e000 | +----------__XLAT_TABLE_END__-----------+
|
|
0x04029000 | +---------__XLAT_TABLE_START__----------+
|
|
| +--------__BASE_XLAT_TABLE_END__--------+
|
|
0x04028800 | +--------------__BSS_END__--------------+
|
|
| +-------__BASE_XLAT_TABLE_START__-------+
|
|
| +-----__PMF_PERCPU_TIMESTAMP_END__------+
|
|
| +---------__PMF_TIMESTAMP_END__---------+
|
|
0x04028580 | +--------__PMF_TIMESTAMP_START__--------+
|
|
0x04028000 | +-------------__BSS_START__-------------+
|
|
0x04027e40 | +------------__STACKS_END__-------------+
|
|
0x04027840 | +-----------__STACKS_START__------------+
|
|
0x04027000 | +------------__RODATA_END__-------------+
|
|
| +------------__CPU_OPS_END__------------+
|
|
| +-----------__CPU_OPS_START__-----------+
|
|
| +--------__FCONF_POPULATOR_END__--------+
|
|
| +--------------__GOT_END__--------------+
|
|
| +-------------__GOT_START__-------------+
|
|
| +---------__PMF_SVC_DESCS_END__---------+
|
|
0x04026c10 | +--------__PMF_SVC_DESCS_START__--------+
|
|
0x04026bf8 | +-------__FCONF_POPULATOR_START__-------+
|
|
| +-----------__RODATA_START__------------+
|
|
0x04026000 | +-------------__TEXT_END__--------------+
|
|
0x04021000 | +------------__TEXT_START__-------------+
|
|
0x000062b5 +------------__BL1_ROM_END__------------+ |
|
|
0x00005df0 +----------__DATA_ROM_START__-----------+ |
|
|
+------------__CPU_OPS_END__------------+ |
|
|
+--------------__GOT_END__--------------+ |
|
|
+-------------__GOT_START__-------------+ |
|
|
0x00005de8 +------------__RODATA_END__-------------+ |
|
|
+-----------__CPU_OPS_START__-----------+ |
|
|
+--------__FCONF_POPULATOR_END__--------+ |
|
|
+---------__PMF_SVC_DESCS_END__---------+ |
|
|
0x00005c98 +--------__PMF_SVC_DESCS_START__--------+ |
|
|
0x00005c80 +-------__FCONF_POPULATOR_START__-------+ |
|
|
+-----------__RODATA_START__------------+ |
|
|
0x00005000 +-------------__TEXT_END__--------------+ |
|
|
0x00000000 +------------__TEXT_START__-------------+---------------------------------------+
|
|
|
|
Addresses are displayed in hexadecimal by default but can be printed in decimal
|
|
instead with the ``-d`` option.
|
|
|
|
Because of the length of many of the symbols, the tool defaults to a text width
|
|
of 120 chars. This can be increased if needed with the ``-w`` option.
|
|
|
|
For more detailed help instructions, run:
|
|
|
|
.. code:: shell
|
|
|
|
poetry run memory --help
|
|
|
|
Memory Footprint
|
|
~~~~~~~~~~~~~~~~
|
|
|
|
The tool enables users to view static memory consumption. When the options
|
|
``-f``, or ``--footprint`` are provided, the script analyses the ELF binaries in
|
|
the build path to generate a table (per memory type), showing memory allocation
|
|
and usage. This is the default output generated by the tool.
|
|
|
|
.. code:: shell
|
|
|
|
$ poetry run memory -f
|
|
build-path: build/fvp/release
|
|
+----------------------------------------------------------------------------+
|
|
| Memory Usage (bytes) [RAM] |
|
|
+-----------+------------+------------+------------+------------+------------+
|
|
| Component | Start | Limit | Size | Free | Total |
|
|
+-----------+------------+------------+------------+------------+------------+
|
|
| BL1 | 4034000 | 4040000 | 7000 | 5000 | c000 |
|
|
| BL2 | 4021000 | 4034000 | d000 | 6000 | 13000 |
|
|
| BL2U | 4021000 | 4034000 | a000 | 9000 | 13000 |
|
|
| BL31 | 4003000 | 4040000 | 1e000 | 1f000 | 3d000 |
|
|
+-----------+------------+------------+------------+------------+------------+
|
|
|
|
+----------------------------------------------------------------------------+
|
|
| Memory Usage (bytes) [ROM] |
|
|
+-----------+------------+------------+------------+------------+------------+
|
|
| Component | Start | Limit | Size | Free | Total |
|
|
+-----------+------------+------------+------------+------------+------------+
|
|
| BL1 | 0 | 4000000 | 5df0 | 3ffa210 | 4000000 |
|
|
+-----------+------------+------------+------------+------------+------------+
|
|
|
|
The script relies on symbols in the symbol table to determine the start, end,
|
|
and limit addresses of each bootloader stage.
|
|
|
|
--------------
|
|
|
|
*Copyright (c) 2023, Arm Limited. All rights reserved.*
|
|
|
|
.. _Poetry: https://python-poetry.org/docs/
|