闪存驱动器上的主引导记录不起作用
Master boot record on flash drive doesn't work
我学习纯硬件(没有 OS)编程并且从闪存驱动器启动时遇到问题(使用金士顿 DT101 G2 8Gb)。初始代码,没有备份,我现在不能完全按照原样复制它:(,在模拟器(最新的 Bochs)和实时硬件上都工作得很好。之后添加了更多的功能(转储输出子程序和加载使用函数 42h 或 int 13h 的闪存驱动器扇区)在 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)上写入的相同代码会给出 "Missing operating system..." 消息。我尝试了不同的变体,但仍然无法完成这项工作,也无法弄清楚会发生什么。
这是闪存驱动器问题吗? A 可以回忆一下,几个月前我尝试使用相同闪存模型的 LinuxLive,但在启动 4 - 5 次后它就停止启动了。
这是我使用的:
电脑型号:HP EliteBook 8440p; (免责声明);
CPU:英特尔酷睿 i5 M520 2.40GHz 2 核;
BIOS: 惠普 68CCU Ver. F.0D, 14/07/2010(不知道有没有更新);
编译器:NASM;
磁盘操作软件:DiskProbe V 1.0 (R. Eugene-Baucom, Microsoft)
请帮助我了解发生了什么。
非常感谢。
这是我非常愚蠢的错误...因为当在磁盘探测器的物理驱动器列表中看不到任何内容时,我没有猜测 运行 磁盘探测器作为管理员,而是从逻辑卷列表中进行选择。因此,该工具写入活动分区的 0 扇区,而不是写入整个驱动器的 0 扇区。
这在硬盘上运行完美,但在我使用的两个闪存驱动器上都出现了问题(BIOS 和 Windows + 分区 table 处理中的磁盘探测器之间的不兼容可能或类似的问题)。
所以,幸运的是这个问题很简单。感谢大家的努力。
我学习纯硬件(没有 OS)编程并且从闪存驱动器启动时遇到问题(使用金士顿 DT101 G2 8Gb)。初始代码,没有备份,我现在不能完全按照原样复制它:(,在模拟器(最新的 Bochs)和实时硬件上都工作得很好。之后添加了更多的功能(转储输出子程序和加载使用函数 42h 或 int 13h 的闪存驱动器扇区)在 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)上写入的相同代码会给出 "Missing operating system..." 消息。我尝试了不同的变体,但仍然无法完成这项工作,也无法弄清楚会发生什么。 这是闪存驱动器问题吗? A 可以回忆一下,几个月前我尝试使用相同闪存模型的 LinuxLive,但在启动 4 - 5 次后它就停止启动了。 这是我使用的: 电脑型号:HP EliteBook 8440p; (免责声明); CPU:英特尔酷睿 i5 M520 2.40GHz 2 核; BIOS: 惠普 68CCU Ver. F.0D, 14/07/2010(不知道有没有更新); 编译器:NASM; 磁盘操作软件:DiskProbe V 1.0 (R. Eugene-Baucom, Microsoft)
请帮助我了解发生了什么。 非常感谢。
这是我非常愚蠢的错误...因为当在磁盘探测器的物理驱动器列表中看不到任何内容时,我没有猜测 运行 磁盘探测器作为管理员,而是从逻辑卷列表中进行选择。因此,该工具写入活动分区的 0 扇区,而不是写入整个驱动器的 0 扇区。 这在硬盘上运行完美,但在我使用的两个闪存驱动器上都出现了问题(BIOS 和 Windows + 分区 table 处理中的磁盘探测器之间的不兼容可能或类似的问题)。 所以,幸运的是这个问题很简单。感谢大家的努力。