Erstellen eines bootfähigen ISO-Images mit benutzerdefiniertem Bootloader

8

Ich versuche, einen Bootloader, den ich in Assembly Language geschrieben habe, in eine ISO Image-Datei zu konvertieren. Der folgende Code ist der MikeOS Bootloader. Hier ist mein Bootloader-Code:

%Vor%

Ich habe den folgenden Befehl eingegeben:

%Vor%

Dieser Befehl funktioniert gut und es gibt eine .bin-Ausgabe. Als nächstes tippte ich den folgenden Befehl:

%Vor%

Das funktionierte auch gut und gab mir die .img-Ausgabedatei. Wenn ich diesen Befehl eintippe:

%Vor%

Ich erhalte den folgenden Fehler: dd: unrecognized operand ‘skip’ . Ich habe in der Dokumentation DD gelesen, dass dem Attribut skip eine Nummer zugewiesen werden muss. Irgendwelche Ideen, welche Nummer ich mit skip Attribut eingeben sollte (Bsp. Überspringen = 1).

Als nächstes gebe ich den folgenden Befehl ein:

%Vor%

Ich erhalte den folgenden Fehler: mkdosfs: unable to create floppy.img . Wie behebe ich die Probleme, denen ich begegne? Gibt es eine andere einfachere Möglichkeit, meine Bootloader-.bin-Datei in ein ISO -Bild umzuwandeln?

    
Mahmoud Abdel-Rahman 14.12.2015, 13:41
quelle

2 Antworten

14

Sie haben Ihr Beispiel gefunden, wie Sie ein bootfähiges ISO Bild aus dieser StackOverflow-Antwort erstellen können . Leider hast du eine akzeptierte Antwort gewählt, die in vielerlei Hinsicht falsch ist. Tu so, als hättest du diese Antwort nie gesehen.

Auf den meisten Linux-Distributionen existiert entweder ein Programm namens genisoimage oder mkisofs . In diesen Tagen sind sie eigentlich das gleiche Programm. Was immer Sie haben, kann in den folgenden Beispielen ersetzt werden. In meinen Beispielen wird davon ausgegangen, dass das ISO -Erstellungs-Dienstprogramm genisoimage heißt.

In Ihrer Frage haben Sie einen Bootloader-Code in einer Datei namens boot.asm . Sie erstellen das korrekt zu einem Bootsektor-Binärbild mit:

%Vor%

Dies erzeugt boot.bin , was Ihr Bootsektor ist. Der nächste Schritt besteht darin, ein Disketten-Image zu erstellen und boot.bin in den ersten Sektor zu platzieren. Das kannst du damit machen:

%Vor%

Mit dem ersten Befehl wird ein leeres Festplatten-Image gleich der Größe einer 1,44 MB-Diskette (1024 * 1440 Bytes) erstellt. Der zweite Befehl platziert boot.bin in den ersten Sektor von floppy.img , ohne den Rest der Datei abzuschneiden. seek=0 sagt Suche nach dem ersten Sektor (512 Bytes ist die Standardgröße eines Blocks für DD ). count=1 gibt an, dass nur 1 Sektor (512 Bytes) von boot.bin kopiert werden soll. conv=notrunc sagt, dass nach dem Schreiben in die Ausgabedatei das verbleibende Disk-Image intakt bleiben soll (nicht abgeschnitten).

Nachdem Sie wie oben gezeigt ein Disk-Image erstellt haben, können Sie mit folgenden Befehlen ein ISO Image erstellen:

%Vor%

Die obigen Befehle erzeugen zuerst ein Unterverzeichnis namens iso , das die Dateien enthält, die auf das endgültige CD-ROM-Image gelegt werden. Der zweite Befehl macht nichts mehr als kopiert unser floppy.img in iso Verzeichnis, weil wir das zum Booten brauchen. Der dritte Befehl führt die Schwerarbeit aus und erstellt das ISO Bild.

  • -V 'MYOS' setzt die Datenträgerbezeichnung (Es kann sein, was immer Sie wollen)
  • -input-charset iso8859-1 setzt den verwendeten Zeichensatz. Ändere es nicht
  • -o myos.iso sagt, dass das ISO Bild in der Datei myos.iso ausgegeben wird
  • -b floppy.img sagt, dass unsere ISO bootfähig sein wird und das verwendete Boot-Image die Datei floppy.img ist
  • -hide floppy.img wird nicht benötigt, aber es versteckt das Boot-Image aus der endgültigen ISO-Verzeichnisliste. Wenn Sie diese ISO mounten und ein ls ausführen würden, um die Dateien aufzulisten, wird floppy.img nicht angezeigt.
  • iso/ am Ende des Befehls ist das Verzeichnis, aus dem das ISO Bild erstellt wird. Es muss mindestens unser bootfähiges Disketten-Image enthalten, aber Sie können beliebige andere Dateien in das iso/ -Verzeichnis stellen.

Das ISO Bild myos.iso , das generiert wurde, kann gebootet werden. Ein Beispiel für die Verwendung von QEMU zum Starten eines solchen Bildes:

%Vor%     
Michael Petch 14.12.2015, 19:27
quelle
4

Für CD; Es gibt eine Spezifikation ("El Torito"), die beschreibt, wie bootfähige CDs funktionieren. Wo die ersten 16 (2048 Byte) Sektoren unbenutzt sind, gibt es einen "Boot-Katalog", den die Firmware verwendet, um zu entscheiden, welchen Bootloader sie verwenden soll (damit Sie eine einzelne CD haben können, die sehr unterschiedliche Systeme bootet - zB PC BIOS, UEFI) , PowerPC, etc), dann die Bootloader selbst.

Für "PC BIOS" allein gibt es 3 Möglichkeiten:

  • emulieren Sie eine Diskette (mit einem "Disketten-Image" auf der CD)
  • emulieren eine Festplatte (mit einem "Festplatten-Image" auf CD)
  • keine Emulation

Die ersten beiden Optionen sind meistens nur für kompatible Zwecke (krustige alte Betriebssysteme, die das Booten von CDs nicht unterstützen, wie MS-DOS); und Leistungsaspekte haben (z. B. um das Laden eines virtuellen 512-Byte-Sektors zu emulieren, muss die Firmware einen echten 2048-Byte-Sektor laden und die überschüssigen 1536 Bytes wegwerfen). Jedes OS, das in den letzten 15 Jahren entwickelt / geschrieben wurde, sollte "keine Emulation" verwenden.

Für "keine Emulation":

  • Die Firmware lädt Ihren gesamten Bootloader (der bis zu 512 KiB betragen kann) und nicht nur einen Sektor
  • Sektoren auf CDs sind 2048 Bytes (und nicht 512 Bytes); und sollte über geladen werden. "int 0x13 extensions" (und nicht die alten / eingeschränkten "CHS-Disk-Funktionen", die Sie für Floppy verwenden würden)
  • Es ist kein BIOS-Parameterblock erforderlich (der für Disketten obligatorisch sein sollte)
  • Es ist keine Partitionstabelle erforderlich (die für Festplatten, einschließlich GPT, als obligatorisch angesehen werden sollte)
  • Sie werden wahrscheinlich ISO9660 als Dateisystem unterstützen (um den Kernel und / oder andere Dateien zu finden, die der Bootloader laden muss) und nicht über FAT.

Beachten Sie auch, dass (im Allgemeinen) für "PC BIOS" wahrscheinlich 5 verschiedene Bootloader benötigt werden (einer für Diskettenlaufwerk, einer für "MBR partitionierte" Festplatte, einer für "GPT partitionierte" Festplatte) für CD und eine für Netzwerkstart). Diese Fälle sind alle unterschiedlich genug (und die Beschränkung "nur 512 Byte initial sector only" für 3 dieser Fälle ist restriktiv genug), um die Idee "alle von einem Bootloader unterstützten Geräte" zu einem Desaster zu machen.

Um tatsächlich die ISO zu generieren; Sie können ein existierendes Werkzeug (zB mkisofs) verwenden, oder Sie können Ihr eigenes Werkzeug schreiben (ISO9660 und "El Torito" sind beide relativ einfach zu verstehen, und das Schreiben Ihres eigenen Werkzeugs zur Erstellung einer ISO kann in weniger als 2 Tagen erledigt werden, das ist wie ein Tropfen auf den heißen Stein für OS - Entwicklungsprojekte).

    
Brendan 14.12.2015 21:41
quelle

Tags und Links