2016-11-28 3 views
3

Je sais que cette question a déjà été posée, mais aucune des autres réponses ne semble avoir résolu mon problème. Peut-être que j'ai raté quelque chose?Bootloader ne fonctionne pas sur l'ordinateur réel

Je sais que le .iso fonctionne parce que je l'ai couru dans QEMU et cela a fonctionné avec succès. Alors qu'est-ce que je fais mal?

bits 16 

xor ax, ax 

start: 
    cld    ; Set direction flag to forward 

    ; Set up registers 
    mov ax, 07c0h  ; Segment location which BIOS loads 
    add ax, 288  ; (4096 + 512)/16 bytes 
    mov ss, ax  ; Sets stack segment register 
    mov sp, 4096  ; Sets stack pointer register (offset of stack) 

    mov ax, 07c0h 
    mov ds, ax  ; Sets data segment to where we're loaded 

    mov si, text  ; Puts string into source index 
    call print_string ; Calls print string 

    jmp $    ; Infinite loop to prevent shutdown 

print_string: 
    mov ah, 0eh  ; System call for printing 
    xor bh, bh  ; Sets BH register to 0 

.repeat: 
    lodsb    ; Loads byte into AL 
    cmp al, 0   ; Sees if AL is 0 
    je .done   ; Jumps to done if AL is zero 

    int 10h   ; Otherwise, print 
    jmp .repeat  ; Repeat 

.done: 
    ret 

text db 'Test', 0 

times 510 - ($ - $$) db 0 ; Pads 510 - (current location - start location) zeros 
dw 0xAA55     ; Standard PC boot signature (takes up 2 bytes) 

Edit: J'ai ajouté ce qui suit à mon code:

xor ax, ax 
cld 
xor bh, bh 

Pour créer un iso, je lance les commandes suivantes:

dd if=/dev/zero of=floppy.img bs=1024 count=1440 
dd if=bootloader.bin of=floppy.img seek=0 count=1 conv=notrunc 
mkdir iso 
cp floppy.img iso/ 
mkisofs -o file.iso -b floppy.img iso 

Pour brûler l'iso à mon usb, je cours les commandes suivantes:

umount /dev/sdX 
dd if=/home/mint/Downloads/file.iso of=/dev/sdX bs=4M && sync 
+2

Que faites-vous exactement pour démarrer votre ".iso" sur un ordinateur réel? –

+2

Vous pouvez définir l'indicateur de direction vers l'avant avec _CLD_ puisque vous comptez sur la direction avant avec _LODSB_. Vous ne pouvez pas garantir la direction définie par le BIOS avant d'atteindre votre coe. –

+1

Pour [Int 10h/ah = 0eh] (http://www.ctyme.com/intr/rb-0106.htm), vous voudrez peut-être régler le registre BH sur 0 puisqu'il sert de numéro de page à écrire. . –

Répondre

3

Votre problème est que le "iso" que vous avez créé est une image de disque optique. Il est amorçable sur un ordinateur réel uniquement lorsqu'il est gravé sur un disque optique (par exemple, un CD-R). Lorsque vous l'utilisez avec QEMU, vous l'utilisez apparemment comme un CD-ROM émulé. Lorsque vous le copiez sur votre clé USB, le format n'est pas le bon pour démarrer sur une clé USB. Heureusement, le bon format pour démarrer une clé USB est simple: votre bootloader doit juste être sur le premier secteur du lecteur, comme sur une disquette ou un disque dur. Vous pouvez donc ignorer la création d'une partie "iso" et écrire le secteur de démarrage directement sur le lecteur USB. Par exemple:

dd if=bootloader.bin of=/dev/sdX 
+1

Peut-être que l'OP était troublé par le fait que les images ISO "hybrides" sont maintenant courantes pour les images Linux "live cd": vous pouvez les ajouter aux périphériques USB, car elles ressemblent à une table de partition valide. comme une image bootable ISO9660, et syslinux 3.72 et ultérieur supportant le démarrage de ce. ([Ce blog mentionne brièvement certaines de ces informations] (https://www.turnkeylinux.org/blog/iso2usb) mais il s'agit surtout d'utiliser la commande 'isohybrid'.) –