Wie kann ich ein anderes Medium als eine Floppy Disc verwenden?
-
Guten Abend zusammen. Erstmal danke das ihr eure Arbeit mit anderen teilt, ich habe vor 4 Tagen mit dem Tutorial begonnen und bin gerade in der Stufe vor dem C Kernel. Wenn ich Bochs wie im Tut von der .bin Datei myOS.bin starte bootet es auch und der Kernel lädt wie er soll. Da ich leider kein Floppy Laufwerk habe wollte ich fragen, ob ich die myOS.bin statt auf eine Floppy auch auf eine CD oder einen USB Stick schreiben kann um zu versuchen ob mein laptop oder virtualbox damit startet?
Danke und fg Manuel
-
Du kannst das ganze auch (mit dd) auf ein anderes Speichermedium pressen. Sofern das BIOS von USB-Sticks booten kann, ist die Chance auch ganz gut, dass es funktioniert.
-
Danke für die schnelle Antwort. Ich habe es nämlich mit einem USB Stick versucht und beim booten ist zwar keine Fehlermeldung aber nur ein blankscreen mit cursor gekommen. Der Laptop bzw das BIOS kann von USB booten aber vlt hat ja der Stick etwas. Ich werde es einmal mit einer CD versuchen, danke erstmal.
edit: ich habe es jetzt mit einer CD, mit einem weiteren USB Stick und einer SD Karte versucht. Bochs startet auch vom USB Stick aber mein echter PC nicht. Es kommt aber noch immer keine Fehlermeldung das kein bootfähiges Medium gefunden wurde. Es scheint als wäre da so eine Art Bootloop oder so, als würde der laptop erkennen das da was ist aber es nicht starten können. mit der cd das selbe. entschuldige das ich mich so unbeholfen ausdrücke.
mfg
-
Wenn du ein relativ neues Mainboard mit UEFI hast müsstest du mal schauen ob es auf UEFI oder BIOS gestellt ist. Ansonsten gibt es bei USB in den BIOS Einstellungen meistens etwas von USB Legacy Support. Das muss aktiviert sein, sonst startet das BIOS zwar den Bootloader vom USB Stick, allerdings kann dieser dann nicht auf die weiteren Daten vom Stick zugreifen.
-
Also meint ihr, ich habe im Prinzip alles richtig gemacht und es liegt an meinem laptop? Komisch ist aber das ich auch 2 live sticks habe und die booten ohne probleme, wenn ich sie im BootManager auswähle.
Es genügt also ein simples
dd if=/file.bin of=/dev/sdb
und der Bootloader sowie der Kernel in der Datei sind bootfähig auf dem Stick?
-
Wenn file.bin das Diskettenimage ist: Ja.
-
Mr X schrieb:
Wenn file.bin das Diskettenimage ist: Ja.
file.bin ist die datei, die ich aus den beiden assemblierten .asm dateien mit cat zusammengefügt habe, wie ich anfangs beschrieben habe.
mfg
-
Für den Stick musst Du ein FAT12 Image bauen, also die Diskette simulieren. Dieses Thema könnte ich im Tutorial ergänzen. Bei PrettyOS haben wir tools dabei, die ein solches Image basteln.
http://prettyos.de
-
Muß man wirklich eine Diskette mit FAT12 simulieren, um den Bootstick zu nutzen? Das will ich ganz und gar nicht! Erstens bietet mir ein Bootstick wesentlich mehr Speicherplatz als eine Diskette und ich möchte auf den Bootstick ein eigenes entwickeltes Dateisystem haben. Vorerst sollte es sogar gar kein Dateisystem besitzen! Es muß doch möglich sein, einfach alle Sektoren lesen zu können.
Ich denke nicht, daß das BIOS beim Lesen von Datenträgern irgend ein Dateisystemformat wie beispielsweise FAT12 erwartet, sondern jediglich nur die Sektoren liest. Es werden ja auch Betriebsysteme wie Linux von einen Bootstick gebootet, dem ein ganz anderes Dateiformat zugrunde liegt.
Hierbei stellt sich die Frage, wie erkennt man, wieviel Zylinder, Köpfe und Sektoren hat ein USB-Stick je nach Kapazität? Diese Frage ist auch für mich interessant, um auch die Kapazitäten, und deren Zylinder-, Kopf- und Sektorenanzahl von Festplatten zu ermitteln, was ja durch die Low-Level-Formatierung festgelegt wird. Oft besitzt das BIOS diese Informationen und wie kommt man an sie heran, bzw. wie schafft das BIOS, beim Anschluß eines Datenträgers, automatisch diese Geometrie herauszulesen? Das könnte man im Prinzip auch durch ein eigenes Programm ermitteln?! Diese Informationen sind ja immerhin wichtig, wenn man ein Formatierungsprogramm für eine High-Level Formatierung schreiben möchte, die ein eigenes Dateisystem erzeugt.
Jedenfalls habe ich die Schwierigkeit, mit den USB-Stick zu booten, wenn ich ich den Befehl dd if=Betriebssytem.bin of=/dev/sdX (X für den USB-Stick) verwende, obwohl mein BIOS vom Bootstick booten kann. Ich denke, man braucht hierzu die entsprechende Geometrie, so daß man die einzelnen Sektoren in Zusammenhang mit der Kopf- und Zylinderanzahl die richtige Reihenfolge der Sektoren lesen kann.
-
Ich hatte zwar eine ähnlich Frage in einen andere Thread gestellt, wo ich per USB-Stick booten wollte und es dann gelöst hatte. Hier kann ich jedoch das Ganze auf beliebig partionierbare Datenträger wie USB-Sticks, Festplatten usw. noch einmal näher anhand eines Beispiels erläutern. Um einen Bootloader von einer Festplatte oder USB-Stick zu booten, benötigen wir den Master-Boot-Record wo wir die Partitionstabelle einrichten.
Als Beispiel partitionieren wir den Datenträger mit Hilfe unseres Bootloaders den Datenträger und legen eine primäre Partition bei Sektor 2048 an mit der Größe von 8 GB an. Bei eine USB-Stick braucht man einen Stick von mindestens jener Größe.
Ab der Adresse 0x1B8 beginnt der MBR und bei 0x1BE die Partitionstabelle.Zunächst einmal den Bootloader der den nächsten Sektor an die Adresse 0x7E00 lädt.
org 0x7C00 ; Startadresse im Arbeitspeicher jmp Bootloader ; Datenteil überspringen bootlaufwerk db 0; Bootloader: xor ax, ax ; setze ax auf 0 = erstes Segment mov ss, ax ; Stack-Segment mov ds, ax ; Data-Segment mov es, ax ; Extra-Segment mov sp, ax ; SP = 0x0000 (stack pointer) mov [bootlaufwerk], dl Lade_naechsten_Sektor: mov dl, [bootlaufwerk] ; Laufwerk aussuchen xor ax, ax ; ax=0 setzen int 0x13 ; Leseköpfe zurücksetzen jc Lade_naechsten_Sektor ; Wenn es nicht geklappt hat, wiederholen mov bx, 0x7E00 ; Sektorinhalt direkt hinter dem ; Bootloader laden mov dl, [bootlaufwerk] ; Kennen wir schon von oben her mov al, 1 ; 1 Sektor einlesen. Geht bis zu 67 Sektoren mov ch, 0 ; cylinder = 0 mov cl, 2 ; sector = 2 mov dh, 0 ; head = 0 mov ah, 2 ; Funktion "Lesen" int 0x13 jc Lade_naechsten_Sektor ; Wenn es nicht klappt, wiederholen jmp bx ; Weitermachen an der Stelle, ; wo man diesen Sektor geladen hat db 'Schluss' ; Ende des Bootloadercode markieren times 0x1B8-($-$$)hlt ; bis zum MBR hlt-Befehle auffuellen MBR: ; MBR Anfang db 0 db 'M' ; db 'B' db 'R' db 0 db 0 Partition1: db 0x80 ; Bootflag 0 keine Bootpartition .CHSAnfang: db 0x00 db 0x01 db 0x01 ; CHS des 1. Sektors .Partitionstyp db 0 .CHSEnde db 0x00 ; CHS des letzten Sektors db 0x81 db 0x27 .StartSektor dd 0x00000800 ; Startsektor .SektorenAnzahl dd 0x00F13800 ; Anzahl der Sektoren Partition2: times 16 db 0 ; Partitonn3: times 16 db 0 ; Partition4: times 16 db 0 ; db 0x55 db 0xAA
Man kann jetzt davon den Binärcode mit nasm erstellen und die nachfolgenden Binärcodes der nächsten Sektoren zu einen OS.bin konkatenieren.
mit den UNIX-Befehl dd if=OS.bin /dev/sdX, wobei X die Datenträgerbezeichnung ist wie a,b,c, d usw. werden die Binärdaten auf den Bootstick bzw. Festplatte übertragen.
Da der 1. Sektor der ersten Bootpartition bei Sektor 2048 (0x0800) anfängt, entsteht eine 2048x512 große Lücke, wo man einen entsprechend großen Bootloader unterbringen kann, der wie GRUB beispielsweise multibootfähig ist. Ist der Kernel noch klein, kann man ihn ebenfalls in diese Lücke unterbringen und braucht ihn nicht unbedingt auf die erste Bootpartion auslagern. Tut man dieses,
muß man Sorge dafür tragen, daß man mit den BIOS-Befehl 0x13 die Nummer des Zylinders, des Kopfes und des Sektors richtig angibt, um beim logischen Sektor 2048 die Kerneldaten einzulesen. Man kann auch den MBR nachträglich mit fdisk /dev/sdX verändern, nachdem man den Bootloader oder OS.bin mit dd dorthin kopiert hat. Wichtig ist, daß man diese Partion mit einen Bootflag versieht, sonst wird nicht gebootet, trotz einer Bootsignatur. Ob man von dieser Partition Daten liest oder aus der Lücke bis zu dieser Partition, spielt dabei keine Rolle. Wichtig ist nur, daß eine primäre Partition mit Bootflag vorhanden ist. Im welchen Sektor der Bootloader oder die OS-Daten wirklich stehen, ist so ziemlich egal.