Autor Thema: Sektoren von Floppy Disk laden  (Gelesen 20220 mal)

ehenkes

  • Gast
Gespeichert
« am: 05. July 2009, 22:35 »
    ; set parameters for reading function
    ; 8-bit-wise for better overview
    mov dl,[bootdrive] ; select boot drive
    mov al, 63         ; read n sectors (max. 63!!!)
    mov ch,  0         ; cylinder = 0
    mov cl,  2         ; sector   = 2
    mov dh,  0         ; head     = 0
    mov ah,  2         ; function "read"
    int 0x13         
    jc load_kernel     ; trouble? try again

Damit lassen sich maximal 63 Sektoren des Kernels, also 63*512 Byte = 0x7e00 Byte laden. Liegt das daran, dass der bootsektor bei 0x7c00 liegt. Wie kann man diese Grenze überkommen?
Kernel wird nach 0x8000 geladen. 


stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 05. July 2009, 23:12 »
per engl. Wikipedia (http://en.wikipedia.org/wiki/INT_13#INT_13h_AH.3D02h:_Read_Sectors_From_Drive) werden da nur 6 bit verwendet. Schonmal versucht einfach mehrmals den Code zu durchlaufen und eben bei höherem Sektor anzufangen?
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 06. July 2009, 23:27 »
Eigentlich normale BIOS Programmierung.

Du hast dir das ausgesucht. Wenn du dich damit nicht beschäftigen willst, steig auf GRUB um.  :wink:
Dieser Text wird unter jedem Beitrag angezeigt.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 07. July 2009, 01:08 »
Also erstmal: Wenn du bei 63 Sektoren/Track bist, dann hast du eine Festplatte vorliegen und keine Diskette. Die haben in der Tat nur 18 Sektoren (oder eine andere Zahl, gibt ja unterschiedliche Disketten). Das heißt du musst bereits bei 18 den Head erhöhen.

Warum findet man eigentlich keinen Link auf einen brauchbaren Bootloader? Bin ich der Erste, der einen Kernel mit über 63*512 = 32256 Byte mit eigenem Bootloader laden will?  :?
Du hast dir die API ausgesucht. Was kann das Internet dafür? Du musst einfach die nachfolgenden Sektoren lesen. Die Funktion ist hier dokumentiert: http://www.ctyme.com/intr/rb-0607.htm
« Letzte Änderung: 07. July 2009, 01:13 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 07. July 2009, 09:29 »
Zitat
Sag mir lieber, ob ich bei 63 Sectors anschließend die Heads von 0 auf 1 erhöhen muss oder die Cylinder?

Hi,

Kannst doch LBA 64 in CHS umwandeln. Hab dafür ne Funktion in Assembler geschrieben falls du die brauchst. Ansonsten gehts auch manuell.

http://lowlevel.brainsware.org/wiki/index.php/LBA

PS: Meine Funktion hat für Sektor 64 folgendes ausgerechnet:

C = 1
H = 1
S = 11

PPS: Also meine Funktion kann auch ohne Probleme Sektor 64 oder auch Sektor 80 auslesen :)
« Letzte Änderung: 07. July 2009, 09:45 von Cjreek »
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 07. July 2009, 21:19 »
Zitat
Most BIOSes support "multitrack" reads, where the value in AL exceeds the number of sectors remaining on the track, in which case any additional sectors are read beginning at sector 1 on the following head in the same cylinder;
Daher klappt das auch mit Werten über 18 (bis max. 63). BIOS rechnet das freundlicherweise um.
"most" bedeutet offensichtlich: Es existieren BIOSe, die das nicht tun. Keine Ahnung, ob die eine Rolle spielen, aber sicherer ist es wohl, sich selber drum zu kümmern.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 07. July 2009, 22:50 »
Hi,

Also ich würde dir empfehlen die CHS Werte selbst auszurechnen und dem Interrupt direkt die richtigen Werte zu übergeben. Bei mir funktioniert das wunderbar.

Habe gerade versucht mit dieser Methode 70 Sektoren ab Sektor 1 (= 2. Sektor) zu lesen und das war kein Problem.

Lg
Cjreek
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 08. July 2009, 11:47 »
Ich bräuchte da mal ein Vorbild eines anderen Bootloaders, um zu sehen, ob ich das mit dem mehrfachen Floppy-Lesen richtig mache (verwende momentan allerdings nur Bochs, sollte also vom Prinzip her fehlerfrei klappen)
Entschulding, dass ich so dreist bin das zu sagen, aber da es Bootloader wie Sand am Meer gibt, wirst du mit google sicherlich einen finden der das tut.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 09. July 2009, 23:20 »
Hi,

Falls ich dich richtig verstehe.. Du könntest dann halt immer 128 Sektoren auf einen Schlag lesen und dann die CHS werte für den 129. zu lesenden Sektor berechnen und dann ab da weitere 128 Sektoren lesen etc.

Oder hab ich dich falsch verstanden?

Gruß
Cjreek
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 10. July 2009, 07:52 »
Mh die Sache klingt interessant. Ich werd mich am Wochenende mal damit befassen.  :-)
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 11. July 2009, 11:59 »
Warum liest du nicht einfach immer einen Sektor auf einmal?
Dieser Text wird unter jedem Beitrag angezeigt.

Cjreek

  • Beiträge: 104
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 11. July 2009, 15:05 »
Hi,

Also ich kopiers einfach mal hier rein. Vielleicht hilfts dir ja:

  floppy_reset:
      xor ax,ax
      xor dl,dl
      int 13h
      jc floppy_reset ; wenns nicht geklappt hat nochmal versuchen
    ret
   
    ;[DESC]  Konvertiert eine LBA Sektorangabe in das CHS Format
    ;        Siehe --> http://lowlevel.brainsware.org/wiki/index.php/LBA
    ;
    ; [IN]     #1 = Linearer Sektor (#1 = 1. Stackparameter)
    ; [OUT]  ax = Pointer zu einer CHS struktur
    lba_to_chs:
      push bp
      mov bp, sp
   
      mov ax, [bp+0x04]
   
      xor dx,dx
      mov cx,36
      div cx
      mov [0xD000],ax ; = C
     
      mov ax,dx
      xor dx,dx
      mov cx,18
      div cx
      mov [0xD002],ax ; = H
     
      inc dx
      mov [0xD004],dx ; = S
       
      mov ax,0xD000
      pop bp
    ret 2

    ; [IN]    #1  = Startsektor (LBA Format => linear)
    ;         #2 = Anzahl der zu lesenden Sektoren
    ;       
    ;         #3  = Zieldatensegment
    ;         #4  = Offset
    _floppy_read: 
      push bp
      mov bp, sp
   
      floppy_reset
   
      lba_to_chs word [bp+0x04]
       
      mov ch, byte [0xD000]    ; Zylinder nach ch
      mov dh, byte [0xD002]    ; Kopf nach dh
      mov cl, byte [0xD004]    ; Sektor nach cl 
   
      mov al,byte [bp+0x06]    ; Anzahl der Sektoren die gelesen werden sollen nach AH
   
      mov dl, 0    ; Diskettenlaufwerk = 0
   
      mov bx, word [bp+0x08]
      mov es, bx
   
      mov bx, word [bp+0x0A]
   
      mov ah, 0x02 
      int 13h     
   
      pop bp
    ret 8

Ich habe mir dann für floppy_read ein Makro definiert:

%macro floppy_read 4
    push %4  ; Offset
    push %3  ; Zielsegment
    push %2  ; Count
    push %1  ; Sektor  (LBA)
    call  _floppy_read
%endmacro

Das ganze kann man dann so aufrufen:

floppy_read 0, 1, 0xFFFF, 0x0010 ; Sektor 0 an Adresse 0x100000 (1MB) lesen 
das ganze kann man natürlich auch inne schleife packen.. muss halt immer den ersten parameter hochzählen und die Adresse um 512 Bytes erhöhen..

Lg
Cjreek
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 11. July 2009, 15:33 »
Nun fehlt nur noch der Super-Algo, der dies in einer Schleife sektorenweise erledigt.


; input:
;    di - number of sectors
;    bx - segment
;    ch, dh, cl - cylinder, head, sector
read:
.next:

mov es, bx
xor bx, bx
.again:
mov dl, [bootdrive]
mov ax, 0x0201
int 0x13
jc .again

inc cl
cmp cl, 19
jl .foo
mov cl, 1

inc dh
cmp dh, 2
jl .foo
mov dh, 0

inc ch
cmp ch, 80
jae .error

.foo:
mov bx, es
add bx, 512/16

sub di, 1
jnz .next

.done:
ret

Das Label .foo ist vielleicht etwas blöd benannt, aber da kann man nix machen^^
Dieser Text wird unter jedem Beitrag angezeigt.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 11. July 2009, 17:59 »
Ich glaube, GRUB ist das herzlich egal. Es kostet nur dich selbst Zeit, gegen Windmühlen zu kämpfen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 11. July 2009, 20:58 »
Ich finde Assemblerprogrammieren sollte den Eliten vorbehalten sein. Der Code ist nicht genial, und er funktioniert nur in gewissen Grenzen. (Die nur ich und das liebe BIOS kennen.) Aber viel Spaß beim Bugs suchen, sobald der Code nicht mehr funktioniert ^_^
Dieser Text wird unter jedem Beitrag angezeigt.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 11. July 2009, 21:55 »
Ja, und warum kannst du deinen 64 KB Kernel nicht nach 0x8000 laden? Mein Code hat damit nichts zu tun. Ich will mal einen Tipp geben: Du kannst ihn auch nicht nach 0xfe00 laden ^^ Achja fairerweise noch ein Tipp: DMA hat damit nix zu tun.

Der schuldige Code ist natürlich in diesem Beitrag, sonst wärs ja gemein^^

btw: Wer sagt, dass ich nicht bei c-plusplus.de angemeldet bin?^^

« Letzte Änderung: 11. July 2009, 22:04 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 11. July 2009, 22:40 »
Menno, du hast es ja schon raus ...  8-) Ich hatte extra schon etwas vorbereitet um meine 1337ness allen unter die Nase zu reiben ^_^

Ja, ich denke da unten ist der Stack relativ gut aufgehoben. Die untere Grenze wäre dann das Ende der BDA also 0x0500. Wenn du da angekommen bist, hast du soviel Unfug auf den Stack gelegt, dass dir das hoffentlich selbst auffällt^^

Wenn du BDA und IDT mit dem Stack brutalst überschreibst, hast du übrigens wieder das selbe Problem ;)
« Letzte Änderung: 11. July 2009, 22:50 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 11. July 2009, 23:09 »
Zitat
Es kostet nur dich selbst Zeit, gegen Windmühlen zu kämpfen.
Das Thema "Kernel nachladen" ist doch nun erfolgreich abgehakt.
Nicht, wenn du den Bootloader ernsthaft benutzen willst. Du hast jetzt ein paar Sektoren von der Diskette gekratzt, mehr nicht.

Wie sieht es zum Beispiel aus mit... vernünftigen Binärformaten für den Kernel (flache Binaries machen nicht lang Spaß)? ...vom Bootloader geladenen Modulen (brauchst du für einen Mikrokernel)? ...Zugriff auf Dateisysteme (alles andere ist ziemlich doof zu benutzen, wenn du mal mehrere Dateien laden kannst)?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 12. July 2009, 01:29 »
Also lass mich noch ein wenig im "Dreck" spielen.  :-) 
Klar. Aber wenn du von abgehakt redest, wollte ich dir nur mal zeigen, dass der Dreck noch lange nicht ausgeht. :)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 12. July 2009, 01:36 »
fremdes Fertigprodukt
Bloß weil das BIOS wenig intuitiv und wenig konsistent ist, und nur einen geringen Umfang hat, ist es nichtsdestotrotz ein "fremdes Fertigprodukt".
« Letzte Änderung: 12. July 2009, 01:38 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen