Position von Track und Sektor in einem von 'dd' erstellten Floppy-Image ermitteln

2

Ich habe einige Disketten-Images (originale DOS 6.22- und FreeDOS 1.44 MB-Bootdisketten) mit dem ddBefehl * nix erstellt, die in einer virtuellen Umgebung problemlos funktionieren.

Jetzt möchte ich die Struktur dieser Dateien verstehen.

Soweit ich weiß, hat eine 1,44 MB-Diskette 80 Spuren , jede Spur hat 18 Sektoren und jeder Sektor besteht aus 512 Bytes . Wenn ich das multipliziere, habe ich ungefähr 0,7 MB, was genau der Größe einer der beiden Seiten entspricht .

Die Position von Spur 0 Sektor 2 Kopf 2 ist 9728 (oder 0x2600) - dies ist der erste Sektor, den der DOS 6.22-Bootloader von der Festplatte abruft. Aber wie berechnet sich das?

Wie komme ich zu diesen Werten? Ich habe einen Emulator verwendet, um den Bootloader zu durchlaufen. Der erste Diskettenzugriff erfolgt durch Aufrufen des Interrupts 013h mit AH = 2 (Lesen von Diskette), AL = 1 (Lesen eines Sektors), CH = 0 (Lesen von Spur 0), CL = 2 (Lesen von Sektor 2) und DH = 1 (Kopf 1 verwenden = zweite Seite verwenden). Dieser Aufruf veranlasst den Emulator, die Bytes ab Position 9728 zu laden.

Jeder Registerwert mit Ausnahme der Sektornummer (die 1-basiert ist) ist 0-basiert.

Danke im Voraus!

Muffel
quelle
Muss der Emulator die Adresse nicht an das virtuelle Laufwerk übergeben, um anzugeben, von welchem ​​physischen Speicherort die Daten abgerufen werden sollen? Es ist auch möglich, dass der Emulator ein Basis-Offset-Adressierungsschema für den virtuellen Festplattentreiber verwendet oder den "Plattenkopf" vor dem ersten Leseaufruf positioniert. Auch was Emulator verwenden Sie?
Durchbruch
@Breakthrough Der Emulator heißt emu8086 . Trotzdem funktioniert das Image auch mit VMWare Player. Natürlich muss es die Adresse an das virtuelle Laufwerk übergeben, aber ich habe keinen Zugriff darauf - es greift nur auf das Disketten-Image zu. Ich habe den Bootloader-Code zerlegt, und dies ist wirklich der zweite Interrupt-Aufruf überhaupt (der erste ist ebenfalls Int 13h mit AH = 00, um das Festplattenlaufwerk zurückzusetzen). Die Adressparameter (Registerwerte) haben also nichts mit dem verwendeten Emulator zu tun, oder?
Muffel
Richtig, in diesem Fall haben sie nichts mit dem jeweiligen Emulator zu tun. Ich habe Ihre Frage in diesem Licht noch einmal gelesen und bin mir nicht sicher, was Sie fragen. Möchten Sie wissen, wie der tatsächliche Offset 0x2600aus den übergebenen Registerwerten (AH, AL, CH, CL, DH) berechnet wird?
Durchbruch
@Durchbruch ja, ich möchte nur wissen, wie dieser Versatz berechnet wird. Das ist alles;)
Muffel
@Breakthrough Ich habe die Details hinzugefügt. Meine eigene Antwort zu akzeptieren ist nicht möglich, aber ich werde es so schnell wie möglich wieder gut machen.
Muffel

Antworten:

3

Die Antwort habe ich selbst gefunden. Die Datei ist im LBA- Format aufgebaut, das sich leicht aus den erhaltenen CHS- Werten berechnen lässt :

LBA = (Zylinder * Anzahl_Köpfe + Kopf) * Sektoren_Pro_Spur + Sektor - 1

= (0 * 2 + 1) * 18 + 2 - 1 = 19

19 * bytes_per_sector = 19 * 512 = 9728

Muffel
quelle