Hallo,
ich möchte hier mal vorstellen, wie ich auf echter Hardware debugge.
Ich habe mir dazu einen kleinen Debugger in den Kernel eingebaut, der ähnlich aussieht, wie der von Bochs. Er unterstützt folgende Befehle:
- s: Singlestep
- c: Ausführung fortsetzen, bis zum nächsten Breakpoint
- lb: Breakpoint setzen
- d: Breakpoint löschen
- info b: Breakpoints anzeigen
- x: Inhalt an einer bestimmten Adresse anzeigen
Zusätzlich wird bei einer Exception auch der Debugger aufgerufen. Für den Debugger wird der Debuginterrupt (int 1) benutzt. Der Debugger wird dabei wie ein Task behandelt. Beim Debuginterrupt wird einfach ein Taskswitch vorgenommen. Dies ist notwendig, damit Interrupts aktiviert sind.
Ich hatte es mal anders ausprobiert und die Interrupts im Handler aktiviert, aber das hat nicht funktioniert.
Um Breakpoints zu setzen, werden die Debugregister der CPU verwendet. Der Singlestep wird durch ein Flag im Flagregister realisiert.
Was ich noch einbauen möchte ist ein Disassembler. Ich habe aber keinen gefunden und deshalb begonnen selber einen zu schreiben. Er ist aber noch nicht funktionstüchtig. Vielleicht kennt ja einer von euch einen opensource Disassembler.
Wenn ihr euch mal meinen Debugger anschauen möchtet, so könnt ihr das
hier tun. Momentan wird einfach nur ein Breakpoint unterstützt. Wie der Interrupthandler aufgebaut ist könnt ihr
hier (Zeile 200) einsehen.
Wie debugged ihr auf echter Hardware?
Ich hoffe ich konnte euch einen Lösungsvorschlag geben.
P.S.: Der Debugger hat manchmal seine Problemchen (z.B. wenn man über den x-Befehl auf eine Speicherstelle zugreift, die nicht gemappt ist, dann gibt es einen Page Fault und dann muss man neustarten) also sollte man aufpassen was man macht. Und ich habe ihn bissher auch nur für Kerneldebugging eingesetzt also weiss ich nicht, ob man damit auch Tasks debuggen könnte. Theoretisch sollte es aber möglich sein.