Wie schreibe ich einen Bootloader in den MBR?

2

Ich habe versucht, einen Bootloader in der Assemblersprache auf ein USB-Laufwerk zu schreiben, um ihn auf einem anderen Computer zu testen. Der Bootloader sollte mit Intel-Prozessoren funktionieren. Der Computer, auf dem ich es teste (Windows 7 mit Intel Celeron und 2 GB RAM), sollte es ausführen. Es gibt sogar eine Option zum Booten von einem USB-Laufwerk im BIOS (und es erkennt das Laufwerk). Wenn ich das Booten vom Laufwerk aus starte, bootet es in Windows. Es sollte mein benutzerdefiniertes Betriebssystem anzeigen, bei dem es sich im Grunde nur um ein Assembly-Programm vom Typ Hello-World handelt. Ich gehe davon aus dem ist , weil es das Betriebssystem nicht finden kann: Entweder den OS-Tag (was ich gefunden soll „dw 0xAA55“ sein) nicht korrekt ist, ist das USB - Laufwerk nicht gebootet, oder ich stelle einfach nicht die Bootloader-Bin-Datei im ersten Sektor.

Meine Fragen sind: Wie teste ich, ob (a) das USB-Laufwerk ein Betriebssystem booten kann, (b) ob das Betriebssystem erkannt wird und (c) ob sich die Bin-Datei im richtigen Sektor befindet (der erste Sektor)? .

Hier ist der Assembler-Code:

org 7C00h

jmp 0x0:start

start:
cli
mov ax, 0x9000 ;Set up stack
mov ss, ax     ;Tell processor where stack is
mov sp, 0xFB00 ;Set stack offset
sti

mov AH, 0Eh ;Tell bios we're writing a char to screen!
mov AL, 'T' ;Load a new character into memory
int 10h     ;Call BIOS video interrupt

jmp start   ;And so on and so on

times 510-($-$$) db 0 ;Fill rest of sector up with 0s to make this 512B (a sector)
dw 0xAA55             ;Let BIOS know this is an OS! (defines a word)

Ich bin ein Neuling in der Montage. Wenn also die Kommentare nach einigen Zeilen nicht mit dem übereinstimmen, was sie sein sollten, ist dies wahrscheinlich der Grund. Danke für Ihre Hilfe!

John Schneider
quelle

Antworten:

3

Sie können nicht über das Dateisystem auf MBR zugreifen. Dies ist ein spezieller Sektor, der sich immer außerhalb der von Ihnen erstellten Partitionen befindet.

Um in den eigentlichen MBR zu schreiben, müssen Sie dd (unter Linux) oder PartCopy (für Windows) verwenden. Ich habe PartCopy noch nie benutzt, daher kann ich nicht dafür bürgen, aber dd hat für mich funktioniert.

dd if=bootsector.bin of=/dev/sda bs=512 count=1

Wobei sda der Name Ihrer Festplatte oder Ihres USB-Geräts ist und bootsector.bin eine flache Binärdatei ist

Beachten Sie, dass die Option "of" auf das Gerät selbst und NICHT auf die Partitionierung auf diesem Gerät, dh sda1, sda2, zeigen sollte

Sie können eine flache binär mit kompilieren nasm mit -f bin Option

Ebenso können Sie testen, ob Ihr Bootsektor vorhanden ist, indem Sie vom ersten Sektor in die Datei lesen:

dd if=/dev/sda of=mbr_contents.bin bs=512 count=1

Öffnen Sie es mit einem Hex-Editor und prüfen Sie, ob es mit Ihrem Original identisch ist, oder zerlegen Sie es.

Sie können den Bootsektor auch reinigen, indem Sie von einem Nullgerät aus schreiben:

dd if=/dev/zero of=/dev/sda bs=512 count=1

Woher wissen Sie, dass das Betriebssystem erkannt wird? Wenn es Ihren Bootsektor trifft, würde es nicht versuchen, einen anderen Bootsektor zu laden, selbst wenn Ihr Code abstürzt. Das BIOS sucht nur nach dem 0xAA55-Tag, lädt die 512 Byte in den Speicher und führt die CPU im Real Flat-Modus aus (Standardeinstellung). Das BIOS übergibt Ihnen im Grunde die Kontrolle. Was auch immer als nächstes passiert, wird das Ergebnis davon sein, dass IHR Code ausgeführt wird. Wenn Ihr Code abstürzt, sitzt der Computer einfach da und verschwendet Strom.

Soweit ich weiß, dass alle USB-Laufwerke einen Bootloader speichern können, können einige Motherboards beim Laden von USB-Laufwerken fehlerhaft sein. Ich habe eine Ersatzfestplatte zum Herumspielen verwendet, sie scheint zuverlässiger zu sein.

Bonus-Trick: Möglicherweise ist es anstrengend, den Computer jedes Mal neu zu starten. Verwenden Sie daher eine virtuelle Maschine. VirtualBox ist großartig, aber es gibt noch andere. Das Nützliche an der virtuellen Box ist, dass Sie sie von einer echten Festplatte (oder einem USB-Stick) booten können. Sie können eine virtuelle Box an eine echte Festplatte anhängen, indem Sie ein virtuelles Proxy-Dateisystem erstellen:

VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk
  -rawdisk /dev/sda

Dann benutzen Sie einfach die vmdk-Datei als normales virtuelles Dateisystem und schreiben Ihren Bootloader wie gewohnt in sda. Sehr praktisch zum Testen!

Quelle: Virtual Box-Handbuch, Kapitel 9, Abschnitt "Erweiterte Themen": Zugriff auf die gesamte physische Festplatte

Sie könnten wahrscheinlich selbst in das virtuelle Dateisystem schreiben, aber ich habe keinen einfachen Weg gefunden, dies zu tun. Diese Dateien haben ungewöhnliche Formate, so dass Sie nicht einfach dd auf ihnen verwenden können.

Einige andere nützliche Informationen zu benutzerdefinierten Betriebssystemen und Bootloadern:

OS Dever

OS Developmnet-Serie von Broken Thorn Entertainment

vlsh
quelle
HxDEdit kann auch zum Bearbeiten von Bootsektoren und so weiter verwendet werden.
Bigbio2002
0

a) Versuchen Sie, ein anderes Betriebssystem von einem Stick zu booten. Es muss eine Anleitung geben, wie man zB Windows auf einen USB-Stick steckt. Wenn das geklappt hat, wissen Sie, dass Ihre Maschine das kann.

b) Wenn Sie wissen, dass Ihre Box ein beliebiges Betriebssystem bootet, wissen Sie, dass es Ihr Betriebssystem bootet, wenn es abstürzt oder Ihr "Hallo" anzeigt. Sie wissen, dass das Betriebssystem beim Booten auf Ihrer regulären Partition nicht erkannt wurde. Weitere Informationen hier: http://en.wikipedia.org/wiki/Master_boot_record

c) Der erste Sektor ist durch Öffnen der Festplatte selbst erreichbar. Schauen Sie sich dies an: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx , Abschnitt "Physische Datenträger und Volumes"

cxxl
quelle