Autor Thema: Timer Interrupt  (Gelesen 17461 mal)

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 13. October 2005, 09:07 »
Das ist mir schon klar, dass der Bootloader die ersten 512 Byte vom Image ausmacht und ab dem 513. Byte der Kernel dann kommt. Aber in dem von dir angegebenen Sourcecode steht im kernel zuerst der JMP-Befehl und dieser verweist auf die Stelle 01a7. Dort sollte dann der CLI-Befehl stehen - jedenfalls laut Source. Tatsächlich steht dort aber ein MOV-Befehl. Das kann man in Bochs sehen und auch im Image, wenn man einen Hex-Editor zu rate zieht.

Fakt: Der Kernel-Source und das Image passen nicht zusammen. Und somit ist es mir auch nicht möglich zu sagen, wo dein Fehler steckt.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 13. October 2005, 22:10 »
Ja also bei mir hat es da noch geklappt. Ich hab jetzt das Image extra nochmals neu "kompiliert". Sonst weiss ich nicht mehr weiter.

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 15. October 2005, 19:54 »
Hi,

also nimm's mir nicht übel, wenn ich dir das hier mal ganz direkt sage: Ich bin ein wenig sickig.

Ich habe dir schon geschrieben, dass das Image in deinem Verzeichnis unmöglich mit dem Sourcecode des Kernels übereinstimmen kann und du hast mir gesagt, jetzt wäre alles passend und so.

Ist es nicht!

Also es gibt zwei Möglichkeiten: Entweder dein Assembler ist hinüber (halte ich für nicht so wahrscheinlich, aber die Möglichkeit will ich zumindest mal in Betracht ziehen) oder aber du bist nicht in der Lage, eine überalterte Version deines Images zu überschreiben.

Aber okay, ich möchte nicht beleidigend wirken, daher schreibe ich dir einfach detailiert auf, was mir nicht passt:

Im Hex-Editor finde ich an den Adressen 0000 bis 01ff den Bootsektor. Ab 0200 findet sich dann der Kernel. Soweit in Ordnung.

An Stelle 0200 steht:

0200 e9 a4 01

Das entspricht dem "jmp start" in deinem Kernel-Source, nämlich "jmp 0x1a7".

An dieser Stelle (plus 0200, wegen dem Bootsektor) finde ich folgendes:

03a7 b0 4b

Das wiederum bedeutet "mov al, 0x4b". In deinem Kernel finde ich an dieser Stelle aber ein "cli".

Ich wiederhole: Das Image, das du uns mitgegeben hast, gehört nicht zu den mitgelieferten Sourcen.

Gerne helfe ich dir bei deinem Problem weiter, aber ich glaube, dass du erstmal ein eigenes Problem mit dem Zusammenbasteln deines Images lösen möchtest. Und wenn du das gefunden hast, gib Bescheid, dann helfe ich gerne weiter.

Vielleicht beschreibst du einfach mal, wie du womit übersetzt und dann das Image bildest, vielleicht machst du da ja unbewusst einen Fehler...

Nimm mir meine harschen Anfangsworte bitte nicht übel!

Gruß!

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 16. October 2005, 08:15 »
Also, ich kompiliere zuerst die boot und kernel Datei mit Nasm zu Bin-Dateien. Dann kopiere ich diese mit dem "copy" Befehl zu einem Image zusammen.

Vieleicht hilft das

Dmk

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 16. October 2005, 08:22 »
Das ist korrekt soweit - der Fehler muss irgendwo anders liegen. Ich bleibe dabei: Das Image entspricht nicht dem Source.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 17. October 2005, 09:26 »
Ich weiss. Ich lad dir jetzt noch das Binary und die Bochs-Konfigurationsdatei hoch, damit du es selbst nomals kompilieren usw. kannst. (Ich denk mal du hast NASM) Wenn es dann immer noch nicht stimmt weiss ich nicht mehr weiter.

Gruss
Noooooooooos


PS: Ich fahre diese Woche in die Ferien, darum kann es sein, dass ich nicht so schnell antworten kann.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 21. October 2005, 12:26 »
Ich weiss nicht mehr weiter. Ich hab keine Ahnung, warum das Image nicht stimmt. Ich bin jetzt von den Ferien zurück und werde mir nochmal alles anschauen.

Gruss
Noooooooooos

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 21. October 2005, 13:54 »
Ich gestehe, dass ich mich in der letzten Woche nicht drum gekümmert habe, aber es ist nicht in Vergessenheit geraten! Poste hier, falls du was raus kriegst.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 21. October 2005, 21:45 »
So. Ich hab jetzt das ganze Image durchgemacht bis zum sti. Bei mir funktioniert es. Es ist eigentlich komisch, denn nach dem sti hab ich nur meine Endlosschleife, welche ich auch im Bochs-Debugger sehe. Vom Timer-Interupt merkt man nichts.

Zitat von: WhiteDragon


An Stelle 0200 steht:

0200 e9 a4 01

Das entspricht dem "jmp start" in deinem Kernel-Source, nämlich "jmp 0x1a7".

An dieser Stelle (plus 0200, wegen dem Bootsektor) finde ich folgendes:

03a7 b0 4b



Warum "An dieser Stelle plus 0200, wegen dem Bootsektor", ich denke man kann im B-Debugger einfach ein "s" eingeben, dann springt Bochs doch völlig alleine zum Ziel des Sprunges.

Jedenfalls kommt nach dem sti die planmässige Endlosschleife und nirgends etwas vom Timer. Was bedeutet das, muss ich vieleicht dem Computer etwas besseres als die Schleife geben ??

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 21. October 2005, 22:01 »
Wenn du also immer Einzelschritte ausführst funktioniert alles, aber falls du den Code durchlaufen läst stürtzt Bochs/der PC ab?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 22. October 2005, 08:20 »
Jep, genau so.

Nooooooooooos

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #31 am: 22. October 2005, 20:31 »
Habt ihr denn alle in euerem OS schon Interrupts ?
Hat es bei euch geklappt ?
Kann es sein, dass der Fehler ausserhalb vom IDT-Zeugs liegt ?

Gruss
Dominik

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 22. October 2005, 20:50 »
hi,
also mein OS hat schon eine IDT und Interrupts, ich hatte auch nie wirklich Probleme damit. Ich initialisiere meine IDT auch erst im PMode.
Du musst auch drauf achten, dass "lidt [ds:xx]" wirklich die IDT-Adresse bilden, nicht dass sich DS und ein entsprechender ORG Befehl in die Quere kommen !

Wenn du nicht weiterkommst, kann ich dir ja mal ein wenig von meinem IDT Code zeigen/hier posten.

cu,
stefan2005

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #33 am: 23. October 2005, 09:48 »
Ähm, ja ich wäre vieleicht mal froh um einen einzelnen Eintrag in deiner IDT und um das ganze Zeugs um die Adressen und die "Anmeldung" der IDT. Dann könnt ich ihn mal mit meinem Code verglichen.

Gruss
Nooooooooos

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #34 am: 23. October 2005, 15:48 »
hi,
ok, hier die wichtigsten Funktionen meiner IDT.
"InitIDT" rufe ich erst auf, nachdem ich in den PMode geschalten hab.
ist jedoch in Delphi Langauge bzw halt Pascal geschrieben, sollte aber verständlich sein :)


type
  TIDTR = packed record
    Limit : Word;
    BaseAddr : Cardinal;
  end;
  TIDT = packed record
    Offset_Low : Word;
    Segment : Word;
    Attributes : Word;
    Offset_High : Word;
  end;

var IDTR : ^TIDTR = Pointer($B000);
    gIDT : Array of TIDT = Pointer($B006);

procedure InitIDT;
begin
  IDTR.Limit := 256*SizeOf(TIDT)-1;
  IDTR.BaseAddr := $B006;
  asm
    lidt [$B000]
  end;
end;

procedure RegisterIDTEntry(IntNumber: Word;ProcPointer: Pointer;DPL: Cardinal);
var Attributes : Word;
begin
  If DPL = 0 then Attributes := $8E00
  Else If DPL = 1 then Attributes := $AE00
  Else If DPL = 2 then Attributes := $CE00
  Else Attributes := $EE00;
  gIDT[IntNumber].Offset_Low := (Integer(ProcPointer) AND $FFFF);
  gIDT[IntNumber].Offset_High := (Integer(ProcPointer) SHR 16);
  gIDT[IntNumber].Segment := $8;
  gIDT[IntNumber].Attributes := Attributes;
end;

Wenn du noch Fragen hast, auch bzg. des Codes kannst du sie ruhig stellen.

cu,
stefan2005

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #35 am: 23. October 2005, 17:34 »
Ja also zuerst mal, wie bindet man den Delphi-Code ein ??? Und kannst du mal einen einzelnen Eintrag in der IDT posten ?? Und was für Label musst du in und um die IDT hinmachen ? Und oder in Delphi folgt nach ":" Kommentar.

Vielen Dank
Noooooooooos

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #36 am: 24. October 2005, 12:27 »
Also, ich finde das irgendwie komisch, denn im Debugger arbeitet das Programm wie gewünscht, aber sonst nicht. Weiss wirklich niemand, an was das liegen könnte ??????

Vielen Dank
Noooooooooos

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #37 am: 24. October 2005, 17:10 »
Ähm, das ist jetzt vieleicht eine blöde Frage, aber wenn ich als Selektor in der IDT den zweiten Eintrag (nach dem null-Deskriptor) muss ich in der IDT 8 oder 16 oder 2 oder 4 schreiben ?

Reicht der Stack vom Real-Mode auch im PM. Könnte das Problem daran liegen, dass nach dem "iret" im Stack nicht die richtige Adresse gnommen wird.

Und wie soll ich den Timer einschalten, mit welcher Frequenz?

Danke
NOOOOOOOOOOOOOOOS

 

Einloggen