OS aus Tutorial - Fehler beim booten

Hallo liebe HaBo-Gemeinde,

ich habe gerade mal dieses Tutorial ausprobiert, hat auch alles soweit gut geklappt. Wenn ich nun aber versuche, das OS mit bochs zu booten, kommt auch zunächst der GRUB, in welchem ich das OS auch auswählen kann. Das eigentliche OS stürzt dann aber mit der Meldung
Code:
>>PANIC<< failed assertion "(addr & 0xf) == 0" at apic.cc:542
ab.
Testweise habe ich das Ganze auch mal auf eine echte Diskette geschrieben, hier bleibt der Bildschirm dann einfach komplett schwarz. Hat jemand eine Idee, wo der Fehler liegt?

mfg,
mcf :)
 
Hallo.

Das Ding funktioniert. Zumindest ein bisschen. Ich hab es mal in QEMU ausprobiert. Der String wird komischerweise erst dann angezeigt, wenn ich im Monitor den Videospeicher auslese (x/8b 0xb8000).

Wenn du vor der Endlosschleife ein ch = *video; einfügst (ch als char deklarieren), funktionierts auch.

Ist natürlich nur ein Workaround, wo das eigentliche Problem liegt weiß ich nicht.
 
Hallo thyrael.lu,

vielen Dank erstmal für deine Bemühungen. Allerdings verstehe ich nicht ganz, was du mit
Wenn du vor der Endlosschleife ein ch = *video; einfügst (ch als char deklarieren), funktionierts auch.
meinst. Hast du vielleicht einen Beispielcode? Wie kommst du überhaupt auf diesen Workaround? Und, weißt du wie man den Videospeicher mit bochs ausliest?
Ansonsten habe ich mit bochs jetzt noch folgende Fehler produzieren können, indem ich auf "Continue" geklickt habe, vielleicht sagt das ja etwas (Auszug aus der bochsout.txt):
Code:
00217530744i[APIC0] warning: misaligned APIC access. addr=0xfee00fff, len=1
00217530744p[APIC0] >>PANIC<< failed assertion "(addr & 0xf) == 0" at apic.cc:542

00217530744i[APIC0] APIC register 00000ff0 not implemented
00217530744p[APIC0] >>PANIC<< failed assertion "(addr & 0xf) == 0" at apic.cc:339

00217530744p[APIC0] >>PANIC<< APIC register ff0 not implemented
00217530749i[APIC0] warning: misaligned APIC access. addr=0xfee00ffe, len=1
00217530749p[APIC0] >>PANIC<< failed assertion "(addr & 0xf) == 0" at apic.cc:542

mfg,
mcf
 
Ausgehend vom Codebeispiel im Tutorial:
Code:
int main() {
  // Pointer zum Videospeicher
  char *video = (char*)0xB8000;
  // String zum Ausgeben
  char *hello = "Hello World";
  char ch; // XXX

  // Zuerst den Speicher leeren
  for(video+=4000; video !=(char*)0xB8000 ;video--)
     *video=0;
 
  // String ausgeben
  while (*hello) {
    *video = *hello;
    video++;
    *video = 0x07;
    video++;
    hello++;
  }
  
  ch = *video; // XXX
  
  // jetzt wo wir schon im Kernel drin sind, wollen wir auch nicht mehr raus ;)
  while (1);
  return 0;
}
D.h. ich lese einfach das letzte Byte vom String wieder aus dem Speicher aus. Das hab ich zufällig entdeckt. Ich wollte sehen, wie weit der Kernel kommt und hab mir erst die Register anzeigen lassen. EIP hat angezeigt, dass wir relativ zum Start des Codes bei Offset 0x80 stehen (also grob geschätzt bei der Endlosschleife). Ich wollte dann wissen, ob der String auch da steht wo er soll und hab nachgesehen. Sobald ich das gemacht hatte war der String plötzlich auf dem Schirm. Ins blaue rein geraten könnte das heißen, dass entweder gcc was wegoptimiert oder die CPU die Änderungen nur im Cache festhält und erst ins RAM schreibt, wenn eine Leseoperation folgt (kann ich mir aber schwer vorstellen, weil 0xb8000 mitten im ISA RAM (Adaptersegment) liegt, der m.W. nicht gecached wird).

Was die Fehlermeldung angeht: Ich hab von Bochs leider nicht wirklich Ahnung. Der APIC ist der Interruptcontroller, aber die Fehlermeldung sagt mir nicht wirklich, wo das Problem liegt (ich schätze aber mal die Fehlermeldung hat nichts mit dem Problem zu tun, dass nichts ausgegeben wird, wenn der Speicher nicht vor der Endlosschleife gelesen wird).

Bochs Debugger: http://www.chris-soft.de/tutorials/bochs/

MfG....
 
Hi,

danke erneut, aber bei mir hat auch das mit dem "char ch" nicht funktioniert. Ich werde mich mal weiter auf Fehlersuche begeben, muss aber jetzt erstmal mein bochs wieder an's laufen kriegen - gab da einen Paketkonflikt, wer weiß, vielleicht hilft's ja was. ;)

mfg

/edit: So, habe alle Paketkonfilkte gelöst, alles mal neu kompiliert/assembliert und gelinkt, und jetzt geht es komischerweise. :evil: Falls ich näheres rauskriegen, melde ich mich hier nochmal, ansonsten danke für deine Hilfe.
 
Zurück
Oben