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.
Jako základní modelová architektura byla pro předmět APO vybraná architektura MIPS. Důvody k její volbě:
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.Sz 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 programProložený výpis zdrojového kódu a výsledku překladu lze pak získat
objdump --source programtento 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 _startVolba
.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
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.
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.