Frage

Ich bin neu im Betriebssystemdesign und habe bisher ein „Betriebssystem“ entworfen (eigentlich nur einen einzelnen Bootsektor) und beschlossen, zu versuchen, einen eigenen Bootloader und „Kernel“ zu erstellen (immer noch sehr einfach).Meine Frage ist einfach, konnte mir aber durch Googeln und Durchsuchen dieser Website nicht entgehen (ok, ich habe eine ähnliche Frage gefunden, aber die Antwort war zu vage/fortgeschritten, als dass ich sie verwenden könnte).

Ich habe mir int 0x13 AH=02 angesehen, aber das verwendet Titel, die CDs meiner Meinung nach nicht verwenden.Ich habe irgendwo gesehen, dass ich den erweiterten Lesesektor (AH=0x42) verwenden sollte, aber ich weiß nicht, wie ich ihn verwenden soll, weil ich nicht sehe, wo ich angeben kann, welcher Sektor gelesen werden soll und wo der Sektor im RAM abgelegt werden soll .

Hier ist die Frage:Wie lade ich Sektoren von einer CD, die El Torito ohne Emulation verwendet?Ich würde mich freuen, wenn Sie die Antwort in „einfachster Form“ formulieren und versuchen könnten, etwas Code bereitzustellen, da ich neu in diesem Bereich bin.Dank im Voraus!

BEARBEITEN:

Ich weiß nicht, ob Sie es brauchen, aber ich verwende die NASM-Syntax. Wenn Sie mir also die Antwort in NASM geben könnten, wäre das großartig.

War es hilfreich?

Lösung

Konventionell legt das BIOS die Laufwerksnummer, die Sie für int 13h verwenden sollten, im DL-Register ab.Dann können Sie int 13h, ax=4B01h (Emulationsstatus abrufen) verwenden, um die Festplatteninformationen zu ermitteln, und int 13x function 42h, um CD-Sektoren der Größe 0x800 mit der Sektornummer im LBA-Feld zu lesen.Überprüf den ISOLINUX-Bootloader für mehr Details.Einstiegspunkt ist _start, Routine zum Lesen von Sektoren ist getlinsec_cdrom.

Bearbeiten:lesen die Dokumentation on int 13h-Erweiterungen zur Verwendung.Grundsätzlich müssen Sie eine gefüllte Struktur mit der Sektornummer, der Anzahl und der Adresse des Puffers übergeben, in dem die gelesenen Daten abgelegt werden sollen.

Andere Tipps

Mein Bootloader glaubt, dass es auf 0x07c0 geladen wird: 0x000 statt 0x0000: 0x7c00.Aber es funktioniert.Ich verwende GNU-Tools.

Dies ist die Montage:

generasacodicetagpre.

Dies ist das Makefile:

generasacodicetagpre.

Der Schlüssel ist das Verständnis des Verstehens, wie SEG: Offset ist Adresse im Real-Modus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top