Autor Thema: Floppy-Treiber: IRQ6 blockiert?  (Gelesen 7183 mal)

ChristianH

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« am: 23. April 2011, 18:51 »
Hallo,

ich hab mein Problem ja im IRC schon öfter angesprochen. Nachdem ich FAT ansatzweise hab, bin ich nun am FDC-Treiber. Mein eigener war eigentlich fertig, hat aber auch nach 1 Monat Fehlersuche nicht auf einem echten Rechner funktioniert. Deshalb hab ich nun zu einem fertigen Modul gegriffen von NeptuneOS, welches auch PrettyOS verwendet, und das für mein OS umgeschrieben. Während des Bootens funktioniert dieser auch hervorragend auf sowohl auf einem Emulator, als auch auf echter Hardware. Also man kann davon ausgehen, dass der funktioniert. Jedoch nachdem meine Shell gestartet ist und ich zum Beispiel von der FAT aus einen Sektor zum Analysieren lesen möchte, kommt bei keinem FDC-Befehl mehr ein IRQ6 zurück, dementsprechend hängt das System an der Stelle, da auf den IRQ6 gewartet wird.

Ein gutes Beispiel ist beim Seek. Im MSR kann man ja auslesen, ob der noch seekt und da habe ich gesehen, dass auch wenn der nicht mehr seekt und der IRQ6 in jedem Fall gesendet werden müsste, keiner kommt. Er wird also irgendwie blockiert. Aber ich sende nach jedem der 16 IRQs ein EOI, der IRQ6 sollte meiner Meinung nach nicht maskiert sein, da ich dies nirgends mache und ein cli kann auch nicht Schuld sein, denn ein IRQ1 zum Beispiel kommt noch sauber durch.

Nun frage ich mich natürlich, wieso der IRQ6 anscheinend von der Shell mit einem Syscall aus nicht mehr ankommt, obwohl der während des Bootens noch funktionierte.

MfG
ChristianH

FlashBurn

  • Beiträge: 844
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 23. April 2011, 21:21 »
Was heißt bei dir Syscall oder anders gefragt wie wird solch ein Syscall gemacht? Weil es oft so ist dass, kommt drauf an welche Methode du benutzt, die IRQs deaktiviert werden (also wie cli).

ChristianH

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 23. April 2011, 21:52 »
Also bei einem Syscall ruft meine Shell eine Funktion auf, welche die nötigen Parameter in die Register schreibt, dann meinen Syscall-ITR 0x30 aufruft. In meiner IDT ist der Syscall natürlich als RING3 gekennzeichnet. Dann werden in meiner ISR nur alle Register gesichert und eben zu dem C-Teil meiner ISR gesprungen. Dort wird vom Interrupt mit einem switch unterschieden und das ausgeführt, was unter meinem Syscall Eintrag steht (meine Syscall-Funktion, die dann die aufgerufenen Funktionen aufruft). Also ich deaktiviere die eigentlich nirgends. Aber bei meiner Syscall-Funktion mache ich eh nochmal ein explizites sti, damit wirklich alles funktionieren kann.

FlashBurn

  • Beiträge: 844
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 24. April 2011, 07:47 »
Ich meinte eigentlich ob du einen Interrupt benutzt und was für eine Art von Interrupt das ist, aber das kann ja eigentlich nicht das Problem sein, wenn du ein sti machst.

ChristianH

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 24. April 2011, 18:27 »
Ganz recht, langsam verzweifle ich, denn es ist ein für mich nicht logisches Problem. Anscheinend wird tatsächlich dieser IRQ6 selber blockiert, obwohl er beim Boot vorher noch funktionierte. Und beim Emulator funktioniert er durchgehend, das verwirrt mich. Wenn der beim Emulator in der Shell nicht funktionieren würde, könnte man gezielt schauen, aber so, dass der nur bei einem Aufruf durch die Shell und nur bei echter Hardware blockiert ist, seltsam

FlashBurn

  • Beiträge: 844
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 24. April 2011, 20:27 »
Ich habe mich leider noch nicht wirklich mit dem FDC auseinander gesetzt, aber es könnte auch ein Timingproblem sein, da es die für gewöhnlich unter einem Emu nicht gibt.

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #6 am: 25. April 2011, 01:36 »
Moin,

ein ähnliches Problem hatte ich auch mit meinem Floppy-Treiber. Da ich auch keine Lösung gefunden habe, habe ich alle wait_irq()'s durch statische Timeouts ersetzt. Das hat auf allen Testrechnern ziemlich gut funktioniert.

Nur damit du weißt, dass du nicht der einzige mit dem Problem bist. ;)

Grüße,
LittleFox

ChristianH

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 25. April 2011, 23:03 »
Da bin ich beruhigt. Nur leider verzögert dies doch sehr stark oder?  Nunja, ich werde es selber mal probieren und hoffen, dass ich da ein optimum raushole. Danke für den Tipp.

gargyle

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 18. August 2011, 21:49 »
Problem gelöst ?

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #9 am: 18. August 2011, 22:28 »
also bei mir zumindestens nicht - hab aber auch gerade andere baustellen

grüße,
LittleFox

freecrac

  • Beiträge: 86
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 19. August 2011, 10:15 »
Hallo, vieleicht ist dieses hier hilfreich.
        
Fred: This is my newly modified floppy diskette bootsector:
http://groups.google.com/group/comp.lang.asm.x86/msg/211e65725c60711b?hl=de&&q="This+is+my+newly+modified+floppy+diskette+bootsector"

loc0010
; Delay for 3 seconds so floppy drive
----------------------------------------
; can spin down before we disable interupts
        xor     cx,cx
        xor     dx,dx
        mov     byte ah,0x01
        int     0x001A

loc0020 xor     ah,ah
        int     0x001A
        cmp     word  dx,0x0037         ; 0x0037 = 55 clock ticks (3
secs)
        jl      loc0020
; End Delay

Mike Gonta benutzt eine etwas andere Verzögerungsmethode:
http://groups.google.com/group/comp.lang.asm.x86/browse_thread/thread/c6f2f92747e32cb6/d64b7749af80f7c5?hl=de&lnk=gst&q=The+following+code+written+in+Nasm+"the+Neutral+Assembler"%2C+assembles#d64b7749af80f7c5
mov ebp, 650000      ; approximately 1 second delay
.11
  out 0EDh, al         ; non existing port for delay
  dec ebp
  jne .11

Dirk

gargyle

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 19. August 2011, 16:32 »
Die Befehlsfolge die an den FDC geschickt wird wäre recht hilfreich.

 

Einloggen