我试图用汇编语言将引导加载程序写入 USB 驱动器,以便在另一台计算机上进行测试。引导加载程序(应该)适用于英特尔处理器。我测试它的计算机(带有英特尔赛扬和 2 GB 内存的 Windows 7)应该正在运行它,它甚至在 BIOS 中有一个从 USB 驱动器启动的选项(并且它会检测驱动器)。当我从驱动器运行启动时,它会启动到 Windows。它应该显示我的自定义操作系统,它基本上只是一个 Hello-World 类型的汇编程序。我假设这是因为它找不到操作系统:要么是 OS 标签(我找到了应该我是说,如果我将引导加载程序 bin 文件放在第一个扇区中,那么它将被视为“dw 0xAA55”)不正确,USB 驱动器无法启动,或者我只是没有将引导加载程序 bin 文件放在第一个扇区中。
我的问题是:如何测试(a)USB 驱动器是否能够启动操作系统、(b)操作系统是否被识别,以及(c)bin 文件是否位于正确的扇区(第一个扇区)。
以下是汇编代码:
org 7C00h
jmp 0x0:start
start:
cli
mov ax, 0x9000 ;Set up stack
mov ss, ax ;Tell processor where stack is
mov sp, 0xFB00 ;Set stack offset
sti
mov AH, 0Eh ;Tell bios we're writing a char to screen!
mov AL, 'T' ;Load a new character into memory
int 10h ;Call BIOS video interrupt
jmp start ;And so on and so on
times 510-($-$$) db 0 ;Fill rest of sector up with 0s to make this 512B (a sector)
dw 0xAA55 ;Let BIOS know this is an OS! (defines a word)
我对汇编还不太熟悉,所以如果某些行后面的注释与应有的不符,那么可能就是这个原因。谢谢你的帮助!
答案1
您无法从文件系统访问 MBR,它是一个特殊扇区,它始终位于您创建的任何分区之外。
要写入实际的 MBR,您需要使用日(在 Linux 下)或部分复制(适用于 Windows)。我从未使用过 PartCopy,因此无法保证其有效性,但 dd 对我来说是有效的。
dd if=bootsector.bin of=/dev/sda bs=512 count=1
其中 sda 是你的硬盘或 USB 设备的名称,bootsector.bin 是一个平面二进制文件
请注意,“of”选项应指向设备本身,而不是指向该设备上的分区,即 sda1、sda2
你可以使用以下方式编译平面二进制文件国家音乐基金会使用-f 箱选项
同样,您可以通过从第一个扇区读取文件来测试引导扇区是否存在:
dd if=/dev/sda of=mbr_contents.bin bs=512 count=1
用一些十六进制编辑器打开它,看看它是否与原来的相同,或者将其拆开。
您还可以通过从零设备写入来清理引导扇区:
dd if=/dev/zero of=/dev/sda bs=512 count=1
您如何知道操作系统已被识别?如果它击中您的引导扇区,即使您的代码崩溃,它也不会尝试加载另一个引导扇区。BIOS 只检查 0xAA55 标签,将 512 字节加载到内存中并在实际平面模式(默认)下在其上运行 CPU,BIOS 基本上将控制权交给您。接下来发生的任何事情都将是您的代码运行的结果。因此,如果您的代码崩溃,计算机只会呆在那里浪费电力。
据我所知,所有 USB 驱动器都能够存储引导加载程序,只是有些主板在尝试从 USB 驱动器加载时可能会出现故障。我使用备用硬盘驱动器进行尝试,它似乎更可靠。
额外技巧:您可能会觉得每次都必须重新启动计算机很累,因此请考虑使用虚拟机。VirtualBox 很棒,但还有其他的。虚拟盒的用处在于您可以从真实硬盘(或 USB 棒)启动它。您可以通过创建代理虚拟文件系统将虚拟盒连接到真实硬盘:
VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk
-rawdisk /dev/sda
然后,您只需将 vmdk 文件用作常规虚拟文件系统,并像往常一样将引导加载程序写入 sda。非常方便测试!
来源:Virtual Box 手册,第 9 章,高级主题部分:访问整个物理硬盘
您可能可以写入虚拟文件系统本身,但我还没有找到一种简单的方法来做到这一点,这些文件的格式不寻常,所以你不能只使用日在他们。
关于自定义操作系统和引导加载程序的其他一些有用内容:
答案2
a) 尝试从 USB 启动不同的操作系统。必须有关于如何将 Windows 放在 USB 上等的说明。如果成功,则说明您的机器可以做到这一点。
b) 如果您知道您的机器可以启动任何操作系统,那么当它崩溃或显示“hello”时,您就知道它会启动您的操作系统。当它启动到您的常规分区时,您就知道它无法识别操作系统。更多信息请见此处:http://en.wikipedia.org/wiki/Master_boot_record
c) 第一个区域可以通过打开磁盘本身。看看这个:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx,段落“物理磁盘和卷”