【问题标题】:Master boot record on flash drive doesn't work闪存驱动器上的主引导记录不起作用
【发布时间】:2015-09-12 18:03:18
【问题描述】:

我学习纯硬件(无操作系统)编程,但从闪存驱动器启动时遇到问题(使用金士顿 DT101 G2 8Gb)。初始代码,没有备份,我现在无法完全重现它:(,在模拟器(最新的 Bochs)和实时硬件上都运行良好。之后添加了更多功能(转储输出子例程和加载使用 int 13h 的功能 42h 的闪存驱动器中的扇区)在 Bochs 中完美运行,但在实时计算机上却完全无法运行 - 计算机在尝试运行时重新启动。 因此,我将代码简化为最简单的形式,并在开始时修改了段寄存器初始化。这是它现在的样子:

load_address equ 0x7c00                     ;was used earlier but not now, just keeping it if anything

use16                                       ;we start in real mode
bootloader_start:
cli

;setting up the segments
xor ax, ax
mov ss, ax
mov sp, 0x7c00
push word 0x7c0
pop ds
push ds
push word continue
retf

continue:
sti

;copying CS into video memory to check it value (blue background)
mov ax, 0xb800
mov es, ax
mov ax, cs
push ax
mov ah, 0x17
mov [es:0], ax
pop ax
mov al, ah
mov ah, 0x17
mov [es:2], ax


;infinit loop
jmp short $



current_tty_address:        ;was used earlier
dw 0

boot_drive_number:          ;was used earlier
db 0

padding:
;padding to sector size - 2
times 510-($-$$) db 0
dw 0xaa55                   ;mbr identifier

;if comipling for Bochs, padding to hard disk image size (flat mode,   10Mb)
%ifdef BOCHS
padding2:
times 512 * (17 * 4 * 306 - 1) db 0
%endif

但这并不能正常工作。它将一个字符放在第一个屏幕位置 (0, 0),但下一个位置只是黑色(但至少应该有蓝色背景,不管字符代码是什么)。 此外,在不同大小的闪存驱动器(金士顿 DT101 G2,32Gb)上编写的相同代码会显示“缺少操作系统...”消息。我尝试了不同的变体,但仍然无法完成这项工作,也无法弄清楚会发生什么。 这是闪存驱动器的问题吗?可以回想一下,几个月前我用相同的闪存模型尝试了 LinuxLive,在 4 到 5 次启动后它就停止了启动。 这是我使用的: 电脑型号:HP EliteBook 8440p; (脱售); CPU:英特尔酷睿 i5 M520 2.40GHz 2 核; BIOS:惠普 68CCU 版本。 F.0D, 14/07/2010(不知道有没有更新); 编译器:NASM; 磁盘操作软件:DiskProbe V 1.0(R. Eugene-Baucom,Microsoft)

请帮助我了解会发生什么。 非常感谢。

【问题讨论】:

  • 把什么字符放到第一位?
  • 它为C0h代码放置伪符号(单行边框表格的左下角)
  • @Ruslan 你的链接命令是什么样的?
  • @Ruslan :如果您不执行链接步骤,您使用什么nasm 命令来生成引导映像。由于您没有 ORG 语句,除非您另行通知链接器,否则它将为 0。我只是确保我知道这段代码的起点是什么。
  • 嗨迈克尔,我不使用链接。在 Bochs 中运行的 nasm 命令是 nasm -fbin -dBOCHS boot.asm -o boot.bin 对于实时硬件:nasm -fbin boot.asm -o boot.bin 一点更新。昨天我买了一个 Segate 外置硬盘并用它尝试了相同的代码。它奏效了......我不想过早下结论(我的第一个代码也在闪存驱动器上工作)并且会进一步使用我的硬盘来看看它是否会继续工作

标签: assembly operating-system usb-flash-drive mbr


【解决方案1】:

这是我非常愚蠢的错误...因为当在 Disk Probe 的物理驱动器列表中看不到任何内容时,我没有猜测以管理员身份运行 Disk Probe,而是从逻辑卷列表中进行选择。因此,该工具写入活动分区的扇区 0,而不是写入整个驱动器的扇区 0。 这适用于硬盘,但我使用的两个闪存驱动器都出现了问题(BIOS 和 Windows + Disk Probe 在分区表处理中的不兼容可能或类似的东西)。 所以,幸运的是问题很简单。感谢大家的努力。

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多