Autor Thema: Timer Interrupt  (Gelesen 17455 mal)

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« am: 10. October 2005, 12:56 »
Hallo

Ich bins nochmal. Wenn ich diesen Code mit Bochs, oder Diskette probiere, dann blinkt Bochs oder der Computer Schaltet sich aus. ;16 Bit Code erstellen
jmp start ;GDT überspringen

NULL_Desc:
dd 0
dd 0

CODE_Desc:
dw 0xFFFF ;Segmentgröße Byte 0/1
dw 0 ;Segmentbasisadresse Byte 0/1
db 0 ;Segmentbasisadresse Byte 2
db 10011010b ;Zugriffsberechtigungen
db 11001111b ;Zusatz + Segmentgröße Bits 16 - 19
db 0 ;Segmentbasisadresse Byte 3


DATA_Desc:
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0

gdt:
Limit dw 0 ;Größe der GDT (wird später eingetragen)
Base dd 0 ;Adresse der GDT (wird später eingetragen)
idt:
Limite dw 0 ;Größe der GDT (wird später eingetragen)
Basiis dd 0 ;Adresse der GDT (wird später eingetragen)
IDTAnfang:
                                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0

                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0

                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0

                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0


                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0

                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0
                    dw Handler, 8, 8E00h, 0

IDTSchluss:
start:

cli

;Interrupts ausschalten

mov eax, cs ;EAX auf derzeitiges Codesegment setzen
mov ds, ax ;DS auf Codesegment setzen

shl eax, 4 ;EAX mit 16 multiplizieren (Lineare Adresse
;des Codesegments errechnen)
mov [CODE_Desc+2], ax ;Lineare Adresse des Codesegmentes als
mov [DATA_Desc+2], ax ;Startadresse des Code- und Datendeskriptors
shr eax, 16 ;eintragen
mov [CODE_Desc+4], al
mov [DATA_Desc+4], al

mov eax, cs ;Startadresse der GDT errechnen
shl eax, 4
add eax, NULL_Desc

mov [Base], eax ;Startadresse der GDT eintragen
mov [Limit], WORD gdt - NULL_Desc -1 ;Größe der GDT errechnen und eintragen

lgdt [gdt]
mov eax, cs
shl eax, 4
add eax, [IDTAnfang]
mov [Basiis], eax
mov eax,[IDTSchluss]
sub eax,[IDTAnfang]
mov [Limite],eax ;Größe der IDT errechnen und eintragen

lidt [idt] ;GDT laden

mov eax, cr0 ;In den Protected Mode schalten,
or eax, 1 ;indem Bit 0 des CR0 Registers auf 1
mov cr0, eax ;gesetzt wird

db 0xea ;FAR-JUMP zum Codesegment
dw PMODE
dw 0x8


[BITS 32] ;32 Bit Code erstellen

PMODE:
mov WORD [CODE_Desc+2], 0 ;Code Segmentstartaddresse auf 0 setzen
mov WORD [DATA_Desc+2], 0 ;Daten Segmentstartadresse auf 0 setzen
mov BYTE [CODE_Desc+4], 0 ;Code Segmentstartaddresse auf 0 setzen
mov BYTE [DATA_Desc+4], 0 ;Daten Segmentstartadresse auf 0 setzen

mov eax, 2 ;Selektor für das Datensegment erstellen
shl eax, 3

mov ds, ax ;Daten- Stack- und Extrasegment mit
mov ss, ax ;Datensegmentdeskriptor laden
mov es, ax
mov eax, 0 ;FS und GS mit Null-Deskriptor laden
mov fs, ax
mov gs, ax
mov esp, 0x1FFFFF ;Stack auf unterhalb der 2 MB Grenze setzen
    mov al,011h                     ; IRQ umleiten auf 20h damit keine Fehler ausgelöst wird.
                    out 020h,al
                    out 0A0h,al

                    mov al,20h
                    out 021h,al
                    mov al,28h
                    out 0A1h,al

                    mov al,4
                    out 021h,al
                    mov al,2
                    out 0A1h,al

                    mov al,1
                    out 021h,al
                    out 0A1h,al

sti

PMODE2:

jmp 0x8:0x10000 + PMODE2
Handler:
    mov al,020h
                    out 020h,al
                    out 0A0h,al

iret
jmp Handler


Was ist daran falsch. Ich weiss nicht mehr weiter denn im Internet hat es nirgends ein Tutorial das nur eine IDT anlegt. Kann es sein, dass irgendwo im Code eine Exeption ausgelöst wird ? Bitte helft mir ich finde im Netz wirklich nichts und Englisch ist nicht so meine Sprache.

GROSSEN DANK
Dominik

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 10. October 2005, 14:38 »
Zitat von: nooooooooos

Ich bins nochmal.

Und hoffentlich nicht das letzte mal. ;)
Zitat von: nooooooooos

Wenn ich diesen Code mit Bochs, oder Diskette probiere, dann blinkt Bochs oder der Computer Schaltet sich aus.

Also wenn du es mit Bochs machst, dann blinkt Bochs (was ist damit gemeint?) und wenn du es am Real-PC machst, dann geht der aus (rebootet warscheinlich), richtig?
Zitat von: nooooooooos

Was ist daran falsch.

Das ist eine gute Frage, die recht schwer zu beantworten ist. Versuch doch einmal, die Fehlerstelle mit "JMP $" zu ermitteln. Also da ein "JMP $" am Anfang einbauen und schauen, obs noch klappt. Wenn ja, dann das "JMP $" nach die nächste Anweisung oder so. So lange, bis das Problem auftritt. Dann weiß man, wo es ist und kann besser schauen, was nicht stimmt.
Zitat von: nooooooooos

Ich weiss nicht mehr weiter denn im Internet hat es nirgends ein Tutorial das nur eine IDT anlegt. Kann es sein, dass irgendwo im Code eine Exeption ausgelöst wird ? Bitte helft mir ich finde im Netz wirklich nichts und Englisch ist nicht so meine Sprache.

Bitte nicht so winseln, das hört sich ja erbärmlich an. ;) Wir sind ja dafür da, dass wir helfen und uns geholfen wird.
http://www.osdever.net/tutorials.php?cat=5&sort=1
Da gibt es Tutorials, allerdings Englisch...

Wie gesagt, steck mal den Fehler ab, dann haben wir ihn sicher gleich. :)
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 10. October 2005, 14:50 »
Also

Mit dem Blinken von Bochs mein ich einen Neustart. Das " jmp $ " funktioniert bis zum sti. Von da an nüzt es nichts mehr, weil dann warscheninlich der Timer Interupt anfängt zu "timern".

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 10. October 2005, 17:23 »
Hast du mal mit dem Bochs-Debugger geschaut, was genau passiert? Wohin springt er denn nach dem STI?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 10. October 2005, 17:26 »
Gute Idee !!

Aber wie geht das mit dem Debugger. Kannst du mir das mal kurz erklären ???

Danke

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 10. October 2005, 17:34 »
Also in meinem ganz extrem kurzen Bochs-Tutorial(http://www.chris-soft.de/tutorials/bochs/) (auf Deutsch) habe ich die wichtigsten Funktionen kurz erklärt, ist wirklich kurz genug, um einen schnellen Einblick zu kriegen.

Ansonsten frag einfach weiter.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 10. October 2005, 18:16 »
Wenn ich meine Bochs-Konfigurationsdatei mit dem Debugger starte, meldet Bochs :"directive C not understood :" Diese Meldung kommt aber nicht wenn ich den normalen Bochs starte.

Wenn ich allerdings den Debugger starte und meine Kon.. Datei übers Menu auswähle geht es. Wenn ich dann mit "lb" eine Adresse eingebe und c drücke dann kommen hunderte Zeilen von "CPU Loop" Und das "Computer Fenster" von Bochs blinkt nicht wie es das im normalen Bochs Betrieb würde. Was bedeutet das ???


Danke

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 11. October 2005, 05:20 »
Also die Meldung "CPU_LOOP 1" habe ich auch schon öfter zu sehen gekriegt. Passiert in der Regel, wenn man in einem Speicherbereich landet, der (a) nicht existiert (weil Adresse zu hoch) oder (b) nur noch voll mit Nullen steht, also kein richtiges Programm mehr enthält.

Setze deinen Breakpoint vorher an oder gehe direkt im Einzelschritt durch den Code, da stimmt schon vorher was nicht.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 11. October 2005, 08:26 »
Wenn ich den Code ab Anfang in Einzelschritten durchgehe, dann sehe ich Befehle die ich nie geschrieben habe. Was bedeutet denn das ??

Vielen Dank
Dominik

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 11. October 2005, 08:33 »
Tja, das ist mir auch schon passiert - passiert jedem mal. Also entweder bist du bei einer falschen Adresse gelandet (beobachte mal beim Debuggen die Adresse zu Beginn der Zeile), oder du überschreibst dir irgendwo deinen eigenen Code.

Plan B: Gib uns mal das kompilierte Objekt, ist ja nicht so groß, oder? Dann debugge ich das mal selbst.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 11. October 2005, 09:01 »
Die Dateien kannst du dir  hier herunterladen.

Vielen Dank
Dominik

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 11. October 2005, 11:42 »
Hi,
also ich bin noch nicht zum Debuggen gekommen, aber mir ist ein Fehler aufgefallen:

Zitat von: nooooooooos

Limite  dw      0
Basiis  dd      0

[...]

mov [Basiis], eax
mov eax,[IDTSchluss]
sub eax,[IDTAnfang]
mov [Limite],eax


Das kann so natürlich nicht funktionieren: Zuerst schreibst du die vier Byte "Basiis" und anschließend weitere vier (!) Byte "Limite", dabei ist das Limit nur mit zwei Bytes definiert. Du überschreibst also zwei Bytes der Basis.

Schau mal, ob du so weiter kommst, ansonsten schau ich nochmal.

Gruß!

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 11. October 2005, 13:57 »
Also diesen Fehler verbessere ich so:


Limite dw 0
Basiis dd 0

[...]

xor           ax,ax
mov eax, cs
shl eax, 4
add eax, [IDTAnfang]
mov [Basiis], eax
xor           ax,ax
mov         ax,[IDTSchluss]
sub ax,[IDTAnfang]
mov [Limite],ax
lidt [idt]



Das Programm läuft allerdings immer noch nicht korrekt.

Gruss
Dominik

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 11. October 2005, 14:04 »
Wäre gut, wenn du die Zeile angeben könntest, ab der in Bochs nicht mehr das passiert, was in deinem Code passieren soll (also Debuggen und die entsprechende Zeile hier angeben), das wäre für mich einfacher.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 11. October 2005, 14:44 »
Wenn ich die Datei debugge dann komme ich (noch im Bootloader) bis zu "0x7c38" Dort beginnt die Schleife, welche das Wort "Loading..." schreibt. Sobald das Wort fertig geschrieben ist und ich in bochsdbg "s" drücke kommt CPU Loop. Wiso?

Vielen Dank
Dmk

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 11. October 2005, 16:01 »
Vor heute Abend komme ich nicht dazu, dann werde ich mich aber mal drum kümmern. Ich melde mich dann.

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 11. October 2005, 19:48 »
Kannst du mal die aktuellste Version ins Verzeichnis stellen und Bescheid geben?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 12. October 2005, 08:37 »
Jetzt wär die aktualisierte Version drauf.

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 12. October 2005, 18:28 »
Hi,

nimm's mir nicht übel, aber das Image in deinem Verzeichnis kann UNMÖGLICH dem Kernel-Source entsprechen, den du da mit rein gepackt hast.

Der erste JMP-Befehl im Kernel stimmt noch, aber was danach in Bochs zum Debuggen bereit steht ist auch exakt das, was ich im Hex-Editor in deinem Image an der entsprechenden Stelle finde.

Fazit: Ich komme nicht weiter.

Gruß.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 13. October 2005, 07:46 »
Ah habe vieleicht vergessen zu sagen, dass im Image vor dem Kernel noch der Bootloader kommt. Den Code ist auch im Verzeichnis.

Dmk

 

Einloggen