Autor Thema: Kernel wird nicht mehr geladen...  (Gelesen 4905 mal)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« am: 29. March 2006, 16:25 »
Hi
Ich habe für mein OS eine kleine Konsole geschrieben, um den code zu testen, den ich schreibe (z.B. Treiber)

Jedenfalls lade ich jetzt beim booten nicht 32Sektoren, sondern 40.
ABER, seit dieser kleinen änderung im bootloader gibts ein Problem.

Unter Bochs läuft alles so, wie es soll, aber jetzt wollte ich es auf einem Echten PC testen, und das geht nicht.:
Das Disketttenlaufwerk (bzw der Motor) ist aktiv, da das lämpchen läuchtet, aber sonst tut sich NICHTS!!
woran liegt das?? an den 40 Sektoren, am BIOS, ...??

hier mal der Codeausschnitt:
loadkernel:
   ; Diskdrive reset (Interrupt 0x13,0)
   push ds      ; Sichere DS
   mov ax, 0      ; Funktion 0 (reset)
   mov dl, [bootdrv] ; Dieses Laufwerk ist gewünscht (bootlaufwerk)
   int 0x13      ; Interrupt ausführen
   pop ds      ; DS wiederherstellen
   jc loadkernel    ; Geht nicht? -> Noch mal!

  load1:
   mov ax, 0x1000    ; ES:BX = 1000:0
   mov es, ax
   mov bx, 0

   ; Sektoren lesen (Interrupt 0x13, 2)
   mov ah, 2      ; Funktion 2 (Lesen)
   mov al, 40      ; Lese 40 Sektoren (0x0000 -> 0xxxx) !!ICH HABE NUR DIE ZAHL GEÄNDERT
   mov cx, 2      ; Cylinder=0, Sector=2
   mov dx, 0      ; Head=0, Lauferk=0
   int 0x13      ; ES:BX = Daten vom Laufwerk
   jc load1      ; Fehler? -> Noch mal!

   retn


Ich hoffe ihr könnt mir helfen...

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 29. March 2006, 18:18 »
hi, hier im forum hat mir mal jemand den tipp gegeben, dass manche Bios' nicht über track-grenzen hinweg sachen von diskette lesen können. möglicherweise kann dein bios dies, aber dafür nicht über zylinder-grenzen hinweg lesen.
probier einfach mal, das laden des kernels von diskette in zwei teile aufzuteilen. beim ersten  35 sektoren (einer weniger als ein zylinder, weil du bei sektor zwei beginnst) lesen, beim zweiten den rest (bis zu 36):

load1:
   mov   ax, 0x1000    ; ES:BX = 1000:0
   mov   es, ax
   mov   bx, 0

   ; Sektoren lesen (Interrupt 0x13, 2)
   mov   ah, 2         ; Funktion 2 (Lesen)
   mov   al, 35        ; Lese 35 Sektoren (0x0000 -> 0xxxx)
   mov   cx, 2         ; Cylinder=0, Sector=2
   mov   dx, 0         ; Head=0, Lauferk=0
   int   0x13         ; ES:BX = Daten vom Laufwerk
   jc   load1         ; Fehler? -> Noch mal!

load2:  
   add   bx, 512*35  ; zieladresse um 512 bytes je sektor erhöhen

   ; Sektoren lesen (Interrupt 0x13, 2)
   mov   ah, 2         ; Funktion 2 (Lesen)
   mov   al, 5        ; Lese 5 Sektoren
   mov   cl, 1         ; Sector=1
   mov   ch 1         ; Cylinder=1
   mov   dx, 0         ; Head=0, Lauferk=0
   int   0x13         ; ES:BX = Daten vom Laufwerk
   jc   load2         ; Fehler? -> Noch mal!


müsste funktionieren. ansonsten probier mal, das ganze jeweils in tracks aufzuteilen. (das wären dann jeweils 18 sektoren)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #2 am: 29. March 2006, 18:26 »
Vielen Dank;
werd es mal ausprobieren.

 

Einloggen