| <!DOCTYPE html> |
| <html> |
| <head> |
| <!-- Global site tag (gtag.js) - Google Analytics --> |
| <script async src="https://www.googletagmanager.com/gtag/js?id='UA-133422980-2"></script> |
| <script> |
| window.dataLayer = window.dataLayer || []; |
| function gtag(){dataLayer.push(arguments);} |
| gtag('js', new Date()); |
| |
| gtag('config', ''UA-133422980-2'); |
| </script> |
| |
| <meta charset="utf-8"> |
| <meta http-equiv="x-ua-compatible" content="ie=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| |
| <title>gem5</title> |
| |
| <!-- SITE FAVICON --> |
| <link rel="shortcut icon" type="image/gif" href="/assets/img/gem5ColorVert.gif"/> |
| |
| <link rel="canonical" href="http://localhost:4000/building/"> |
| <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,700,800,600' rel='stylesheet' type='text/css'> |
| <link href='https://fonts.googleapis.com/css?family=Muli:400,300' rel='stylesheet' type='text/css'> |
| |
| <!-- FAVICON --> |
| <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"> |
| |
| <!-- BOOTSTRAP --> |
| <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"> |
| |
| <!-- CUSTOM CSS --> |
| <link rel="stylesheet" href="/css/main.css"> |
| </head> |
| |
| |
| <body> |
| <nav class="navbar navbar-expand-md navbar-light bg-light"> |
| <a class="navbar-brand" href="/"> |
| <img src="/assets/img/gem5ColorLong.gif" alt="gem5" height=45px> |
| </a> |
| <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation"> |
| <span class="navbar-toggler-icon"></span> |
| </button> |
| <div class="collapse navbar-collapse" id="navbarNavDropdown"> |
| <ul class="navbar-nav ml-auto"> |
| <li class="nav-item "> |
| <a class="nav-link" href="/">Home</a> |
| </li> |
| |
| <li class="nav-item dropdown "> |
| <a class="nav-link dropdown-toggle" href="/about" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
| About |
| </a> |
| <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> |
| <a class="dropdown-item" href="/about">About</a> |
| <a class="dropdown-item" href="/publications">Publications</a> |
| <a class="dropdown-item" href="/governance">Governance</a> |
| </div> |
| </li> |
| |
| <li class="nav-item dropdown active"> |
| <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
| Documentation |
| </a> |
| <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> |
| <!-- Pull navigation from _data/documentation.yml --> |
| |
| <a class="dropdown-item" href="/introduction">Introduction</a> |
| |
| <a class="dropdown-item" href="/building">Getting Started</a> |
| |
| <a class="dropdown-item" href="/environment">Modifying/Extending</a> |
| |
| <a class="dropdown-item" href="/MSIintro">Modeling Cache Coherence with Ruby</a> |
| |
| </div> |
| </li> |
| |
| <li class="nav-item "> |
| <a class="nav-link" href="/contributing">Contributing</a> |
| </li> |
| |
| <li class="nav-item "> |
| <a class="nav-link" href="/blog">Blog</a> |
| </li> |
| |
| <li class="nav-item "> |
| <a class="nav-link" href="/search">Search</a> |
| </li> |
| </ul> |
| </div> |
| </nav> |
| |
| <main> |
| <div class="sidenav-top"> |
| <a href="/"><img src="/assets/img/gem5ColorLong.gif" height="80"></a> |
| <div class="search"> |
| <form action="/search" method="get"> |
| <!-- <label for="search-box"><i class="fa fa-search"></i></label> --> |
| <input type="text" name="query"> |
| <button type="submit" name="submit"><i class="fa fa-search"></i></button> |
| </form> |
| </div> |
| </div> |
| <div class="sidenav"> |
| <!-- Pull navigation from _data/documentation.yml --> |
| |
| <a class="item" href="/introduction" role="button" aria-expanded="false" aria-controls="collapseExample"> |
| Introduction |
| </a> |
| <div class="collapse " id="introduction"> |
| |
| </div> |
| |
| <a class="item" data-toggle="collapse" href="#pt1" role="button" aria-expanded="false" aria-controls="collapseExample"> |
| Getting Started |
| </a> |
| <div class="collapse show" id="pt1"> |
| |
| <a class="subitem active" href="/building">Building gem5</a> |
| |
| <a class="subitem " href="/simple_config">Creating a simple configuration script</a> |
| |
| <a class="subitem " href="/cache_config">Adding cache to configuration script</a> |
| |
| <a class="subitem " href="/gem5_stats">Understanding gem5 statistics and output</a> |
| |
| <a class="subitem " href="/example_configs">Using the default configuration scripts</a> |
| |
| </div> |
| |
| <a class="item" data-toggle="collapse" href="#pt2" role="button" aria-expanded="false" aria-controls="collapseExample"> |
| Modifying/Extending |
| </a> |
| <div class="collapse " id="pt2"> |
| |
| <a class="subitem " href="/environment">Setting up your development environment</a> |
| |
| <a class="subitem " href="/helloobject">Creating a very simple SimObject</a> |
| |
| <a class="subitem " href="/debugging">Debugging gem5</a> |
| |
| <a class="subitem " href="/events">Event-driven programming</a> |
| |
| <a class="subitem " href="/parameters">Adding parameters to SimObjects and more events</a> |
| |
| <a class="subitem " href="/memoryobject">Creating SimObjects in the memory system</a> |
| |
| <a class="subitem " href="/simplecache">Creating a simple cache object</a> |
| |
| </div> |
| |
| <a class="item" data-toggle="collapse" href="#pt3" role="button" aria-expanded="false" aria-controls="collapseExample"> |
| Modeling Cache Coherence with Ruby |
| </a> |
| <div class="collapse " id="pt3"> |
| |
| <a class="subitem " href="/MSIintro">Introduction to Ruby</a> |
| |
| <a class="subitem " href="/cache-intro">MSI example cache protocol</a> |
| |
| <a class="subitem " href="/cache-declarations">Declaring a state machine</a> |
| |
| <a class="subitem " href="/cache-in-ports">In port code blocks</a> |
| |
| <a class="subitem " href="/cache-actions">Action code blocks</a> |
| |
| <a class="subitem " href="/cache-transitions">Transition code blocks</a> |
| |
| <a class="subitem " href="/directory">MSI Directory implementation</a> |
| |
| <a class="subitem " href="/MSIbuilding">Compiling a SLICC protocol</a> |
| |
| <a class="subitem " href="/configuration">Configuring a simple Ruby system</a> |
| |
| <a class="subitem " href="/running">Running the simple Ruby system</a> |
| |
| <a class="subitem " href="/MSIdebugging">Debugging SLICC Protocols</a> |
| |
| <a class="subitem " href="/simple-MI_example">Configuring for a standard protocol</a> |
| |
| </div> |
| |
| </div> |
| |
| <div class="container" id="doc-container"> |
| <div class="edit"><a href="https://github.com/gem5/new-website/tree/master/_pages/documentation/part1/building.md">Edit this page</a></div> |
| <dl> |
| <dt>authors</dt> |
| <dd>Jason Lowe-Power</dd> |
| </dl> |
| |
| <h1 id="building-gem5">Building gem5</h1> |
| |
| <p>This chapter covers the details of how to set up a gem5 developmment |
| environment and build gem5.</p> |
| |
| <h2 id="requirements-for-gem5">Requirements for gem5</h2> |
| |
| <p>See <a href="http://gem5.org/Compiling_M5#Required_Software">gem5 requirements</a> |
| for more details.</p> |
| |
| <p>On Ubuntu, you can install all of the required dependencies with the |
| following command. The requirements are detailed below.</p> |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install build-essential git m4 scons zlib1g zlib1g-dev libprotobuf-dev protobuf-compiler libprotoc-dev libgoogle-perftools-dev python-dev python |
| </code></pre></div></div> |
| |
| <ol> |
| <li> |
| <dl> |
| <dt>git (<a href="https://git-scm.com/">Git</a>):</dt> |
| <dd>The gem5 project uses <a href="https://git-scm.com/">Git</a> for version |
| control. <a href="https://git-scm.com/">Git</a> is a distributed version |
| control system. More information about |
| <a href="https://git-scm.com/">Git</a> can be found by following the link. |
| Git should be installed by default on most platforms. However, |
| to install Git in Ubuntu use |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install git |
| </code></pre></div> </div> |
| </dd> |
| </dl> |
| </li> |
| <li> |
| <dl> |
| <dt>gcc 4.8+</dt> |
| <dd>You may need to use environment variables to point to a |
| non-default version of gcc. |
| |
| <p>On Ubuntu, you can install a development environment with</p> |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install build-essential |
| </code></pre></div> </div> |
| </dd> |
| </dl> |
| </li> |
| <li> |
| <dl> |
| <dt><a href="http://www.scons.org/">SCons</a></dt> |
| <dd>gem5 uses SCons as its build environment. SCons is like make on |
| steroids and uses Python scripts for all aspects of the build |
| process. This allows for a very flexible (if slow) build system. |
| |
| <p>To get SCons on Ubuntu use</p> |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install scons |
| </code></pre></div> </div> |
| </dd> |
| </dl> |
| </li> |
| <li> |
| <dl> |
| <dt>Python 2.7+</dt> |
| <dd>gem5 relies on the Python development libraries. To install |
| these on Ubuntu use |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install python-dev |
| </code></pre></div> </div> |
| </dd> |
| </dl> |
| </li> |
| <li> |
| <dl> |
| <dt><a href="https://developers.google.com/protocol-buffers/">protobuf</a> 2.1+</dt> |
| <dd>“Protocol buffers are a language-neutral, platform-neutral |
| extensible mechanism for serializing structured data.” In gem5, |
| the <a href="https://developers.google.com/protocol-buffers/">protobuf</a> |
| library is used for trace generation and playback. |
| <a href="https://developers.google.com/protocol-buffers/">protobuf</a> is |
| not a required package, unless you plan on using it for trace |
| generation and playback. |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install libprotobuf-dev python-protobuf protobuf-compiler libgoogle-perftools-dev |
| </code></pre></div> </div> |
| </dd> |
| </dl> |
| </li> |
| </ol> |
| |
| <h2 id="getting-the-code">Getting the code</h2> |
| |
| <p>Change directories to where you want to download the gem5 source. Then, |
| to clone the repository, use the <code class="highlighter-rouge">git clone</code> command.</p> |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://gem5.googlesource.com/public/gem5 |
| </code></pre></div></div> |
| |
| <p>You can now change directories to <code class="highlighter-rouge">gem5</code> which contains all of the gem5 |
| code.</p> |
| |
| <h2 id="your-first-gem5-build">Your first gem5 build</h2> |
| |
| <p>Let’s start by building a basic x86 system. Currently, you must compile |
| gem5 separately for every ISA that you want to simulate. Additionally, |
| if using ruby-intro-chapter, you have to have separate compilations for |
| every cache coherence protocol.</p> |
| |
| <p>To build gem5, we will use SCons. SCons uses the SConstruct file |
| (<code class="highlighter-rouge">gem5/SConstruct</code>) to set up a number of variables and then uses the |
| SConscript file in every subdirectory to find and compile all of the |
| gem5 source.</p> |
| |
| <p>SCons automatically creates a <code class="highlighter-rouge">gem5/build</code> directory when first |
| executed. In this directory you’ll find the files generated by SCons, |
| the compiler, etc. There will be a separate directory for each set of |
| options (ISA and cache coherence protocol) that you use to compile gem5.</p> |
| |
| <p>There are a number of default compilations options in the <code class="highlighter-rouge">build_opts</code> |
| directory. These files specify the parameters passed to SCons when |
| initially building gem5. We’ll use the X86 defaults and specify that we |
| want to compile all of the CPU models. You can look at the file |
| <code class="highlighter-rouge">build_opts/X86</code> to see the default values for the Scons options. You |
| can also specify these options on the command line to override any |
| default.</p> |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>scons build/X86/gem5.opt -j9 |
| </code></pre></div></div> |
| |
| <blockquote> |
| <p><strong>gem5 binary types</strong></p> |
| |
| <p>The SCons scripts in gem5 currently have 5 different binaries you can |
| build for gem5: debug, opt, fast, prof, and perf. These names are |
| mostly self-explanatory, but detailed below.</p> |
| |
| <dl> |
| <dt>debug</dt> |
| <dd>Built with no optimizations and debug symbols. This binary is |
| useful when using a debugger to debug if the variables you need to |
| view are optimized out in the opt version of gem5. Running with |
| debug is slow compared to the other binaries.</dd> |
| <dt>opt</dt> |
| <dd>This binary is build with most optimizations on (e.g., -O3), but |
| with debug symbols included. This binary is much faster than |
| debug, but still contains enough debug information to be able to |
| debug most problems.</dd> |
| <dt>fast</dt> |
| <dd>Built with all optimizations on (including link-time optimizations |
| on supported platforms) and with no debug symbols. Additionally, |
| any asserts are removed, but panics and fatals are still included. |
| fast is the highest performing binary, and is much smaller than |
| opt. However, fast is only appropriate when you feel that it is |
| unlikely your code has major bugs.</dd> |
| <dt>prof and perf</dt> |
| <dd>These two binaries are build for profiling gem5. prof includes |
| profiling information for the GNU profiler (gprof), and perf |
| includes profiling information for the Google performance tools |
| (gperftools).</dd> |
| </dl> |
| |
| <p>The main argument passed to SCons is what you want to build, |
| <code class="highlighter-rouge">build/X86/gem5.opt</code>. In this case, we are building gem5.opt (an |
| optimized binary with debug symbols). We want to build gem5 in the |
| directory build/X86. Since this directory currently doesn’t exist, SCons |
| will look in <code class="highlighter-rouge">build_opts</code> to find the default parameters for X86. (Note: |
| I’m using -j9 here to execute the build on 9 of my 8 cores on my |
| machine. You should choose an appropriate number for your machine, |
| usually cores+1.)</p> |
| </blockquote> |
| |
| <p>The output should look something like below:</p> |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Checking for C header file Python.h... yes |
| Checking for C library pthread... yes |
| Checking for C library dl... yes |
| Checking for C library util... yes |
| Checking for C library m... yes |
| Checking for C library python2.7... yes |
| Checking for accept(0,0,0) in C++ library None... yes |
| Checking for zlibVersion() in C++ library z... yes |
| Checking for GOOGLE_PROTOBUF_VERIFY_VERSION in C++ library protobuf... yes |
| Checking for clock_nanosleep(0,0,NULL,NULL) in C library None... yes |
| Checking for timer_create(CLOCK_MONOTONIC, NULL, NULL) in C library None... no |
| Checking for timer_create(CLOCK_MONOTONIC, NULL, NULL) in C library rt... yes |
| Checking for C library tcmalloc... yes |
| Checking for backtrace_symbols_fd((void*)0, 0, 0) in C library None... yes |
| Checking for C header file fenv.h... yes |
| Checking for C header file linux/kvm.h... yes |
| Checking size of struct kvm_xsave ... yes |
| Checking for member exclude_host in struct perf_event_attr...yes |
| Building in /local.chinook/gem5/gem5-tutorial/gem5/build/X86 |
| Variables file /local.chinook/gem5/gem5-tutorial/gem5/build/variables/X86 not found, |
| using defaults in /local.chinook/gem5/gem5-tutorial/gem5/build_opts/X86 |
| scons: done reading SConscript files. |
| scons: Building targets ... |
| [ISA DESC] X86/arch/x86/isa/main.isa -> generated/inc.d |
| [NEW DEPS] X86/arch/x86/generated/inc.d -> x86-deps |
| [ENVIRONS] x86-deps -> x86-environs |
| [ CXX] X86/sim/main.cc -> .o |
| .... |
| .... <lots of output> |
| .... |
| [ SHCXX] nomali/lib/mali_midgard.cc -> .os |
| [ SHCXX] nomali/lib/mali_t6xx.cc -> .os |
| [ SHCXX] nomali/lib/mali_t7xx.cc -> .os |
| [ AR] -> drampower/libdrampower.a |
| [ SHCXX] nomali/lib/addrspace.cc -> .os |
| [ SHCXX] nomali/lib/mmu.cc -> .os |
| [ RANLIB] -> drampower/libdrampower.a |
| [ SHCXX] nomali/lib/nomali_api.cc -> .os |
| [ AR] -> nomali/libnomali.a |
| [ RANLIB] -> nomali/libnomali.a |
| [ CXX] X86/base/date.cc -> .o |
| [ LINK] -> X86/gem5.opt |
| scons: done building targets. |
| </code></pre></div></div> |
| |
| <p>When compilation is finished you should have a working gem5 executable |
| at <code class="highlighter-rouge">build/X86/gem5.opt</code>. The compilation can take a very long time, |
| often 15 minutes or more, especially if you are compiling on a remote |
| file system like AFS or NFS.</p> |
| |
| <h2 id="common-errors">Common errors</h2> |
| |
| <h3 id="wrong-gcc-version">Wrong gcc version</h3> |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Error: gcc version 4.8 or newer required. |
| Installed version: 4.4.7 |
| </code></pre></div></div> |
| |
| <p>Update your environment variables to point to the right gcc version, or |
| install a more up to date version of gcc. See |
| building-requirements-section.</p> |
| |
| <h3 id="python-in-a-non-default-location">Python in a non-default location</h3> |
| |
| <p>If you use a non-default version of Python, (e.g., version 2.7 when 2.5 |
| is your default), there may be problems when using SCons to build gem5. |
| RHEL6 version of SCons uses a hardcoded location for Python, which |
| causes the issue. gem5 often builds successfully in this case, but may |
| not be able to run. Below is one possible error you may see when you run |
| gem5.</p> |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Traceback (most recent call last): |
| File "........../gem5-stable/src/python/importer.py", line 93, in <module> |
| sys.meta_path.append(importer) |
| TypeError: 'dict' object is not callable |
| </code></pre></div></div> |
| |
| <p>To fix this, you can force SCons to use your environment’s Python |
| version by running <code class="highlighter-rouge">python `which scons` build/X86/gem5.opt</code> instead |
| of <code class="highlighter-rouge">scons build/X86/gem5.opt</code>. More information on this can be found on |
| the gem5 wiki about non-default Python locations: <a href="http://www.gem5.org/Using_a_non-default_Python_installation">Using a non-default |
| Python |
| installation</a>.</p> |
| |
| <h3 id="m4-macro-processor-not-installed">M4 macro processor not installed</h3> |
| |
| <p>If the M4 macro processor isn’t installed you’ll see an error similar to |
| this:</p> |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>... |
| Checking for member exclude_host in struct perf_event_attr...yes |
| Error: Can't find version of M4 macro processor. Please install M4 and try again. |
| </code></pre></div></div> |
| |
| <p>Just installing the M4 macro package may not solve this issue. You may |
| nee to also install all of the <code class="highlighter-rouge">autoconf</code> tools. On Ubuntu, you can use |
| the following command.</p> |
| |
| <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install automake |
| </code></pre></div></div> |
| |
| <br> |
| |
| <!-- RETRIVE PREVIOUS PAGE LINK --> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <!-- RETRIEVE NEXT PAGE LINK --> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <div class="navbuttons"> |
| |
| |
| |
| <a href="/simple_config"><button type="button" class="btn btn-outline-primary">NEXT</button></a> |
| |
| </div> |
| </div> |
| |
| </main> |
| |
| |
| <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> |
| <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script> |
| <script src="https://unpkg.com/commentbox.io/dist/commentBox.min.js"></script> |
| |
| <script> |
| // When the user scrolls down 20px from the top of the document, show the button |
| window.onscroll = function() {scrollFunction()}; |
| |
| function scrollFunction() { |
| if (document.body.scrollTop > 100 || document.documentElement.scrollTop > 20) { |
| document.getElementById("myBtn").style.display = "block"; |
| } else { |
| document.getElementById("myBtn").style.display = "none"; |
| } |
| } |
| |
| // When the user clicks on the button, scroll to the top of the document |
| function topFunction() { |
| document.body.scrollTop = 0; |
| document.documentElement.scrollTop = 0; |
| } |
| |
| import commentBox from 'commentbox.io'; |
| // or |
| const commentBox = require('commentbox.io'); |
| // or if using the CDN, it will be available as a global "commentBox" variable. |
| |
| commentBox('my-project-id'); |
| |
| </script> |
| |
| </body> |
| |
| |
| </html> |