Difference between revisions of "Documentation"
Line 1: | Line 1: | ||
− | =Getting Started= | + | ==Getting Started== |
− | ==What is M5?== | + | ===What is M5?=== |
M5 is a modular discrete event driven computer system simulator platform. That means that: | M5 is a modular discrete event driven computer system simulator platform. That means that: | ||
Line 19: | Line 19: | ||
− | ==Getting a copy== | + | ===Getting a copy=== |
M5's source code is managed using the mercurial revision control system. There are several repositories you may be interested in: | M5's source code is managed using the mercurial revision control system. There are several repositories you may be interested in: | ||
Line 48: | Line 48: | ||
− | ==Building== | + | ===Building=== |
M5 uses the scons build system which is based on python. To build the simulator binary, run scons from the top of the source directory with a target of the form “build/<config>/<binary>” where <config> is replaced with one of the predefined set of build parameters and <binary> is replaced with one of the possible m5 binary names. The predefined set of parameters determine build wide configuration settings that affect the behavior, composition, and capabilities of the binary being built. These include whether the simulator will run in FS or SE mode, if Ruby support is included, which ISA will be supported, which CPU models to build, and what coherence protocol Ruby should use. Examples are ARM_FS, X86_SE, and ALPHA_SE_MOESI_CMP_token. All of the available options can be found in the build_opts directory, and it should be fairly easy to see what each is for. We'll talk about the build system in more detail later. Valid binary names are m5.debug, m5.opt, m5.fast, and m5.prof. These binaries all have different properties suggested by their extension. m5.debug has optimization turned off to make debugging easier in tools like gdb, m5.opt has optimizations turned on but debug output and asserts left in, m5.fast removes those debugging tools, and m5.prof is built to use with gprof. Normally you'll want to use m5.opt. To build the simulator in syscall emulation mode with Alpha support, optimizations turned on, and debugging left in, you would run: | M5 uses the scons build system which is based on python. To build the simulator binary, run scons from the top of the source directory with a target of the form “build/<config>/<binary>” where <config> is replaced with one of the predefined set of build parameters and <binary> is replaced with one of the possible m5 binary names. The predefined set of parameters determine build wide configuration settings that affect the behavior, composition, and capabilities of the binary being built. These include whether the simulator will run in FS or SE mode, if Ruby support is included, which ISA will be supported, which CPU models to build, and what coherence protocol Ruby should use. Examples are ARM_FS, X86_SE, and ALPHA_SE_MOESI_CMP_token. All of the available options can be found in the build_opts directory, and it should be fairly easy to see what each is for. We'll talk about the build system in more detail later. Valid binary names are m5.debug, m5.opt, m5.fast, and m5.prof. These binaries all have different properties suggested by their extension. m5.debug has optimization turned off to make debugging easier in tools like gdb, m5.opt has optimizations turned on but debug output and asserts left in, m5.fast removes those debugging tools, and m5.prof is built to use with gprof. Normally you'll want to use m5.opt. To build the simulator in syscall emulation mode with Alpha support, optimizations turned on, and debugging left in, you would run: | ||
Line 61: | Line 61: | ||
− | ==Running== | + | ===Running=== |
Now that you've built M5, it's time to try running it. An M5 command line is composed of four parts, the binary itself, options for M5, a configuration script to run, and then finally options for the configuration script. Several example configuration scripts are provided in the “configs/example” directory and are generally pretty powerful. You are encouraged to make your own scripts, but these are a good starting point. The example script we'll use in SE mode is called se.py and sets up a basic SE mode simulation for us. We'll tell it to run the hello world binary provided in the M5 source tree. | Now that you've built M5, it's time to try running it. An M5 command line is composed of four parts, the binary itself, options for M5, a configuration script to run, and then finally options for the configuration script. Several example configuration scripts are provided in the “configs/example” directory and are generally pretty powerful. You are encouraged to make your own scripts, but these are a good starting point. The example script we'll use in SE mode is called se.py and sets up a basic SE mode simulation for us. We'll tell it to run the hello world binary provided in the M5 source tree. | ||
Line 119: | Line 119: | ||
− | ==Asking for help== | + | ===Asking for help=== |
M5 has two main mailing lists where you can ask for help or advice. m5-dev is for developers who are working on the main version of M5. This is the version that's distributed from the website and most likely what you'll base your own work off of. m5-users is a larger mailing list and is for people working on their own projects which are not, at least initially, going to be distributed as part of the official version of M5. Most of the time m5-users is the right mailing list to use. Most of the people on m5-dev are also on m5-users including all the main developers, and in addition many other members of the M5 community will see your post. That helps you because they might be able to answer your question, and it also helps them because they'll be able to see the answers people send you. To find more information about the mailing lists, to sign up, or to look through archived posts visit: | M5 has two main mailing lists where you can ask for help or advice. m5-dev is for developers who are working on the main version of M5. This is the version that's distributed from the website and most likely what you'll base your own work off of. m5-users is a larger mailing list and is for people working on their own projects which are not, at least initially, going to be distributed as part of the official version of M5. Most of the time m5-users is the right mailing list to use. Most of the people on m5-dev are also on m5-users including all the main developers, and in addition many other members of the M5 community will see your post. That helps you because they might be able to answer your question, and it also helps them because they'll be able to see the answers people send you. To find more information about the mailing lists, to sign up, or to look through archived posts visit: | ||
Line 129: | Line 129: | ||
− | =Source Code= | + | ==Source Code== |
− | ==Tour of the tree== | + | ===Tour of the tree=== |
These are the files and directories at the top of the tree: | These are the files and directories at the top of the tree: | ||
Line 172: | Line 172: | ||
− | ==Style rules== | + | ===Style rules=== |
− | ==Generated files - where do they end up== | + | ===Generated files - where do they end up=== |
− | ==.m5 config files | + | ===.m5 config files=== |
− | == | ||
− | ==jobfile to run multiple jobs== | + | ===jobfile to run multiple jobs=== |
− | =Build System= | + | ==Build System== |
− | ==Build targets | + | ===Build targets=== |
− | == | ||
− | ==Configuration variables | + | ===Configuration variables=== |
− | == | + | ====What are they==== |
− | ===What are they | + | ====What do they do=== |
− | === | + | ====How do you get at their values==== |
− | ===What do they do | ||
− | === | ||
− | ===How do you get at their values=== | ||
− | ==Running regressions | + | ===Running regressions=== |
− | == | + | ===Adding files to the build=== |
− | ==Adding files to the build== | ||
− | ==Using EXTRAS | + | ===Using EXTRAS=== |
− | == | + | ==SimObjects== |
− | =SimObjects= | ||
− | ==The python side== | + | ===The python side=== |
− | ===Param types (table?)=== | + | ====Param types (table?)==== |
− | ===Inheritance=== | + | ====Inheritance==== |
− | ===Special attribute names=== | + | ====Special attribute names==== |
− | ===Rules for importing - how to get what | + | ====Rules for importing - how to get what==== |
− | === | + | ====Pro tips - avoiding cycles, always descend from root, etc.==== |
− | ===Pro tips - avoiding cycles, always descend from root, etc. | + | ===The C++ side=== |
− | === | + | ====create functions==== |
− | ==The C++ side | ||
− | == | ||
− | ===create functions=== | ||
− | ===Stages of initialization=== | + | ====Stages of initialization==== |
− | ===Header files to include | + | ====Header files to include==== |
− | === | + | ==Configuration Scripts== |
− | =Configuration Scripts | + | ===SimObject hierarchy=== |
− | = | + | ===Explanation of infrastructure scripts in configs=== |
− | ==SimObject hierarchy | ||
− | == | ||
− | ==Explanation of infrastructure scripts in configs== | ||
− | ==How to use se.py and fs.py. | + | ===How to use se.py and fs.py.=== |
− | == | + | ===How to use other top level scripts (what are they?)=== |
− | ==How to use other top level scripts (what are they?)== | ||
− | =General memory system | + | ==General memory system== |
− | = | + | ===Ports system=== |
− | ==Ports system | + | ====Ports in general==== |
− | == | + | ====Various port types==== |
− | ===Ports in general | + | ====Packets==== |
− | === | + | ====Requests==== |
− | ===Various port types | + | ====Atomic/Timing/Functional accesses==== |
− | === | ||
− | ===Packets | ||
− | === | ||
− | ===Requests | ||
− | === | ||
− | ===Atomic/Timing/Functional accesses=== | ||
− | =Classic memory system | + | ==Classic memory system== |
− | = | + | ===MemObjects=== |
− | ==MemObjects== | ||
− | ==Caches== | + | ===Caches=== |
− | ===Hooking them up=== | + | ====Hooking them up==== |
− | ===Parameters | + | ====Parameters==== |
− | === | + | ===Interconnects=== |
− | ==Interconnects== | ||
− | ===Buses | + | ====Buses==== |
− | === | + | ====Bridges==== |
− | ===Bridges=== | ||
− | ===Anything else?=== | + | ====Anything else?==== |
− | ==Coherence== | + | ===Coherence=== |
− | =Ruby (no idea what to say here)= | + | ==Ruby (no idea what to say here)== |
− | =Events | + | ==Events== |
− | |||
− | |||
− | = | + | ===Event queue=== |
− | |||
− | ==Event | ||
− | |||
− | |||
− | |||
− | = | ||
− | ==I | + | ===EventManager objects (I don’t know a lot about these)=== |
+ | ===Event objects=== | ||
+ | ===Time sync=== | ||
+ | ==Devices== | ||
− | == | + | ===I/O device base classes=== |
− | == | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == | + | ===IDE=== |
− | == | + | ===NICS=== |
− | == | + | ===Timers=== |
+ | ===PCI devices=== | ||
− | == | + | ===DMA devices=== |
− | == | + | ===UARTs and serial terminals=== |
− | = | ||
− | = | ||
− | == | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == | ||
− | == | + | ===Explanation of platforms and systems, how they’re related, and what they’re each for=== |
− | == | + | ==Execution Basics== |
− | == | + | ===Predecoding=== |
+ | ===StaticInsts=== | ||
+ | ===Microcode support=== | ||
+ | ===ExecContext=== | ||
− | = | + | ===ThreadContext=== |
+ | ===Faults=== | ||
− | == | + | ==Architectural State== |
− | |||
− | |||
− | |||
− | |||
− | == | + | ===Registers=== |
− | == | + | ====Register types - float, int, misc==== |
− | = | + | ====Indexing - register spaces stuff==== |
+ | ===PCs=== | ||
− | ==TLB management | + | ==Address Translation== |
− | == | + | ===TLB management=== |
− | ==Delayed translation== | + | ===Delayed translation=== |
+ | ===Page table walkers (defer to ISA discussion?)=== | ||
+ | ===Differences between SE and FS mode=== | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ===Sharing of code between atomic and timing | + | ==CPUs== |
− | === | + | ===Simple CPU=== |
− | ==O3 CPU | + | ====Flow of execution==== |
− | == | + | |
+ | ====Sharing of code between atomic and timing==== | ||
+ | ===O3 CPU=== | ||
+ | |||
===Anatomy of the pipeline=== | ===Anatomy of the pipeline=== | ||
Revision as of 15:04, 21 February 2011
==Getting Started==
Contents
- 1 What is M5?
- 2 Getting a copy
- 3 Building
- 4 Running
- 5 Asking for help
- 6 Source Code
- 7 Build System
- 8 SimObjects
- 9 Configuration Scripts
- 10 General memory system
- 11 Classic memory system
- 12 Ruby (no idea what to say here)
- 13 Events
- 14 Devices
- 15 Execution Basics
- 16 Architectural State
- 17 Address Translation
- 18 CPUs
- 19 =
- 20 =
- 21 =
- 22 =
- 23 =
- 24 Interrupts
- 25 =
- 26 ISA parser
- 27 =
- 28 =
- 29 =
- 30 ARM Implementation
- 31 MIPS Implementation
- 32 SPARC Implemenation
- 33 Pseudo Instructions
- 34 SE mode
- 35 Statistics (don’t know what to say here)
- 36 Development Tools/Contributing
- 37 External Dependencies
What is M5?
M5 is a modular discrete event driven computer system simulator platform. That means that:
1. M5's components can be rearranged, parameterized, extended or replaced easily to suite your needs.
2. It simulates the passing of time as a series of discrete events.
3. It's intended use is to simulate one or more computer systems in various ways.
4. It's more than just a simulator, it's a simulator platform that lets you use as many of its premade components as you want to build up your own simulation system.
M5 is written primarily in C++ and python and most components are provided under a BSD style license. It can simulate a complete system with devices and an operating system in full system mode (FS mode), or user space only programs where system services are provided directly by the simulator in syscall emulation mode (SE mode). There are varying levels of support for executing Alpha, ARM, MIPS, Power, SPARC, and 64 bit x86 binaries on CPU models including two simple single CPI models, an out of order model, and an in order pipelined model. A memory system can be flexibly built out of caches and interconnects. Recently the Ruby simulator has been integrated with M5 to provide even better, more flexible memory system modeling.
There are many components and features not mentioned here, but from just this partial list it should be obvious that M5 is a sophisticated and capable simulation platform. Even with all M5 can do today, active development continues through the support of individuals and some companies, and new features are added and existing features improved on a regular basis. For the most up to date information you can check out the project's website at www.m5sim.org.
Getting a copy
M5's source code is managed using the mercurial revision control system. There are several repositories you may be interested in:
1. m5 – The main repository is where active development takes place.
2. m5-stable – A repository which lags behind “m5” repository but has basically the same contents. It’s usually better to use “m5” instead of “m5-stable”
3. encumbered – A repository for extensions to M5 that are under a different, more restrictive license. Currently this only includes support for SimpleScalar's EIO trace format.
4. alpha-system – A repository for Alpha system software specialized for M5, specifically PAL and Console code.
5. linux-patches – A repository for patches to the linux kernel that modify it so it can be simulated more efficiently. These patches are optional, but it's a good idea to use them if possible to cut down on simulation run time.
To check out a copy, first, make sure you have mercurial installed on your system and that you can run the “hg” command. Then use “hg clone” to create your own local copy using the URL “http://repo.m5sim.org/XXX” where XXX is replaced by the name of the repository your interested in. For example, to check out the main repository, you'd use the command:
hg clone http://repo.m5sim.org/m5
You can find out more about mercurial and its commands using its built in help by running:
hg help
Building
M5 uses the scons build system which is based on python. To build the simulator binary, run scons from the top of the source directory with a target of the form “build/<config>/<binary>” where <config> is replaced with one of the predefined set of build parameters and <binary> is replaced with one of the possible m5 binary names. The predefined set of parameters determine build wide configuration settings that affect the behavior, composition, and capabilities of the binary being built. These include whether the simulator will run in FS or SE mode, if Ruby support is included, which ISA will be supported, which CPU models to build, and what coherence protocol Ruby should use. Examples are ARM_FS, X86_SE, and ALPHA_SE_MOESI_CMP_token. All of the available options can be found in the build_opts directory, and it should be fairly easy to see what each is for. We'll talk about the build system in more detail later. Valid binary names are m5.debug, m5.opt, m5.fast, and m5.prof. These binaries all have different properties suggested by their extension. m5.debug has optimization turned off to make debugging easier in tools like gdb, m5.opt has optimizations turned on but debug output and asserts left in, m5.fast removes those debugging tools, and m5.prof is built to use with gprof. Normally you'll want to use m5.opt. To build the simulator in syscall emulation mode with Alpha support, optimizations turned on, and debugging left in, you would run:
scons build/ALPHA_SE/m5.opt
In your source tree, you'd then find a new “build/ALPHA_FS/” directory with the requested m5.opt in it. For the rest of this chapter we'll assume this is the binary you're using.
Running
Now that you've built M5, it's time to try running it. An M5 command line is composed of four parts, the binary itself, options for M5, a configuration script to run, and then finally options for the configuration script. Several example configuration scripts are provided in the “configs/example” directory and are generally pretty powerful. You are encouraged to make your own scripts, but these are a good starting point. The example script we'll use in SE mode is called se.py and sets up a basic SE mode simulation for us. We'll tell it to run the hello world binary provided in the M5 source tree.
build/ALPHA_SE/m5.opt configs/example/se.py -c tests/test-progs/hello/bin/alpha/linux/hello
This builds up a simulated system, tells it to run the binary found at the location specified, and kicks off the simulation. As the binary runs, it's output is sent to the console by default and looks like this:
M5 Simulator System
Copyright (c) 2001-2008
The Regents of The University of Michigan
All Rights Reserved
M5 compiled Feb 12 2011 20:43:55
M5 revision e00ef55a2c49 7933 default tip
M5 started Feb 12 2011 20:45:47
M5 executing on fajita
command line: build/ALPHA_SE/m5.opt configs/example/se.py -c tests/test-progs/hello/bin/alpha/linux/hello
Global frequency set at 1000000000000 ticks per second
0: system.remote_gdb.listener: listening for remote gdb #0 on port 7000
- REAL SIMULATION ****
info: Entering event queue @ 0. Starting simulation...
info: Increasing stack size by one page.
Hello world!
hack: be nice to actually delete the event here
Exiting @ tick 3240000 because target called exit()
You can see a lot of output from the simulator itself, but the line “Hello world!” came from the simulated program. In this example we didn't provide any options to M5 itself. If we had, they would have gone on the command line between m5.opt and se.py. If you'd like to see what command line options are supported, you can pass the --help option to either M5 or the configuration script. The two groups of options are different, so make sure you keep track of whether they go before or after the configuration script.
Asking for help
M5 has two main mailing lists where you can ask for help or advice. m5-dev is for developers who are working on the main version of M5. This is the version that's distributed from the website and most likely what you'll base your own work off of. m5-users is a larger mailing list and is for people working on their own projects which are not, at least initially, going to be distributed as part of the official version of M5. Most of the time m5-users is the right mailing list to use. Most of the people on m5-dev are also on m5-users including all the main developers, and in addition many other members of the M5 community will see your post. That helps you because they might be able to answer your question, and it also helps them because they'll be able to see the answers people send you. To find more information about the mailing lists, to sign up, or to look through archived posts visit:
http://m5sim.org/wiki/index.php/Mailing_Lists
Source Code
Tour of the tree
These are the files and directories at the top of the tree:
AUTHORS LICENSE README RELEASE_NOTES SConstruct build_opts configs ext src system tests util
AUTHORS, LICENSE, README are files with general information about the simulator. AUTHORS is a list of people who have historically contributed to M5. LICENSE has the license terms that applies to M5 as a whole, unless overridden by a more specific license. README has some very basic information introducing M5 and explaining how to get started.
The SConstruct file is part of the build system, as is the build_opts directory. build_opts holds files that define default settings for build different build configurations. These include X86_FS and MIPS_SE, for instance.
The configs directory is for simulation configuration scripts which are written in python. These are described in more detail later. The files in this directory help make writing configurations easier by providing some basic prepackaged functionality, and include a few examples which can be used directly or as a starting point for your own scripts.
The ext directory is for things M5 depends on but which aren’t actually part of M5. Specifically these are for dependencies that are harder to find, not likely to be available, or where a particular version is needed.
The src directory is where most of M5 is located. This is where all of the C++ and python source that contributes to the M5 binary is kept, excluding components in the ext directory.
The system directory is for the source for low level software like firmware or bootloaders for use in simulated systems. Currently this includes Alpha’s PAL and console code, and a simple bootloader for ARM.
The tests directory stores files related to M5’s regression tests. These include the scripts that build up the configurations used in the tests and reference outputs. Simple hello world binaries are also stored here, but other binaries need to be downloaded separately.
Finally, in the util directory are utility scripts, programs and useful files which are not part of the M5 binary but are generally useful when working on M5.
Style rules
Generated files - where do they end up
.m5 config files
jobfile to run multiple jobs
Build System
Build targets
Configuration variables
What are they
=What do they do
How do you get at their values
Running regressions
Adding files to the build
Using EXTRAS
SimObjects
The python side
Param types (table?)
Inheritance
Special attribute names
Rules for importing - how to get what
Pro tips - avoiding cycles, always descend from root, etc.
The C++ side
create functions
Stages of initialization
Header files to include
Configuration Scripts
SimObject hierarchy
Explanation of infrastructure scripts in configs
How to use se.py and fs.py.
How to use other top level scripts (what are they?)
General memory system
Ports system
Ports in general
Various port types
Packets
Requests
Atomic/Timing/Functional accesses
Classic memory system
MemObjects
Caches
Hooking them up
Parameters
Interconnects
Buses
Bridges
Anything else?
Coherence
Ruby (no idea what to say here)
Events
Event queue
EventManager objects (I don’t know a lot about these)
Event objects
Time sync
Devices
I/O device base classes
IDE
NICS
Timers
PCI devices
DMA devices
UARTs and serial terminals
Execution Basics
Predecoding
StaticInsts
Microcode support
ExecContext
ThreadContext
Faults
Architectural State
Registers
Register types - float, int, misc
Indexing - register spaces stuff
PCs
Address Translation
TLB management
Delayed translation
Page table walkers (defer to ISA discussion?)
Differences between SE and FS mode
CPUs
Simple CPU
Flow of execution
Sharing of code between atomic and timing
O3 CPU
Anatomy of the pipeline
===DynInsts
=
===Wires/delay
=
===Squashing
=
===Load/store handling
=
===Renaming
=
etc.
InOrder (what to say here?)
Interrupts
Traditional handling with platform object
==New, currently X86 only system ==
Interrupt sources/sinks/wires/pins
===Interrupt messages
=
Interrupt managing objects in the CPU
ISA parser
==Formats ==
operands
==decode tree ==
let blocks
microcode assembler
microops
===macroops
=
===directives
=
===rom object
=
Lots more stuff
=Multiple ISA support = ==Switching header files ==
Specialized classes and functions
Matrix of supported ISA/mode/CPU combinations
=Alpha Implementation =
ARM Implementation
==Supported features and modes == ==Thumb support ==
Special PC management
MIPS Implementation
=Power Implementation =
SPARC Implemenation
Supported features and modes
=X86 Implementation =
Microcode ISA
==Macroop specialization ==
Platform objects
Physical memory space allocation
Supported features and modes
Pseudo Instructions
==List of pseudo instructions and what they do ==
How to get at and use them from a binary, script, etc.
SE mode
==Loading binaries ==
System call instruction handling
Implementation of various system calls
Limitations
Statistics (don’t know what to say here)
=Utility Code =
Bitfield functions
==BitUnion classes == ==FastAlloc == ==IntMath ==
panic, warn, etc., when to use what
==random number generation ==
reference counting pointers
=Debugging = ==Trace flags ==
State trace/Tracer objects
==Remote GDB support ==
tracediff
Regressions
Development Tools/Contributing
==Mercurial queues ==
Review board
==Mercurial repo browser ==