Hallo zusammen, der erste Sektor eines USB-Sticks ist ja der Bootsektor. In diesen habe ich ein wenig x86-Assembler-Code reingeschrieben und ans Ende des 512 Byte langen Sektors natürlich die Bytes 0x55 und 0xAA. Das ganze mit dem HxD Hex-Editor. Diesen Stick wollte ich nun an meinem Laptop testen und habe im Bios als einzig mögliches Boot-Device den USB-Stick angegeben. Er wird auch erkannt, nur leider nicht als bootfähig, sondern nur während des Startvorgangs, dass er angesteckt ist. Hat irgendjemand eine Idee, was ich falsch gemacht haben könnte? Unabhängig davon, ob Fehler im Assembler-Code sind, müsste der Stick doch aufgrund seiner Bootsignatur (0xAA55) am Ende des ersten Sektors als bootfähig erkannt werden, oder? Vielen Dank und freundliche Grüße!
lade dir doch einfach mal das Iso vom Memtest runter http://www.memtest.org/#downiso und schau was sie in den ersten sektor so schreiben.
Danke für den Tip! Wenn ich den ersten Sektor der Memtest-Binärdatei auf den Stick kopiere, wird deren Code ausgeführt! Doch wie kriege ich jetzt raus, was davon notwendig ist?
Hm, ich sehe gerade, dass bei Memtest Einträge in der Partitionstabelle vorhanden sind... Sind diese notwendig zum Laden des Bootloaders? Ich dachte immer, das Bios testet nur, ob die Bootsignatur am Ende vorhanden ist
Christian schrieb: > Doch wie kriege ich jetzt raus, was davon > notwendig ist? keine Ahnung, aber es ist doch sogar egal, überschreibe einfach den enfang mit deinem code und schau was passiert.
Also an der Partitionstabelle kann es nicht liegen. DIe habe ich dringelassen mit meinem Code. Aber seit wann hat denn der Bootloader-Code etwas damit zu tun, ob er geladen wird oder nicht??
Christian schrieb: > Unabhängig davon, ob Fehler im Assembler-Code sind, müsste der Stick > doch aufgrund seiner Bootsignatur (0xAA55) am Ende des ersten Sektors > als bootfähig erkannt werden, oder? Nö. Am Anfang muss ein Sprungbefehl stehen. Entweder EB XX 90 oder E9 XX XX. fchk
Das steht aber bei dem funktionierenden Code auch nicht am Anfang... Da steht als erstes B8 C0 07 ... 0x07C0 ist ja die Adresse an die der Bootloader geladen wird, aber B8? Was für ein Befehl ist das?
Kannst du mir eine Quelle nennen, die das mit dem Sprungbefehl am Anfang beschreibt?
Kann es sein dass hier MBR (Master Boot Record) und VBR (Volume Boot Record) durcheinander gekommen sind?
Vielen Dank für die Hilfe! Ich habe hier jetzt was gefunden zum Unterschied zwischen VBR und MBR: http://en.wikipedia.org/wiki/Boot_sector#Kinds_of_boot_sectors Kann es sein, dass ich unbedingt einen VBR statt eines MBR benötige? Mein Stick ist ja nicht partitioniert, allerdings aber auch nicht formatiert...
.... schrieb: > Kann es sein dass hier MBR (Master Boot Record) und VBR (Volume Boot > Record) durcheinander gekommen sind? ja scheint irgendwie so: [..] Der Volume Boot Record (kurz VBR) ist der erste Sektor (in der Regel 512 Byte) der jeweils korrespondierenden Partition eines Speichermediums [..] dort sollte ja eigentlich die Partitionstabelle stehen.
Christian schrieb: > Das steht aber bei dem funktionierenden Code auch nicht am Anfang... Da > steht als erstes B8 C0 07 ... 0x07C0 ist ja die Adresse an die der > Bootloader geladen wird, aber B8? Was für ein Befehl ist das? mov ax,07c0h Ist Dein USB-Stick partitioniert wie eine Festplatte oder ohne Partitionstabelle wie eine Floppy? Woher kommt der funktionierende Code? fchk
Den Code, der erfolgreich geladen wird, habe ich hierher: http://www.memtest.org/#downiso Ich glaube, mein Stick hat keine Partitionstabelle, da die Stringdaten des funktionierenden Codes an der Stelle standen, wo eigentlich die Partitionstabelle hätte sein müssen.
Muss der Stick denn mit FAT formatiert sein? Ich habe den Code auch mal disassemblieren lassen, und da steht wie gesagt am Anfang ein mov-Befehl. Ein Sprungbefehl am Anfang scheint also keine Voraussetzung zu sein...
zeig doch mal bitte den code deines bootsectors... du versuchst dich wohl in kernel programmierung, oder...? man beginnt da am besten mit der guten alten diskette...
Peter II schrieb: > [..] > Der Volume Boot Record (kurz VBR) ist der erste Sektor (in der Regel 512 > Byte) der jeweils korrespondierenden Partition eines Speichermediums > [..] > > dort sollte ja eigentlich die Partitionstabelle stehen. Die Partitiontabelle steht im MBR und definiert, wo welche Partition liegt. Jedenfalls bei primären Partitionen - bei extended Partitions wirds komplizierter. In den ersten Sektoren der jeweiligen Partitionen steht der VBR.
Hallo, ja, letztendlich möchte ich natürlich eine Art kleinen Kernel programmieren, der dann nur ein paar Signale über die parallele Schnittstelle ausgeben soll. Da ich leider kein Diskettenlaufwerk zur Verfügung habe, muss ich das Ganze auf meinem USB-Stick machen. Im BIOS des PCs habe ich auch alles so eingestellt, dass er nur vom USB-Wechseldatenträger booten kann. Nun steht in sämtlichen Turorials zur Lowlevel und Betriebssystemprogrammierung, dass das Bios schaut, ob im ersten Sektor eines Speichermediums am Ende die Magic Number vorhanden ist und wenn das der Fall ist, den Sektor in den Arbeitsspeicher lädt und asuführt. Das tut mein Pc (Laptop) jedoch pffensichtlich nicht, denn mein Code besteht nur aus einer Endlosschleife (eine Sprunganweisung immer wieder an die selbe Stelle). Er zeigt immer die Meldung "Insert proper boot device..." usw. Was für Voraussetzungen muss denn mein Bootsektor haben, dass der Code auch wirklich geladen wird? Danke für eure Unterstützung!
Nimm ein DOS und das hier: http://www.computerbase.de/downloads/system/hp-usb-disk-storage-format-tool/ Das baut Dir einen bootfähigen USB-Stick. Hast Du kein DOS, nimm das hier: http://freedos.sourceforge.net/ fchk
Das habe ich zum Testen auch schon probiert... Aber leider bleibt der Bildschirm mit der Meldung "FreeDOS FAT" stehen und es passiert weiter nichts.
Außerdem muss es doch irgendwo ein Dokument geben, dass beschreibt, auf was das BIOS außer der Bootsignatur am Ende des MBR achtet... Es kann doch nciht sein, dass das nirgendwo beschrieben ist :)
Bei mir funktioniert das Tool. Der USB Stick muss aber kleiner als 2047 MB sein, weil das HP-Tool den Stick im Superfloppy-Format beschreibt. Ich verwende 512MB-Sticks, und damit habe ich kein Problem. fchk
Christian schrieb: > Außerdem muss es doch irgendwo ein Dokument geben, dass beschreibt, auf > was das BIOS außer der Bootsignatur am Ende des MBR achtet... Es kann > doch nciht sein, dass das nirgendwo beschrieben ist :) Doch, ist es. IBM schreibt im PS/2 Technical Reference Manual: Interrupt 19H - Bootstrap Loader Devices that are supported by Interrupt 13H read the boot record from cylinder 0, head 0, sector 1. Devices that are supported by Interrupt 4BH read the boot record from logical block address 1. The boot record is then read into system memory at address hex 0000:7C00. The power-on self-test (POST) checks for the following characteristics to validate a boot record: • For a device with removable media, such as a diskette, the boot record must contain valid code. For example, the value of the first byte of the boot record must be greater than 6. • For a device with nonremovable media, such as a fixed disk, there must be a signature of hex 55AA at the end of the boot record. Parameters that identify the device from which the boot record was obtained are passed to the boot record. Passing of these parameters enables the boot record to continue the system boot operation. In systems that do not support Interrupt 15H, Return Boot Device and Key function ((AH) = D6H), the following information is passed to the boot record: (CS) = 0000H (IP) = 7C00H (DL) - Drive from which the boot record was read In systems that support Interrupt 15H, Return Boot Device and Key function ((AH) = D6H), information is passed also to the DX register. If the access-mode bit (bit 5) is set to 0, the DX register is defined as the "boot device identifier"; if the access-mode bit is set to 1, the DX register is defined as the "device key." The device key is a 16-bit value that is returned by Interrupt 4BH, Allocate Device function ((AH)=B0H, (AL)=02H), (AX)=8002H. (The device key is available also from Interrupt 15H, Return Boot Device ID and Key function ((AH) = D6H).) The following information is passed to the boot record: (CS) = 0000H (IP) = 7C0H (DX) - Boot device identifier or device key When (DX) is a boot device identifier, (DH) and (DL) are defined as follows: (DH) - Device identifier Bit 7 - Removable-media indicator = 0 - Non removable media = 1 - Removable media Bit 6 - Reserved Bit 5 - Access mode = 0 - Device is supported by Interrupt 13H = 1 - Device is supported by Interrupt 4BH Bits 4 to 0 - Peripheral-device type (DL) - Device instance = 00H - First diskette drive (if the access-mode bit is set to 0) - First CD-ROM drive (if the access-mode bit is set to 1) = 80H- First fixed disk drive (if the access-mode bit is set to 0) Dein Code ist nach Ansicht des BIOS also nicht valid. fchk
Wow, vielen Dank für die Unterstützung. Die Informationen der übergebenen Parameter sind auch sehr interessant. Es wir nun aber ja gesagt, dass "zum Beispiel" das erste Byte größer als 6 sein muss. Das ist bei mir auch der Fall. Wo kann ich denn nun die restlichen Voraussetzungen für validen Code finden?
Zu FreeDOS: Ich habe auch einen 512MB Stick verwendet, aber trotz allem bleibt er bei der genanten Meldung hängen.
evtl. hilft dir ja das osdev tutorial von dr. erhard henkes -> http://www.henkessoft.de/OS_Dev/OS_Dev1.htm
Ich habe mir vor Jahren auch mal zum Testen einen winzigen Kernel geschrieben... (der hat nichts anderes getan, als eine kurze Textmeldung auszugeben und auf Knopfdruck den Bildschirm in verschiedenen Farben einzufärben....) einfach just for fun. Habe das damals auf Diskette geschrieben und jetzt mal geschaut, ob das auch funktioniert, wenn ich das mit HxD auf einen USB-Stick schreibe... Ergebnis: Ja, funktioniert genauso. Hast Du in HxD im Menü Extras->Datenträger öffnen auch den Punkt "Physische Datenträger" anstatt "Logische Datenträger" genutzt ? Welchen Assembler nutzt Du ?
MS-DOS habe ich leider nicht. Ich habe den USB-Stick als logischen Datenträger ausgewählt, weil mir war ja schon bewusst, dass ich den Bootsektor an den physikalischen Sektor 0 schreiben muss. Ich benutze NASM. Kannst du mir vielleicht den Code deines Bootloaders geben? Oder zumindest das assemblierte Hexfile? Dann würde ich nämlich einfach mal testen ob es damit funktioneirt :)
> Ich habe den USB-Stick als logischen Datenträger ausgewählt [...] Das ist dann aber nicht korrekt. Weil dann der "Sektor 0" nicht der physische Sektor 0 des Datenträgers sondern der logische Sektor 0 der ersten Partition ist. Fieserweise endet dieser Sektor auch mit 55AA! Allerdings steht auch deutlich FAT (oder NTFS) drin. Wenn man den > Bootsektor an den physikalischen Sektor 0 schreiben muss dann muss auch der physische Datenträger ausgewählt sein.
..wie schon geschrieben: In HxD den "physischen" Datenträger auswählen, da Du sonst an die falsche Stelle schreibst. Ich hänge Dir hier mal meinen alten (geringfügig geänderten) Quelltext und die fertig kompilierte Image-Datei zum Testen an. Ist, wie gesagt, schon ziemlich alt. "Unschönheiten" im Quelltext gehen allein auf meine Kappe ;-)) Gruß Tom
Ja, ich habe natürlich den physischen Datenträger ausgewählt, habe es nur in meinem Post oben verwechselt :) Ich habe festgestellt, dass wenn ich den Stick als FAT32 formatiere, er gar nicht erkannt wird. Mit FAT geht es (ich nehme an das ist FAT16). Ich habe meinen eigenen Bootcode and die Stelle eingefügt, an die die Sprunganweisung ganz am Anfang des MBR hinspringt. Den restlichen Code, der durch das Formatieren vorhanden ist, musste ich merkwürdigerweise drin lassen, denn wenn ich den mit Nullen überschreibe, aht es nicht funktioniert... Danke für deine Dateien, damit komme ich hoffenlich nochmal ein weiteres Stück weiter :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.