Bootsektor x86

Gast #2815554
Lesenswert?

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!
Gast #2815679
Lesenswert?

.... 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.
#2815687
Lesenswert?

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
#2815875
Lesenswert?

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.
Gast #2816212
Lesenswert?

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!
#2816302
Lesenswert?

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
Gast #2816719
Lesenswert?

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 ?
Gast #2817208
Lesenswert?

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 :)
#2817219
Lesenswert?

> 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.
Gast #2817335
Lesenswert?

..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
Angehängte Dateien:
Gast #2819161
Lesenswert?

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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren