2016-07-21 7 views
1

Also habe ich in den letzten Wochen einen Bootloader und Kernel in Assembly geschrieben (x86/x86_64) und während ich komplexere Lösungen probiert habe, habe ich mich entschieden, bevor ich einen selbst geschrieben habe einen Code namens einen Benutzer namens Sinned posted here. Mein Urladercodes ist:Bootloader/Kernel booten nur in einer virtuellen Maschine

[BITS 16] 
[ORG 0x7C00] 

MOV DL, 0x0 ;drive 0 = floppy 1 
MOV DH, 0x0 ;head (0=base) 
MOV CH, 0x0 ;track/cylinder 
MOV CL, 0x02 ;sector (1=bootloader, apparently sectors starts counting at 1 instead of 0) 
MOV BX, 0x1000 ;place in RAM for kernel - I suppose randomly chosen on examples 
MOV ES, BX ;place BX in pointer ES 
MOV BX, 0x0 ;back to zero - also has something to do with RAM position 

ReadFloppy: 
MOV AH, 0x02 
MOV AL, 0x01 
INT 0x13 
JC ReadFloppy ;if it went wrong, try again 

;pointers to RAM position (0x1000) 
MOV AX, 0x1000 
MOV DS, AX 
MOV ES, AX 
MOV FS, AX 
MOV GS, AX 
MOV SS, AX 

JMP 0x1000:0x0 

;assuming we get never back here again, so no further coding needed (kernel handles everything now) 

TIMES 510 - ($ - $$) db 0 ;fill resting bytes with zero 
DW 0xAA55 ;end of bootloader (2 bytes) 

Meine Kernel-Datei ist:

;set print-registers 
MOV AH, 0x0E ;function nr 
MOV BH, 0x00 ;page 
MOV BL, 0x07 ;color 

MOV SI, msg ;move msg to SI-pointer 
CALL PrintString ;call function to print SI (msg) 

JMP $ ;hang 

PrintString: 
.next_char: 
MOV AL, [SI] ;current character 
OR AL, AL 
JZ .print_done ;if current char is zero, go to end 
INT 0x10 ;print character 
INC SI ;increase pointer to msg (next character) 
JMP .next_char 
.exit_char 
RET 

msg db 'Hello world from the kernel!', 13, 10, 0 

TIMES 512 - ($ - $$) db 0 ;fill the rest 

ich alles gut zusammen bekommen können, und die einzelnen binären Stiefel in VirtualBox erstellt, wenn auf einer Floppy-Controller angeschlossen sind. Während dies mir Selbstvertrauen gibt, an meinem eigenen Loader und Kernel zu arbeiten, würde ich gerne die Befriedigung haben, es auf Bare Metal zu booten.

Ich habe versucht, das Image mit USB-Sticks ohne Erfolg zu booten, und ich bin mir sicher, dass ich die USB-Sticks korrekt abbilde. Ich fange an, das Gefühl zu bekommen, dass ich etwas wirklich Offensichtliches vermisse. Ich vermute, dass es etwas damit zu tun hat, 13h zu verwenden, um von einer "Diskette" zu lesen, wo ich tatsächlich versuche, die rohe Binärdatei von einem USB zu lesen. Ist das der Fall? Wenn ja, wie kann ich den Bootloader so umschreiben, dass er von einer unspezifischen Diskette statt von einer Diskette liest?

+1

Ich habe mir den Code, den Sie dort haben, nicht angeschaut, da ich sonst auf einen Link klicken müsste ... Wenn der Code jedoch keinen BIOS-Parameterblock enthält, kann ich Ihnen sagen, dass ich wirklich echte Hardware gesehen habe viel findiger als virtuelle Maschinen sind. Stellen Sie sicher, dass Sie eine ordnungsgemäß formatierte BPB haben, und sehen Sie, ob das hilft. –

+0

Ich habe bereits versucht, einen BIOS-Parameterblock hinzuzufügen, und es hat nichts wirklich geändert. – Lobstre

+1

Bitte schreiben Sie den entsprechenden Code inline als [MCVE] –

Antwort

1

Ich habe einige General Bootloader tips geschrieben, die für diesen Code gelten. Insbesondere habe ich diesen Tipp:

  1. Wenn das BIOS, um Ihren Code springt verlassen Sie können nicht auf CS, DS, ES, SS, SP-Register mit gültigen oder erwarteten Werten. Sie sollten beim Starten des Bootloaders entsprechend eingerichtet werden. Sie können nur garantieren, dass Ihr Bootloader von der physikalischen Adresse 0x00007c00 geladen und ausgeführt wird und dass die Boot-Laufwerksnummer in das DL-Register geladen wird.

Das Boot-Laufwerk der ersten Diskette ist in der Regel 0, so dass Ihre wahrscheinlich virtuelle Maschine funktionierte, weil Sie ein Floppy-Disk-Image als virtuelles Laufwerk A montiert gestartet. Der Code, der Ihnen Probleme verursacht, ist in Ihrem Code ReadFloppy. Insbesondere diese Zeile:

MOV DL, 0x0 ;drive 0 = floppy 1 

Sie hart Code Null, wo Sie den Wert vom BIOS weitergegeben verwenden sollten. Auf jedem System, auf dem Sie als etwas anderes als Diskettenlaufwerk A gebootet haben, würde es wahrscheinlich fehlschlagen. Um das Problem zu beheben, entfernen Sie einfach die Zeile oben.

Ich empfehle, die anderen Bootloader-Tipps, die ich in dem bereitgestellten Link zur Verfügung gestellt habe, zu überprüfen.

Verwandte Themen