Autor Thema: QEMU - Debug-Messages an Gastsystem schicken  (Gelesen 5638 mal)

nnosdev

  • Beiträge: 61
    • Profil anzeigen
Gespeichert
« am: 17. February 2012, 13:15 »
Ich würde gerne (und ich weiß, dass es geht - nur nicht wie) Debug-Messages an das Gastsystem schicken.
Und zwar über die VM an mein Ubuntu-Terminal um genau zu sein.

Hat da jemand schon Erfahrung damit? Verzeiht mir falls man das auch googeln kann, ich hab darüber nichts gefunden.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 17. February 2012, 13:33 »
Du meinst vom Gastsystem an die Host-Konsole?

Am einfachsten alles auf die serielle Schnittstelle ausgeben und qemu die Option -serial stdio übergeben. Das funktioniert dann sogar auf echter Hardware, falls du ein passendes Kabel zur Hand hast.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 17. February 2012, 13:37 »
Alternativ geht auch die Systemkonsole (d.h. Tastatur)...

nnosdev

  • Beiträge: 61
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 17. February 2012, 17:31 »
Also bin in dieser Geschichte noch blutiger Anfänger.. ^^

Hab hier was gefunden. Bin ich damit auf der richtigen Spur? :D

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 17. February 2012, 17:46 »
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

nnosdev

  • Beiträge: 61
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 18. March 2012, 23:32 »
Also ich hab das Tutorial gelesen und versucht das zum Laufen zu bekommen.

Aber leider scheint es nicht zu funktionieren.

Der folgende Code soll nur zeigen, wie ich Bytes an das Port
schicke. Ist das vom Prinzip her richtig?

// ...
unsigned int *ptraddr;
unsigned int address;

ptraddr = (unsigned int *) 0x00000400;

int a, b;

for (a = 0; a < 4; a++) {
address = *ptraddr;

if (address != 0) {
for (b = 0; b < 100; b++)
outb(address, a);
}
*ptraddr++;
}
// ...


static inline void outb(uint16 port, uint8 val)
{
   __asm__ __volatile__ (
   "outb %b0, %w1"
   :
   : "a"(val), "d"(port));
}

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 18. March 2012, 23:40 »
Kannst du mal Zeile für Zeile erklären, was du denkst, dass der Code macht, und warum das sinnvoll ist? Für mich sieht das nämlich sehr seltsam aus.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

nnosdev

  • Beiträge: 61
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 19. March 2012, 01:01 »
Na klar!

Bin mir auch nicht ganz sicher, ob das so funktioniert wie ich mir das
gedacht hab ... ^^

Also diesmal mit Comments:

unsigned int *ptraddr;
unsigned int address;

// BIOS Data-Area http://www.lowlevel.eu/wiki/BIOS_Data_Area
ptraddr = (unsigned int *) 0x00000400;

int a, b;

for (a = 0; a < 4; a++) {
address = *ptraddr;

// Wenn address != 0 dann ist das die Anfangsadresse
// des jew. COM-Portes
if (address != 0) {
for (b = 0; b < 100; b++)
outb(address, a); // Schickt an ein gefundenes COM-Port
}
*ptraddr++;
}

und hier nochmal die outb() Funktion:


static inline void outb(uint16 port, uint8 val)
{
   __asm__ __volatile__ (
   "outb %b0, %w1"
   :
   : "a"(val), "d"(port));
}

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 19. March 2012, 13:00 »
Das heißt, du schickt hundertmal 0x0 an COM1, 0x1 and COM2 usw.? Wie prüfst du, ob das richtige Ergebnis rauskommt? Das sind ja alles nicht-druckbare Steuerzeichen.

Aber ich glaube, die Ports aus der BDA auszulesen ist in der Praxis sowieso überflüssig. 0x3f8 sollte eigentlich immer passen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

nnosdev

  • Beiträge: 61
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 19. March 2012, 13:19 »
Naja es ist egal was ich schicke. Es kommt nichts an (bzw. es wird nichts im Terminal angezeig).


// Mir würde es reicht wenn überhaupt mal etwas angezeigt wird :D

if (address != 0) {
for (b = 0; b < 100; b++)
outb(address, b); // Schickt an ein gefundenes COM-Port
}

*EDIT

Oder könnte es auch an QEMU liegen? Ich führe es mit
qemu -kernel kernel
über ein Makefile aus.
« Letzte Änderung: 19. March 2012, 13:43 von nnosdev »

nnosdev

  • Beiträge: 61
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 19. March 2012, 14:36 »


Okay, es lag tatsächlich daran und jetzt seh ich auch, dass du das in deiner ersten Antwort scho geschrieben hast ...
Gut, das ist jetzt echt bitter..  :|

Was muss man jetzt noch machen wenn jedes Byte sofort angezeigt werden soll das an COM1 geschickt wird?
Wenn ich das Programm starte, bekomme ich nicht sofort den Output. Würde das gerne in Echtzeit sehen..

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 19. March 2012, 16:50 »
Nun, ich schreibe einfach in den RAM ab physisch 0xB8000 - je 2 Bytes pro Zeichen... ;-)

 

Einloggen