VirtualBox - No bootable medium found

前端 未结 1 1373
清酒与你
清酒与你 2020-12-18 08:54

There are a lot of question on stackoverflow with the similar title. I read all of them, but none of them answers my problem. This is why I opened this question.

I a

相关标签:
1条回答
  • 2020-12-18 09:31

    You don't provide a minimal complete verifiable example showing a bootloader and how you get it into a VDI. But at a minimum you'll need to place 0xAA55 in the last 2 bytes of the master boot record. The example below creates a simple bootloader; creates a 2MiB raw image; places the bootloader in the raw image; and converts the raw image to a VDI.

    boot.asm:

    BITS 16
    ORG 0x7C00
    
        xor ax, ax
        mov ds, ax
        mov ss, ax       ; Stack below bootloader
        mov sp, 0x7c00
    
        mov ax, 0xb800   ; Video segment b800
        mov es, ax
    
        ; Print Hello with white on light magenta
        mov word [es:0x0], 0x57 << 8 | 'H'
        mov word [es:0x2], 0x57 << 8 | 'e'
        mov word [es:0x4], 0x57 << 8 | 'l'
        mov word [es:0x6], 0x57 << 8 | 'l'
        mov word [es:0x8], 0x57 << 8 | 'o'
    
        ; End with infinite loop
        cli
    endloop:
        hlt
        jmp endloop
    
    ; Fill out to 510 bytes and add boot signature
    times 510 - ($ - $$) db 0
    dw 0xAA55            ; add boot signature at the end of bootloader
    

    I then use this command to create the bootloader file boot.bin:

    nasm -f bin boot.asm -o boot.bin
    

    Create a 2MiB disk image file 1.raw:

    dd if=/dev/zero of=1.raw bs=1024 count=2048
    

    Place the bootloader boot.bin at beginning of file 1.raw without truncating the rest of file:

    dd if=boot.bin of=1.raw conv=notrunc
    

    Create a VDI image called 1.vdi from 1.raw:

    rm -f 1.vdi
    VBoxManage convertfromraw 1.raw 1.vdi --format VDI
    

    When added to a virtual machine under VirtualBox I get this on the display:


    Your VDI File

    In your supplied image file 1.vdi I noticed this when I did a hexdump:

    00200000  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
    *
    002004c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
    *
    00300000
    

    This output suggests to me that you reversed the bytes of the boot signature in your file. It should be 0x55 followed by 0xaa. 0xaa55 as a WORD is stored with the bytes reversed.

    Valid boot medium may be more than just getting the boot signature correct. Some BIOSes may search for certain instructions in the first few bytes that are typically found in bootloaders. Failure to find such instructions (examples often include things like JMP, XOR, CLI, MOV) may cause it to think that it isn't valid boot medium.

    One way to test whether 0xAA55 at the end is enough by itself I used hexedit and modified your 1.vdi file to look like this:

    00200000  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
    00200010  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
    *
    002001f0  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 55 aa <-- Corrected signature
                                                                   at 1fe & 1ff
    00200200  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
    *
    002004c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
    *
    00300000
    

    Running with that change alone didn't work. I then used hexedit and placed a CLI opcode (0xFA) as the first byte of the sector. The resulting file now looked like:

               v-- CLI instruction
    00200000  fa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
    00200010  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
    *
    002001f0  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 55 aa
    00200200  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
    *
    002004c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
    *
    00300000
    

    I have placed fa as the first byte int the bootloader. Now when I use your image the error No bootable medium found! System halted no longer appears. This suggests that VirtualBox is looking for more than a boot signature, and is doing some kind of sanity check to determine if the start of the bootloader appears to be executable instructions. This is not uncommon for BIOSes. Some may do such a check, some may not. At this time I haven't looked over the VirtualBox source code to determine the exact checks it performs to make its determination.

    0 讨论(0)
提交回复
热议问题