Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Cheebi am 20. June 2007, 23:18
-
Hi leute,
ich habe meinen Disketten-Treiber umgeschrieben in Assembler (vorher C) weil ich dachte, ich könnte dadurch die Performance verbessern. Nun muss ich feststellen, dass auch in Assembler zu lange gebraucht wird, einen Sektor zu laden. Woran kann das liegen?
Mein Loader (Stage 2) lädt die Kerneldatei, die immerhin 49KB groß is, innheralb von vielleicht 4 Sekunden. Im Loader (16Bit-Code) benutze ich den BIOS-Int, der Sektoren liest (also keine Tracks!); meine eigengeshriebene Routine für das Lesen von Sektoren ist aber zu langsam (49KB -> 33 Sec). Woran liegt das? Wie genau lädt das BIOS die Sektoren? Wie lange brauchen eure Disketten-Treiber 98 Sektoren zu lesen?
Danke,
Cheebi
-
Gratuliere zur Erkenntnis, daß Assembler keinen wesentlichen Unterschied in der Geschwindigkeit macht - oder wenn, dann in die falsche Richtung. ;)
-
Wie ließt du denn die Sektoren? DMA, direkter Portzugriff? Direkte Portzugriffe sind schneller als der DMA allerdings werden dadurch sehr viele IRQs aufgerufen (für jedes Byte iirc), was die Performance von Multitasking Systemen schlecht beeinflusst. (In heutigen Systemen mit 3+ ghz wird das aber wsl. fast keinen Unterschied machen)
-
@taljeth: Den Geschwindigkeitsvorteil beim Lesen von Sektoren merkt man da natürlich nicht. Ein gut geschriebenes ASM Programm ist aber schneller als eines in einer Hochsprache. Nur sind die Geschwindigkeitsvorteile so gering, das man es erst bei recht großen Programmen merkt (die dann jedoch oft sehr kompliziert werden und man ASM nicht mehr verwenden möchte). Was meinst du mit falscher Richtung?
@Korona: Bist du dir sicher das direkte Portzugriffe schneller als DMA sind? Bei Festplatten und CD/DVD Laufwerke ist das andersherum.
@Cheebi: Dir wünsche ich noch viel spaß mit dem FDC. ^^
bitmaster
-
@bitmaster: Floppys mit CD/DVD vergleichen ist glaub ich ne Schlechte idee, da liegen sowieso Welten zwischen (allein vonner Laufwerksgeschwindigkeit und Datenmenge her).
Zum Thema, es wär evtl. gut zu wissen worauf das so lang dauert, und wie du aktuell drauf zugreifst (also Ports, oder DMA, ... - am besten immer mit Code). "Hilfe es ist langsam woran liegts?" geht auch hier nicht. Oder hat jemand meine Kristallkugel gesehn? ^^
-
ATA/ATAPI benutzt nicht den 8237 DMA Chip wie der FDC sondern andere Chips. (Ultra DMA etc.)
-
@korona: ich habe den DMA-Kanal gewählt, da ich mir dachte, das sei schneller als direkt über die Ports...
Wenn direkte Portzugriffe schneller sein sollen, dann wähle ich natürlich diese... aber die Frage stellt sich, wie regelt das BIOS das ganze? Weil der Unterschied 4 Sek. (über BIOS-Int) und 33 Sek. (über meine Funktion) ist schon enorm... Da hat das BIOS eindeutig eine genialere Methode...
Kann es daran liegen, dass ich mich genau wie im Datasheet beschrieben an den Ablauf des Sektoren-Lesens halte?
- 1. Recalibrate
- 2. Initialize DMA
- 3. Read-Command
- 4. Wait for IRQ
- 5. Result ok?
- 6. Complete
Natürlich schalte ich vorher den Motor an...
Grüße Cheebi
-
Rekalibrierst du vor jedem einzelnen Sektor? Ich könnte mir denken, dass das BIOS den Motor noch ein Weilchen anlässt (zumindest rattert bei mir die Diskette noch weiter, wenn schon längst nichts mehr gelesen wird) und wenn dann ein weiterer Aufruf kommt, dann wird einfach der nächste Sektor gelesen, ohne die ganze Initialisierung. Und 98 Kalibrierungen gegen eine könnte dann schon was ausmachen.
Aber das ist nur geraten :)
Du könntest dir natürlich auch den Source vom Bochs-BIOS angucken.
-
iirc ist ein recalibrate nur bei Fehlern sinnvoll. Mir fehlt aber der Seek. Der sollte zumindest kommen wenn sich der track verändert.
-
@ bluecode:
ich hab mir mal deinen fdc-treiber angesehen... prinzipiell funktioniert mein fdc-treiber genauso. ein paar Sekunden konnte ich eisparen, indem ich kleinere wartezeiten (zB für Motor an, etc) gewählt habe. ich könnte mir vorstellen, dass es am dateisystem-Modul hängt... das suchen der sektoren in der fat dauert ja auch (wenn auch nur kurz)
wie läuft dein fdc-treiber? ich konnte dein os nicht starten "failed to set scancode set 2"...
gruß
cheebi
-
Schaltest du denn den Motor für jeden Sektor an und wieder aus?
-
@FreakyPenguin : nein...
-
wie läuft dein fdc-treiber? ich konnte dein os nicht starten "failed to set scancode set 2"...
War das die v0.1 von lightOS?
-
ja... das hab ich auf deiner HP gefunden...
-
Wenn direkte Portzugriffe schneller sein sollen, dann wähle ich natürlich diese... aber die Frage stellt sich, wie regelt das BIOS das ganze? Weil der Unterschied 4 Sek. (über BIOS-Int) und 33 Sek. (über meine Funktion) ist schon enorm... Da hat das BIOS eindeutig eine genialere Methode...
Die Frage habe ich mir auch schon oft gestellt. Interessanter fände ich aber die Implementation von DOS. Das BIOS auf meinem 286er hat große Probleme mit dem FDC, funktioniert aber.
Gut 30 Sekunden, bis "Starten von MS-DOS..." auf dem Bildschirm steht. Währenddessen rattert das Diskettenlaufwerk nicht, nur die Diskette nutzt sich ab und die Lampe leuchtet. Danach läuft der DOS-eigene Treiber und nutzt das Laufwerk aus.
Minix kommt damit ebenfalls nicht klar und braucht mehrere Minuten, bis eine Diskette gelesen ist. Gleiches gilt für DIAG (Diagnoseprogramm, im ROM enthalten).
Gruß,
Svenska