【问题标题】:How can I write a bootloader of my operating system to a USB stick?如何将操作系统的引导加载程序写入 U 盘?
【发布时间】:2015-09-14 15:19:13
【问题描述】:

我尝试为自己的操作系统制作引导加载程序。我尝试使用 imageusb 程序将其写入 USB 记忆棒(格式:img、iso 和 bin,没有任何效果)。然后我尝试启动它,但我在 BIOS 启动菜单中没有找到它。我用汇编对其进行了编码。如何使用自己的引导加载程序引导操作系统?

这是我的代码的一部分:

[BITS 16]
[ORG 0x7C00]

JMP Main

Main:

MOV SI, Text
CALL PrintString
CALL NextLine

MOV SI, PressKeyForBoot
CALL PrintString
CALL Boot
JMP $

PrintCharacter:
MOV AH, 0x0E
MOV BH, 0x00
MOV BL, 0x07

INT 0x10
RET

NextLine:
MOV AL, 0
stosb
mov AH, 0x0E
MOV AL, 0x0D
INT 0x10
MOV AL, 0x0A
INT 0x10
ret

Boot:
CALL RebootKey
db 0x0ea
dw 0x0000
dw 0xffff

RebootKey:
mov ah, 0
int 0x16  
cmp ah, 01h
jne RebootKey

PrintString:
next_character:
MOV AL, [SI]
INC SI
OR AL, AL
JZ exit_function
CALL PrintCharacter
JMP next_character
exit_function:
RET


Text db 'Loading...', 0
PressKeyForBoot db 'Press ESC key to reboot.', 0
TIMES 510 - ($ - $$) db 0
DW 0xAA55

【问题讨论】:

    标签: assembly operating-system boot bootloader


    【解决方案1】:

    要将引导加载程序代码写入 U 盘的第一个扇区,您可以在 Windows 上使用 dmde。打开 dmde 程序并选择正确的物理设备。在下一个屏幕上按f2 显示扇区的原始二进制数据。您必须将引导加载程序写入 USB 记忆棒的前 512 个字节。引导加载程序签名0xAA55 应该是第一个扇区的最后两个字节(即第 510、第 511)。写入数据使用ctrl+e,保存更改使用ctrl+w。有关更多信息,请查看 dmde 窗口顶部的菜单栏。

    完成此操作后,请确保您的 U 盘在 BIOS 启动顺序设置中的优先级高于任何其他具有有效加载程序的磁盘。

    此外,@RossRidge 是正确的,当块设备在第一个扇区中有引导加载程序时,将任何分区标记为活动是无用的。

    P.S.这是我的article(仅限俄语)关于制作您自己的 U 盘引导加载程序。

    【讨论】:

    • @AsdMan,在 Windows 上,您可以使用 diskpart 实用程序将分区标记为可引导。您必须将 U 盘上的分区标记为 active。
    • 如果引导扇区位于 U 盘的第一个扇区,则无需将任何分区标记为活动分区,因为第一个扇区位于任何分区之外。实际上,设备第一个扇区中包含的代码的工作是读取嵌入其中的 MBR 分区表并引导标记为活动的分区。
    • 我不太懂英语你能帮我吗...需要我做这样的事情:tinypic.com/r/rjfaz8/8
    • @AsdMan,我改变了答案。请检查一下。
    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 2011-03-18
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2019-09-20
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多