繁体   English   中英

Bootloader可在仿真器中工作,但不能在实际硬件上工作

[英]Bootloader works in emulators but not on real hardware

我在组装中编写引导加载程序,它在qemu,bochs和virtualbox上似乎工作正常。 但是,它并没有在实际硬件上加载内核(看来)。

引导加载程序通过将一个字符写入视频内存(用于调试)开始,然后从驱动器中读取扇区2,然后跳转到内核。 然后,内核将一些字符写入视频内存。

在真实的机器上,我从屏幕上的引导加载程序中看到了该字符,并且该字符挂起了(闪烁的插入符号)。

我试图将DS,ES,SI设置为零,并且还在设置堆栈段。

我正在使用bios int 13函数2从驱动器上读取扇区2。我有点怀疑它与驱动器编号有关。 我都尝试使用启动时传递给引导加载程序的驱动器号(在dl中),并将其手动设置为0x0、0x80和0x81。

我注意到的一件奇怪的事是,我用来近跳的标签神奇地获得了正确的地址。 使用objdump可以看到例如:jmp 0x2,而使用gdb和qemu时则显示:jmp 0x7c02。 CS和所有其他段寄存器均为零。 无论我在链接中使用-Ttext 0x0还是-Ttext 0x7c00,引导加载程序都可以在所有仿真器上正常工作。 当我与-Ttext 0x7c00链接时,objdump会说jmp 0x7c02。

编辑,引导程序如下所示:

.code16
.text
movw $0xb800, %ax
movw %ax, %ds
movw $0x0741, (0x0)

xorw %ax, %ax
movw %ax, %ds
movw %ax, %si
movw %ax, %es

movw  $0x8000, %ax
movw  %ax, %ss
movw  $0, %sp

movb $2, %ah
movb $1, %al
movw $0x02, %cx
movb $0x00, %dh

movw $0x5000, %bx
movw %bx, %es
movw $0x0, %bx
int $0x13

ljmpw $0x5000, $0x0000

编辑,第二阶段:

.code16
.text
    movw $0xb800, %ax
    movw %ax, %ds
    movw $0x0742, (0x2)

forever:
    jmp forever

如果您的硬件对USB驱动器使用软盘仿真,则MBR中可能没有适当的BIOS参数块(BPB) ,则可能无法正常启动。 许多BIOS会在引导加载程序启动时尝试检测BPB,甚至在将引导加载程序加载到内存后,甚至可能以适当的驱动器几何形状更新这些值。 您的引导加载程序可能没有被检测为正确的可引导驱动器,或者被引导BIOS覆盖,但是在执行驱动程序之前,BIOS用驱动器的几何信息覆盖了一些代码。

以下内容添加了一个BPB,它看起来像2.88MB软盘。

.global _start
.code16
.text

_start:
    jmp     main
    .space 3 - (.-_start)

    /* Configuration for a 2.88MB floppy using FAT 12 */
    OEMname:            .ascii      "MYBOOT  "
    bytesPerSector:     .word       512
    sectPerCluster:     .byte       1
    reservedSectors:    .word       1
    numFAT:             .byte       2
    numRootDirEntries:  .word       240
    numSectors:         .word       5760
    mediaType:          .byte       0xf0
    numFATsectors:      .word       9
    sectorsPerTrack:    .word       36
    numHeads:           .word       2
    numHiddenSectors:   .long       0
    numSectorsHuge:     .long       0
    driveNum:           .byte       0
    reserved:           .byte       0x00
    signature:          .byte       0x29
    volumeID:           .long       0x54428E71
    volumeLabel:        .ascii      "NO NAME    "
    fileSysType:        .ascii      "FAT12   "

main:
    movw $0xb800, %ax
    movw %ax, %ds
    movw $0x0741, (0x0)

    xorw %ax, %ax
    movw %ax, %ds
    movw %ax, %si
    movw %ax, %es

    movw  $0x8000, %ax
    movw  %ax, %ss
    movw  $0, %sp

    movb $2, %ah
    movb $1, %al
    movw $0x02, %cx
    movb $0x00, %dh

    movw $0x5000, %bx
    movw %bx, %es
    movw $0x0, %bx
    int $0x13

    ljmpw $0x5000, $0x0000

.space 510-(.-_start)
.word 0xaa55

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM