2016-11-28 40 views
3

我知道这个问题以前曾被问过,但其他答案似乎都没有解决我的问题。也许我错过了什么?引导加载程序在实际的计算机上无法正常工作

我知道.iso的作品,因为我在QEMU中运行它,并成功运行。那么我做错了什么?

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) 

编辑:我已经添加了以下我的代码:

xor ax, ax 
cld 
xor bh, bh 

用于创建ISO,我运行以下命令:

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 

刻录的iso我usb,我运行以下命令:

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

你究竟在做什么来启动你的“.iso”在实际的计算机上? –

+2

您可能希望使用_CLD_向前设置方向标志,因为您依靠_LODSB_的向前方向。在达到coe之前,您无法保证BIOS设定了什么方向。 –

+1

对于[Int 10h/ah = 0eh](http://www.ctyme.com/intr/rb-0106.htm),您可能希望将BH寄存器设置为0,因为该寄存器用作要写入的页码。 –

回答

3

您的问题是您创建的“iso”是光盘映像。只有当它被刻录到光盘(例如CD-R)时,它才能在真实计算机上启动。当你在QEMU中使用它时,你显然将它用作模拟CD-ROM。将其复制到USB驱动器时,其格式不正确,无法在USB驱动器上引导。

幸运的是,从USB驱动器引导的正确格式很简单:您的引导加载器只需要在驱动器的第一个扇区上,就像在软盘或硬盘上一样。因此,您可以跳过创建“iso”部分,直接将引导扇区写入USB驱动器。例如:

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

也许OP被混淆的事实是,“混合”ISO映像现在对于Linux“live cd”映像来说很常见:你可以将它们'dd'到USB设备,因为它们看起来像一个有效的分区表,像一个可启动的ISO9660映像,而syslinux 3.72及更高版本支持从此引导。 ([这篇博客简要地提到了一些](https://www.turnkeylinux.org/blog/iso2usb),但主要是使用'isohybrid'命令。) –

相关问题