Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

ARM und Qemu

History Lesson!
Dieser Artikel spiegelt sehr wahrscheinlich nicht mehr den aktuellen Stand wider, könnte aber trotzdem von Interesse sein.

Im folgenden findet ihr eine kurze Anleitung wie man die 2. TechGI 3 Hausaufgabe (ARM Assembler) mit Hilfe von Qemu testen kann. Vorraussetzung ist ein Linux System (32 oder 64bit) und ein bisschen Erfahrung auf der Kommandozeile :)

1. Qemu installieren:

Für diejenigen die ein 64bit Linux benutzen habe ich ein fertig kompiliertes Paket bereitgestellt, welches die benötigten Patches enthält. Ihr findet es unter http://www.freitagsrunde.org/~aeichner/qemu-0.9.1-kbs.tar.bz2. Für diejenigen die ein 32bit Linux benutzen hat tkroenert ein fertig kompiliertes Paket bereitgestellt, welches die benötigten Patches enthält. Ihr findet es unter http://www.freitagsrunde.org/~tkroenert/qemu-0.9.1-kbs.tar.bz2.

Einfach als root mit Hilfe von

tar -xf qemu-0.9.1-arm.tar.gz

auspacken (vorher mit cd ins Root

Verzeichnis / wechseln). Für alle anderen mit 32bit Linux gibt es unter Isis eine Anleitung, wie man qemu mit den Patches kompiliert. Wenn jemand qemu selbst kompilieren will:

wget http://bellard.org/qemu/qemu-0.9.1.tar.gz
scp cs:/home/komm/lehre/qemu-0.9.1-kbspatch-data/qemu-0.9.1-kbs.patch
aptitude install libsdl-dev

Den Rest solltet ihr wissen. Ist hier auch nicht der richtige Ort zum dafuer erklaeren.

2. U-Boot:

Damit ihr die Programme in Qemu ausführen könnt benötigt ihr einen Bootloader. Wie auf den echten Portux Systemen kommt hier U-Boot zum Einsatz. Weil das kompilieren nicht gerade einfach ist könnt ihr ein fertiges Image unter http://www.freitagsrunde.org/~aeichner/u-boot.bin runterladen.

3. ARM toolchain:

Um die Testprogramme zu kompilieren wird ein Crosscompiler benötigt der Maschinencode für den ARM erzeugt. Ein funtkionierendes Paket findet ihr unter http://www.mikrocontroller.net/download/arm-toolchain-linux-2.tar.bz2

Einfach irgendwo mit

tar -xf arm-toolchain-linux.tar.bz2

entpacken und den Pfad mit

export PATH=$PATH:<Pfad zu Arm Toolchain>/arm/bin

hinzufügen damit der Compiler gefunden werden kann.

Allerdings funktioniert ; für Kommentare nicht, sondern es muss @ verwendet werden.

4. Vorlagen:

Die Vorlage von Isis funktioniert nicht um funktionierende Images für QEMU/U-Boot zu erstellen (Um genau zu sein müssen die Makefiles verändert werden). Die angepassten Vorlagen können unter http://www.freitagsrunde.org/~aeichner/Blatt2Vorgabe_qemu.zip runterladen. In der ZIP-Datei gibt es zwei neue Dateien. Im Unterordner a und b gibt es ein neues Makefile namens Makefile.qemu. Wenn ihr die Testprogramme für QEMU kompilieren wollt müsst ihr in dem Ordner "make -f Makefile.qemu" ausführen. Die Datei Makefile ist das Original von ISIS, damit ihr die Programme auch für das reale System kompilieren könnt (eine Garantie dafür, dass es auch wirklich funktioniert gibt es nicht ;))

5. Qemu starten:

Das ist der letzte Schritt und wenn ihr alles richtig gemacht habt könnt ihr anschliessend eure Programme testen. Qemu startet ihr mit dem folgenden Befehl:

/usr/local/bin/qemu-system-arm -kernel <Pfad zu u-boot Image>/u-boot.bin -m 32 -serial stdio -nographic -M versatiletub -net user,vlan=0 -net 
nic,vlan=0,model=smc91c111 -tftp <Pfad zu euren Testprogrammen>

Ihr könnt den Aufruf auch in ein Shellscript packen, damit ihr das nicht jedesmal schreiben müsst. Wenn alles funktioniert hat erwartet euch die "Shell" von U-Boot:

initializing tublcd...


U-Boot 2008.10-00227-g1378174-dirty (Nov 13 2008 - 13:21:48)

DRAM:   0 kB
Flash:  0 kB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Versatile # 

Jetzt ladet ihr euer Image per DHCP/TFTP mit Hilfe von:

dhcp 4000 /<Dateiname>

Dateinname steht für das ELF-Image welches beim kompilieren erzeugt wurde (techgi3b2a). Beim kompilieren entstehen noch zwei weitere Dateien namens techgi3b2a.bin und techgi3b2aBoot. Diese funktionieren nicht. Das laden dauert eine Weile (bei mir ungefähr 30sec). Als letztes startet ihr euer Programm mit:

bootelf 4000

TADA!! (oder auch nicht, wenn euer Programm einen Bug hat ;))