【问题标题】:Custom bootloader not working自定义引导加载程序不起作用
【发布时间】:2017-06-14 17:52:32
【问题描述】:

我使用汇编语言设计了我的自定义引导加载程序(仅显示我的名字。)并使用 NASM 编译它。现在我想将它安装在 USB 中。但找不到任何方法来刻录它。我已经使用 ISOtoUSB、通用 USB、rufus 等不同的实用程序进行了测试。错误来了'图像不可启动。'

但是当我在 oracle 虚拟驱动器上运行相同的程序时,它可以完美运行。

我正在做一些大学项目并且很震惊,我想将该引导加载程序加载到 USB 并且当我从 USB 引导时,我的引导加载程序应该可以工作。

有什么想法吗?

这是我的代码:

[BITS 16]
[ORG 0x7C00]

main:
mov ax, 0x0000
mov ds,ax

mov si, string
call print
jmp $

print:
mov ah,0x0E
mov bh,0x00

.nextchar
lodsb
or al,al
jz .return
int 0x10
jmp .nextchar
.return
ret
string db 'Welcome to the Amul Bhatia Operating System Now Installing....',0
times 510-($-$$) db 0
dw 0AA55h

【问题讨论】:

  • 也许你忘了包含启动签名,如果你不显示代码很难判断。看?你忘了。
  • @Jester - 刚刚添加了代码,你现在可以检查一下.. i
  • 是的,我有,您没有在扇区末尾包含55 AA 所需的引导签名。
  • 我很感激,如果你能帮忙..如何添加 55 AA,我按照 youtube 上的一个教程.. 我不知道,,
  • 你把512改成510了吗?此外,这是一个引导扇区,它不会显示为文件。

标签: assembly x86 bootloader


【解决方案1】:

即使签名到位,您也可能会发现某些硬件无法启动您的映像。似乎某些 BIOS 实现需要在您的映像中存在有效的 BPB(BIOS 参数块)。

您可以考虑将引导加载程序的前几行替换为以下内容:

bits 16

org 0                                   ; BIOS will load the MBR to this location.

bootStart:
                jmp             _start
                nop
                bootDrive       db      'MSDOS6.0'
                bpb
                bps                     dw      512
                spc                     db      8
                rs                      dw      1
                fats            db      2
                re                      dw      512
                ss                      dw      0
                media           db      0xf8
                spfat           dw      0xc900
                spt                     dw      0x3f00
                heads           dw      0x1000
                hidden          dw      0x3f00, 0
                ls                      dw      0x5142,0x0600
                pdn                     db      0x80
                cheads                  db      0
                sig                     db      0x29
                serialno        dw      0xce13, 0x4630
                label           db      'NO NAME'
                fattype         db      "FAT32"

_start:
                                                        ; set up the registers
                mov     ax, 0x07c0
                mov     ds, ax

【讨论】:

  • 我已经用你的代码替换了我的代码,并尝试将iso文件(从bin生成)刻录到USB..没有成功。
  • 您正在启动的系统...它是 EFI 系统吗?如果是,您是否启用了 CSM?
  • 当然,这还不完整...这只是显示了 BPB 的结构...您仍然需要所有引导代码以及最后的 MBR 签名。
  • 哦,你能给我一个完整的在 USB 上工作的引导加载程序的示例代码吗,我的在 oracle 虚拟机上完美工作..系统不是 EFI 系统
【解决方案2】:

您的引导加载程序没有任何问题,除了这个:

times 512-($-$$) db 0

替换为:

times 510-($-$$) db 0

按照您的方式,您的引导加载程序将是 514 字节而不是 512。;-)

【讨论】:

  • 我调整到 510 并尝试在 USB 上刻录相同的。仍然无法作为引导加载程序执行
  • 你正在做其他事情......你的引导加载程序很好并且运行 510 ;-)
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 2011-03-18
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
相关资源
最近更新 更多