Table of Contents

QtMips - simulátor architektury MIPS

QtMips je simulátor a nástroj k vizualizaci zpracování instrukcí procesorem s architekturou MIPS. Program umožňuje zvolit mezi více možnými způsoby zpracování instrukcí od jednoduché jednocyklové architektury až po plně zřetězené (pipeline) zpracování v pěti stupních. Přitom je možné volit mezi řešením hazardů formou pozastavení nebo, kde je to možné, formou přeposílání výsledků. Pro demonstraci datových hazardů je k dispozici je i konfigurace zřetězeného zpracování bez detekce a řešení hazardů. Program dále umožňuje konfigurovat vyrovnávací paměti (cache) jak pro čtení instrukcí tak pro čtení i zápis dat. Obsah a struktura vyrovnávacích pamětí je opět graficky znázorněna stejně jako jsou barevně zvýrazněné buňky paměti, jejich obsah se nachází v dané chvíli ve vyrovnávací paměti.

Simulátor je výsledkem diplomového projektu Ing. Karla Kočího. V jeho diplomové práci Graphical CPU Simulator with Cache Visualization lze nalézt analýzu alternativních simulátorů architektury MIPS, popis objektového návrhu simulátoru a návod jak simulátor QtMips používat.

Volba architektury MIPS

Jako základní modelová architektura byla pro předmět APO vybraná architektura MIPS. Důvody k její volbě:

Alternativy

Simulátor QtMips

K výuce se po dlouhou dobu používal simulátor dodávaný s učebnicemi Computer Organization and Design. Jeho architektura byla již nevyhovující, přitom aplikace byla implementovaná s využitím starého WIN 32 API. Méně problémů bylo s jejím provozem v emulaci než nativně na Windows. K aplikaci nebylo možné sehnat zdrojové kódy a problémy řešit. QtMips je výsledkem zadané diplomové práce. Jedná se již o třetí práci na toto téma a v tomto případě považujeme výsledek za zdařilý. Aby se práce soustředila na implementaci vlastního simulátoru, bylo rozhodnuté, že nebude obsahovat editor ani integrovaný překladač zdrojového kódu. K překladu se využívají plnohodnotné nástroje pro programování MISP a jiných procesorů od malých vestavných aplikací až po superpočítače - překladač GCC a GNU assembler vzniklé v rámci projektu GNU.

Pro editaci zdrojových kódů lze využít odlehčený editor Geany nebo jiný editor. Pro překlad pak GNU překladač kompilující programy pro architekturu MIPS. V nejjednodušší variantě například voláním

mips-elf-gcc -ggdb -nostartfiles -o program program.S
z příkazové řádky, kdy je výsledkem překladu zdrojového souboru v assembleru (standardizovaně přípona velké S - .S) přímo spustitelný program. Volba -ggdb určuje, že budou přidané ladící informace. Volba -nostartfiles pak určuje, že zdrojové kódy obsahují přímo vstupní bod programu. Pokud volba není zadaná, přidá se standardní inicializační část C knihovny - objektový soubor crt.o. Protože se předpokládá jeho zavedení operačním systémem, je vlastní strojový kód v instrukcích cílového procesoru vložený do obálky ve formátu ELF (Executable and Linkable Format), která určuje adresy, na které bude kód zavedený a adresu od které se má spustit. Adresy, na které bude kód a příslušná data zavedená lze zobrazit příkazem
objdump --headers program
Proložený výpis zdrojového kódu a výsledku překladu lze pak získat
objdump --source program
tento postup je pak zajímavější při kompilaci kódu z vyššího programovacího jazyka, ale pro pochopení základů zůstaňme ještě u assembleru. Minimální zdrojový soubor může vypadat následovně
.globl _start
.set noat
.set noreorder
.ent _start

_start:
        addi  $1, $0, 0x1234
        // prostor pto pokačování

loop:
        break
        beq  $0, $0, loop
	nop
.end _start
Volba .globl určuje, že návěští _start bude viditelné i vně kompilační jednotky/souboru. Volba .noat zakazuje assembleru vkládat sekvence využívající pomocný registr. Volba .noreorder zakazuje assembleru optimalizovat kód skokových instrukcí a automaticky využívat “delay slot”. Volba .ent označuje, od kterého symbolu bude kód startovat. Identifikátory před dvojtečkou jsou návěští, symbolické označení adresy, na kterou se lze odkazovat z instrukcí. Dále následují instrukce pro vlastní procesor. V přiloženém příkladu se jedná pouze o jednu instrukci, přičtení přímého operandu 0x1234 hexadecimálně k registru 0 fixovanému na hodnotu nula a uložení výsledku do registru 1. Další návěští loop slouží k zastavení programu po jeho vykonání. Zastavení kontinuálního běhu simulátoru zajišťuje zakompilovaná instrukce break. Tento strojový kód by se využil i při ladění na skutečném systému, kdy ladící program podle potřeby nahradí instrukce v programu kódem break na místo většinou určené podle čísla řádky zdrojového souboru a při jeho dosažení při normálním běhu procesoru dojde k výjimce, kterou obslouží ladící program. Následuje skoková instrukce, která zajistí i při pokusu o pokračování programu v simulátoru opětovné zastavení na instrukci break. Nakonec pseudoinstrukce .end označuje konec kódu a opět určuje adresu od které se bude program spouštět.

Podrobnější popis a formátů souborů a kompilace programů naleznete na stránce projektu QtMips. QtMips - spustitelné formáty a kompilátory

Odkazy na stažení simulátoru QtMips

Zdrojové kódy jsou spravované na platformě GitHub. Na této platformě je možné snadno vytvořit vlastní vývojovou větev (fork). Původní práce pana Kočího se nachází na adrese https://github.com/Cynerd/QtMips, současná nejnovější větev na stránce https://github.com/cvut/QtMips. Zkompilované verze programu pro platformu GNU/Linux 64-bitů a Windows 32-bitů se nacházejí ve složce release projektu https://github.com/cvut/QtMips/releases. Zabalené archivy obsahují i potřebné knihovny. Vlastní grafická verze programu na Windows se nachází ve spustitelném programu qtmips_gui.exe. Na platformě GNU/Linux je nutné buď nainstalovat potřebné knihovny (jedná se o Qt5) v odpovídající verzi do systému nebo program spouštět skriptem qtmips.sh který nastaví cesty k lokálně distribuovaným knihovnám a spustí vlastní aplikaci bin/qtmips_gui. Pro aktuální verze distribuce Ubuntu GNU/Linuxu jsou připravené zkompilované balíky na adrese https://launchpad.net/~ppisa/+archive/ubuntu/qtmips. Pro několik dalších distribucí jsou k dispozici balíky kompilované Suse Open Build Service. V laboratorní síti je aplikace nainstalovaná do systému a lze jí spouštět přímo z příkazové řádky příkazem qtmips_gui nebo z nabídky aplikací ve složce Development. Instalace se nachází v adresáři /opt/qtmips a je jí možné dotud i zkopírovat na vlastní médium nebo do emailu.

K dispozici je i experimentální verze emulátoru zkompilovaného jako WASM aplikace pro prohlížeče s podporou WebGL, WASM a Javascriptu http://cmp.felk.cvut.cz/~pisa/apo/qtmips/qtmips_gui.html.

K překladu zdrojových kódů je pak potřeba překladač, který je popsaný na stránce Křížový překladač GNU pro architekturu MIPS-ELF.

Kompilace ze zdrojových kódů

Nejdříve je potřeba nainstalovat vývojové prostředí knihoven Qt5. Na distribucích Debian i Ubuntu se instalace vývojového prostředí docílí příkazy

sudo apt-get install build-essential
sudo apt-get install qtcreator
sudo apt-get install qt5-default

Vlastní aplikaci lze z vývojového repozitáře naklonovat příkazem

git clone git://github.com/cvut/QtMips.git

K vlastní kompilaci lze buď projekt otevřít v prostředí QtCreator nebo provést kompilaci z příkazové řádky

mkdir QtMips-build
cd QtMips-build
qmake "CONFIG+=static" "CONFIG+=staticlib" -recursive ../QtMips/qtmips.pro
make

Pokud se na systému nachází jako počáteční vývojové prostředí ke Qt4 může být nutné použít plnou cestu programu qmake

/usr/lib/x86_64-linux-gnu/qt5/bin/qmake "CONFIG+=static" "CONFIG+=staticlib" -recursive ../QtMips/qtmips.pro

Více opět na stránkách projektu.