2016-09-26 3 views
3

Actuellement, je suis en train d'écrire un petit système d'exploitation à partir de zéro. Malheureusement, dans la première étape, j'ai fait face à un problème qui me rend fou. J'écris le code suivant comme mon bootloader.Bochs ne peut pas charger le fichier img et le charger

.code16     #generate 16-bit code 
.text      #executable code location 
    .globl _start; 
_start:     #code entry point 
    . = _start + 510  #mov to 510th byte from 0 pos 
    .byte 0x55   #append boot signature 
    .byte 0xaa   #append boot signature 

À l'étape suivante, je compile avec les commandes suivantes:

as bootloader.s -o bootloader.o 
ld –Ttext 0x7c00 --oformat=binary bootloader.o –o bootloader.bin 

Puis-je créer un fichier img avec les commandes suivantes:

dd if=/dev/zero of=boot.img bs=512 count=2880 
dd if=bootloader.bin of=boot.img 

Enfin, quand je lance commande bochs dans le terminal, Bochs me montre juste une fenêtre sombre et rien n'est apparu. Qu'est-ce qui ne va pas?

Aussi, j'ai essayé le code suivant comme bootloader, mais le résultat est le même que précédemment.

.code16     #generate 16-bit code 
.text     #executable code location 
    .globl _start; 

_start:     #code entry point 

    #print letter 'H' onto the screen 
    movb $'H' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'e' onto the screen 
    movb $'e' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'l' onto the screen 
    movb $'l' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'l' onto the screen 
    movb $'l' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'o' onto the screen 
    movb $'o' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter ',' onto the screen 
    movb $',' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print space onto the screen 
    movb $' ' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'W' onto the screen 
    movb $'W' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'o' onto the screen 
    movb $'o' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'r' onto the screen 
    movb $'r' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'l' onto the screen 
    movb $'l' , %al 
    movb $0x0e, %ah 
    int $0x10 

    #print letter 'd' onto the screen 
    movb $'d' , %al 
    movb $0x0e, %ah 
    int $0x10 

    . = _start + 510  #mov to 510th byte from 0 pos 
    .byte 0x55   #append boot signature 
    .byte 0xaa   #append boot signature 
+1

Vous devriez au moins faire quelque chose comme 'jmp .' à la fin du code pour entrer dans une boucle infinie sinon vous allez exécuter tout ce qui se trouve en mémoire après ce dernier' int $ 0x10' –

+0

De préférence je ' d do 'endloop: hlt'' jmp endloop' au lieu de ma solution plus simple de 'jmp .' dans le premier commentaire. L'un ou l'autre peut être placé à la fin de votre code. –

+0

hmmm rien n'est apparu à nouveau. bochs montrent juste un écran sombre. :( – Adonaim

Répondre

0

Vous devez créer un fichier bochs pour qu'il fonctionne correctement. Vous pouvez également utiliser une machine virtuelle. Je teste ton code et ça marche bien.

+0

merci, c'est corrigé. – Adonaim