Files
slimbootloader.github.io/developer-guides/memory-map.html

325 lines
25 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Memory Map &mdash; Slim Bootloader 1.0 documentation</title>
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/graphviz.css" type="text/css" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<link rel="shortcut icon" href="../_static/sbl_logo_blue_32x32_icon.ico"/>
<!--[if lt IE 9]>
<script src="../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="../_static/jquery.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Configuration" href="configuration.html" />
<link rel="prev" title="Flash Map" href="flashmap.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home">
Slim Bootloader
<img src="../_static/sbl_logo_white_200x200.png" class="logo" alt="Logo"/>
</a>
<div class="version">
1.0
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../getting-started/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../supported-hardware/index.html">Supported Hardware</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Developers Guide</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="source-tree.html">Source Tree Structure</a></li>
<li class="toctree-l2"><a class="reference internal" href="build-system.html">Build System</a></li>
<li class="toctree-l2"><a class="reference internal" href="stitching-ifwi.html">Stitch IFWI Image</a></li>
<li class="toctree-l2"><a class="reference internal" href="fsp.html">Firmware Support Package</a></li>
<li class="toctree-l2"><a class="reference internal" href="boot-flow.html">Boot Flow</a></li>
<li class="toctree-l2"><a class="reference internal" href="boot-flow.html#ldrglobal-loader-global-data">LdrGlobal - Loader Global Data</a></li>
<li class="toctree-l2"><a class="reference internal" href="boot-flow.html#end-to-end-call-graph">End-to-End Call Graph</a></li>
<li class="toctree-l2"><a class="reference internal" href="boot-flow.html#platform-initialization">Platform Initialization</a></li>
<li class="toctree-l2"><a class="reference internal" href="flashmap.html">Flash Map</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Memory Map</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#temporary-memory-layout">Temporary Memory Layout</a></li>
<li class="toctree-l3"><a class="reference internal" href="#memory-management">Memory Management</a></li>
<li class="toctree-l3"><a class="reference internal" href="#permanent-memory-map">Permanent Memory Map</a></li>
<li class="toctree-l3"><a class="reference internal" href="#memory-allocation-within-slim-bootloader">Memory Allocation within Slim Bootloader</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#memoryallocationlib"><code class="docutils literal notranslate"><span class="pre">MemoryAllocationLib</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#fullmemoryallocationlib"><code class="docutils literal notranslate"><span class="pre">FullMemoryAllocationLib</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="configuration.html">Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="payload.html">Payloads</a></li>
<li class="toctree-l2"><a class="reference internal" href="osloader.html">OsLoader</a></li>
<li class="toctree-l2"><a class="reference internal" href="bootimage.html">Boot Image</a></li>
<li class="toctree-l2"><a class="reference internal" href="boot-options.html">Boot Options</a></li>
<li class="toctree-l2"><a class="reference internal" href="flash-boot.html">Boot from Flash</a></li>
<li class="toctree-l2"><a class="reference internal" href="versioning.html">Versioning</a></li>
<li class="toctree-l2"><a class="reference internal" href="boot-performance.html">Boot Performance</a></li>
<li class="toctree-l2"><a class="reference internal" href="shell.html">Shell Interface</a></li>
<li class="toctree-l2"><a class="reference internal" href="debugging-with-cca.html">Source Level Debugging with Intel(R) SVT CCA</a></li>
<li class="toctree-l2"><a class="reference internal" href="debugging-with-udk.html">Source Level Debugging with Intel(R) UDK Debugger</a></li>
<li class="toctree-l2"><a class="reference internal" href="logging.html">Logging</a></li>
<li class="toctree-l2"><a class="reference internal" href="contributions.html">Contribution Guidelines</a></li>
<li class="toctree-l2"><a class="reference internal" href="ingredients-update.html">Ingredients upgrade</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../security/index.html">Security Features</a></li>
<li class="toctree-l1"><a class="reference internal" href="../how-tos/index.html">How-Tos</a></li>
<li class="toctree-l1"><a class="reference internal" href="../tools/index.html">Tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="../tutorials/index.html">Tutorials</a></li>
<li class="toctree-l1"><a class="reference internal" href="../specs/index.html">Specifications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../references/references.html">References and Links</a></li>
<li class="toctree-l1"><a class="reference internal" href="../references/terminology.html">Terminology and Acronyms</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">Slim Bootloader</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="index.html">Developers Guide</a></li>
<li class="breadcrumb-item active">Memory Map</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="memory-map">
<h1>Memory Map<a class="headerlink" href="#memory-map" title="Permalink to this heading"></a></h1>
<section id="temporary-memory-layout">
<h2>Temporary Memory Layout<a class="headerlink" href="#temporary-memory-layout" title="Permalink to this heading"></a></h2>
<p>SBL Stage 1 temporary memory layout:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">Temporary</span> <span class="n">Memory</span>
<span class="o">+------------------------------+</span> <span class="n">Top</span> <span class="n">of</span> <span class="mi">4</span><span class="n">GB</span>
<span class="o">|</span> <span class="n">Memory</span> <span class="n">Mapped</span> <span class="n">Flash</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">Memory</span><span class="o">-</span><span class="n">Mapped</span> <span class="n">Flash</span> <span class="n">Base</span>
<span class="o">|</span> <span class="n">FSP</span><span class="o">-</span><span class="n">T</span> <span class="n">Reserved</span> <span class="n">Data</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">Top</span> <span class="n">of</span> <span class="n">Usable</span> <span class="n">Temporary</span> <span class="n">Memory</span>
<span class="o">|</span> <span class="n">Available</span><span class="o">*</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">End</span> <span class="n">of</span> <span class="n">Stage</span> <span class="mi">1</span> <span class="n">Data</span>
<span class="o">|</span> <span class="n">Stage</span> <span class="mi">1</span> <span class="n">Data</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">Stage</span> <span class="mi">1</span> <span class="n">Stack</span> <span class="n">Top</span><span class="o">/</span><span class="n">Stage</span> <span class="mi">1</span> <span class="n">Data</span> <span class="n">Base</span>
<span class="o">|</span> <span class="n">Stage</span> <span class="mi">1</span> <span class="n">Stack</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">Usable</span> <span class="n">CAR</span> <span class="n">Base</span><span class="o">/</span><span class="n">Stage</span> <span class="mi">1</span> <span class="n">Stack</span> <span class="n">Base</span>
</pre></div>
</div>
<aside class="footnote-list brackets">
<aside class="footnote brackets" id="id1" role="note">
<span class="label"><span class="fn-bracket">[</span>*<span class="fn-bracket">]</span></span>
<p>FSP-M Stack Region is typically chosen from Available Temporary Memory.</p>
</aside>
</aside>
</section>
<section id="memory-management">
<h2>Memory Management<a class="headerlink" href="#memory-management" title="Permalink to this heading"></a></h2>
<ul class="simple">
<li><p>Once main memory has been initialized, Stage 1B migrates the Slim Bootloader stack from temporary memory to the permanent
memory and also reserves a portion of memory to be used for global data structures (<code class="docutils literal notranslate"><span class="pre">LdrGlobal</span></code>, GDT, IDT), stack, heap,
and payload.</p></li>
</ul>
</section>
<section id="permanent-memory-map">
<h2>Permanent Memory Map<a class="headerlink" href="#permanent-memory-map" title="Permalink to this heading"></a></h2>
<p>SBL internal memory map layout (<code class="docutils literal notranslate"><span class="pre">BootloaderCoreLib.h</span></code>):</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span> <span class="n">Reserved</span> <span class="n">MEM</span>
<span class="o">+------------------------------+</span> <span class="n">Top</span> <span class="n">of</span> <span class="n">Low</span> <span class="n">MEM</span>
<span class="o">|</span> <span class="n">SOC</span> <span class="n">Reserved</span> <span class="n">MEM</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">Top</span> <span class="n">of</span> <span class="n">usable</span> <span class="n">MEM</span> <span class="n">Base</span>
<span class="o">|</span> <span class="n">FSP</span> <span class="n">Reserved</span> <span class="n">MEM</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">FSP</span> <span class="n">Reserved</span> <span class="n">MEM</span> <span class="n">Base</span>
<span class="o">|</span> <span class="n">LDR</span> <span class="n">Reserved</span> <span class="n">MEM</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">LDR</span> <span class="n">Reserved</span> <span class="n">MEM</span> <span class="n">Base</span>
<span class="o">|</span> <span class="n">ACPI</span> <span class="n">NVS</span> <span class="n">MEM</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">ACPI</span> <span class="n">NVS</span> <span class="n">MEM</span> <span class="n">Base</span>
<span class="o">|</span> <span class="n">ACPI</span> <span class="n">Reclaim</span> <span class="n">MEM</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">ACPI</span> <span class="n">Reclaim</span> <span class="n">MEM</span> <span class="n">Base</span>
<span class="o">|</span> <span class="n">PLD</span> <span class="n">Reserved</span> <span class="n">MEM</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">PLD</span> <span class="n">Reserved</span> <span class="n">MEM</span> <span class="n">Base</span>
<span class="n">Loader</span> <span class="n">Reserved</span> <span class="n">MEM</span>
<span class="o">+------------------------------+</span> <span class="n">StackTop</span>
<span class="o">|</span> <span class="n">LDR</span> <span class="n">Stack</span> <span class="p">(</span><span class="n">Down</span><span class="p">)</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span>
<span class="o">|</span> <span class="n">LDR</span> <span class="n">HOB</span> <span class="p">(</span><span class="n">Up</span><span class="p">)</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">MemPoolEnd</span> <span class="p">(</span><span class="n">Fixed</span><span class="p">)</span>
<span class="o">|</span> <span class="n">Global</span> <span class="n">Data</span> <span class="n">structures</span> <span class="o">|</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="o">|</span>
<span class="o">|</span> <span class="n">Permanent</span> <span class="n">MEM</span> <span class="n">Pool</span> <span class="p">(</span><span class="n">Down</span><span class="p">)</span> <span class="o">|</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="n">v</span>
<span class="o">+------------------------------+</span> <span class="n">MemPoolCurrTop</span> <span class="p">(</span><span class="n">Moving</span> <span class="n">down</span><span class="p">)</span>
<span class="o">|</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">MemPoolCurrBottom</span> <span class="p">(</span><span class="n">Moving</span> <span class="n">up</span><span class="p">)</span>
<span class="o">|</span> <span class="o">|</span> <span class="o">^</span>
<span class="o">|</span> <span class="n">Temporary</span> <span class="n">MEM</span> <span class="n">Pool</span> <span class="p">(</span><span class="n">Up</span><span class="p">)</span> <span class="o">|</span> <span class="o">|</span>
<span class="o">|</span> <span class="o">|</span> <span class="o">|</span>
<span class="o">+------------------------------+</span> <span class="n">MemPoolStart</span> <span class="p">(</span><span class="n">Fixed</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="memory-allocation-within-slim-bootloader">
<h2>Memory Allocation within Slim Bootloader<a class="headerlink" href="#memory-allocation-within-slim-bootloader" title="Permalink to this heading"></a></h2>
<p>Slim Bootloader has two different libraries for allocating memory during various
execution phases of the bootloader.</p>
<ul class="simple">
<li><p>Stage 1A, Stage 1B, Stage 2 use <code class="docutils literal notranslate"><span class="pre">MemoryAllocationLib</span></code> present in <code class="docutils literal notranslate"><span class="pre">BootloaderCorePkg</span></code>.</p></li>
<li><p>OsLoader and FwUpdate use <code class="docutils literal notranslate"><span class="pre">FullMemoryAllocationLib</span></code> present in <code class="docutils literal notranslate"><span class="pre">BootloaderCommonPkg</span></code>.</p></li>
</ul>
<section id="memoryallocationlib">
<h3><code class="docutils literal notranslate"><span class="pre">MemoryAllocationLib</span></code><a class="headerlink" href="#memoryallocationlib" title="Permalink to this heading"></a></h3>
<p><code class="docutils literal notranslate"><span class="pre">MemoryAllocationLib</span></code> allocates memory from the Loader Reserved Memory region. This
can be seen diagrammatically in the “Loader Reserved MEM” layout shown above.</p>
<p><code class="docutils literal notranslate"><span class="pre">MemoryAllocationLib</span></code> provides services for allocating two different types of memory -</p>
<ul class="simple">
<li><p>Bootloader permanent memory:</p>
<ul>
<li><p>Bootloader permanent memory is used by the bootloader to store device tables, S3 Data,
SBL container headers, etc.</p></li>
<li><p>Memory allocated from bootloader permanent memory region cannot be freed</p></li>
<li><p>Note that permanent memory does not mean that it is persistent across reboots</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">AllocatePool()</span></code>, <code class="docutils literal notranslate"><span class="pre">AllocateZeroPool()</span></code>, <code class="docutils literal notranslate"><span class="pre">AllocatePages()</span></code>, <code class="docutils literal notranslate"><span class="pre">AllocateAlignedPages()</span></code>
allocate memory from the Loader Reserved region starting from <code class="docutils literal notranslate"><span class="pre">MemPoolEnd</span></code> which grows
down towards <code class="docutils literal notranslate"><span class="pre">MemPoolStart</span></code></p>
<ul>
<li><p>Currently used allocated memory is between <code class="docutils literal notranslate"><span class="pre">MemPoolEnd</span></code> and <code class="docutils literal notranslate"><span class="pre">MemPoolCurrTop</span></code></p></li>
<li><p>Loader Reserved Memory is reported to the OS as “Reserved” memory</p></li>
</ul>
</li>
</ul>
</li>
<li><p>Temporary Memory:</p>
<ul>
<li><p>Temporary memory requested by a stage is expected to be used by that stage itself</p></li>
<li><p>Temporary memory is allocated starting from <code class="docutils literal notranslate"><span class="pre">MemPoolStart</span></code> and grows up towards
<code class="docutils literal notranslate"><span class="pre">MemPoolEnd</span></code>.</p>
<ul>
<li><p>Currently used temporary memory is between <code class="docutils literal notranslate"><span class="pre">MemPoolStart</span></code> and <code class="docutils literal notranslate"><span class="pre">MemPoolEnd</span></code></p></li>
</ul>
</li>
<li><p>Temporary Memory is freed by the <code class="docutils literal notranslate"><span class="pre">FreeTemporaryMemory()</span></code> API call.</p>
<ul>
<li><p>Calling <code class="docutils literal notranslate"><span class="pre">FreeTemporaryMemory()</span></code> with <code class="docutils literal notranslate"><span class="pre">NULL</span></code> as a parameter will free all allocated
memory within the temporary memory region.</p></li>
</ul>
</li>
</ul>
</li>
</ul>
</section>
<section id="fullmemoryallocationlib">
<h3><code class="docutils literal notranslate"><span class="pre">FullMemoryAllocationLib</span></code><a class="headerlink" href="#fullmemoryallocationlib" title="Permalink to this heading"></a></h3>
<ul class="simple">
<li><p>Stage 2 passes the HOB list pointer, and the Payload executable base to the payload.</p></li>
<li><p>The HOB list pointer contains the pointer to the HOBs consumed by the payload. The <code class="docutils literal notranslate"><span class="pre">MEMORY_MAP_INFO</span></code> HOB will report memory available to the payload.</p>
<ul>
<li><p>The payload reserved memory region from memory map info hob is identified by the <code class="docutils literal notranslate"><span class="pre">MEM_MAP_TYPE_RESERVED</span></code> entry type and the <code class="docutils literal notranslate"><span class="pre">MEM_MAP_FLAG_PAYLOAD</span></code>
flag.</p></li>
</ul>
</li>
<li><p>In case of tightly-coupled payloads, once the payload is loaded, <code class="docutils literal notranslate"><span class="pre">PayloadInit()</span></code> is called by <code class="docutils literal notranslate"><span class="pre">PayloadEntryLib</span></code> to initialize global data for the
payload.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">PayloadInit()</span></code> in turn calls <code class="docutils literal notranslate"><span class="pre">AddMemoryResourceRange()</span></code> from <code class="docutils literal notranslate"><span class="pre">FullMemoryAllocationLib</span></code> to initialize the memory ranges from which memory
will be allocated to the payload.</p></li>
<li><p>The size of the reserved memory, heap, and stack is determined by their respective PCDs defined in <code class="docutils literal notranslate"><span class="pre">BoardConfig.py</span></code>.</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">PLD_RSVD_MEM_SIZE</span></code>, <code class="docutils literal notranslate"><span class="pre">PLD_HEAP_SIZE</span></code>, and <code class="docutils literal notranslate"><span class="pre">PLD_STACK_SIZE</span></code></p></li>
</ul>
</li>
<li><p>Once the memory ranges are initialized, dynamic memory allocation will be done from the payload heap region.</p></li>
<li><p>The memory map of the Payload can be seen below:</p></li>
</ul>
<div class="highlight-text notranslate"><div class="highlight"><pre><span></span> Payload Memmap
+--------------------------------------------+ TOLUM
| Reserved memory for Slimboot core |
+--------------------------------------------+ RsvdBase + RsvdSize
| Reserved memory for Payload |
+--------------------------------------------+ RsvdBase
| + DMA buffer |
+--------------------------------------------+ DmaBase
| + Payload heap |
+--------------------------------------------+ HeapBase
| + Payload stack |
+--------------------------------------------+ StackBase
| Free memory |
+--------------------------------------------+ 0
</pre></div>
</div>
</section>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="flashmap.html" class="btn btn-neutral float-left" title="Flash Map" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="configuration.html" class="btn btn-neutral float-right" title="Configuration" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2018 - 2024, Intel Corporation.
<span class="lastupdated">Last updated on Jun 07, 2024.
</span></p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>