BIOS 通过读取每个引导设备的第一个扇区(512 字节)并检查一组特定的签名字节来从硬盘驱动器(或软盘驱动器)引导计算机。如果找到这些字节,则将 512 字节扇区复制到 ram(在特定位置),然后 BIOS 跳转以运行它。
除了签名字节之外,扇区中的 446 个字节可供您用作引导程序,但引导程序必须完全适合该扇区!由于 446 字节不是很大,您必须调用 BIOS 以将其他扇区从硬盘驱动器(或软盘驱动器或其他)复制到 ram 中以运行它们。
一旦你在 ram 中加载了足够的内容来运行你的程序,跳到它,你就可以开始了。
这就是操作系统如何从字面上“通过自己的引导程序将自己拉起来”
见http://en.wikipedia.org/wiki/Master_boot_record
现在,您没有理由不能用 C 或 C++(或大多数其他语言)编写引导代码,除非使用汇编,您可以确切地知道将生成什么代码并且很容易进行 BIOS 调用。
我建议你写一个 512 字节的磁盘驱动器到 ram copier,将你的程序从磁盘加载到 ram 中,然后跳转到程序的起始地址。然后,您可以用您想要的任何语言编写程序。请记住,当您的启动代码开始运行时,这 512 个字节是您唯一可以依靠的,就像在 ram 中一样。(好吧,BIOS 在那里,您可以进行 BIOS 调用。BIOS 还会在 ram 中的某些位置放置一些系统信息……)自己将它们加载到ram中。
此外,测试代码的最简单方法可能是将其放在软盘上并启动。
要回答您最初的问题,您可以在某处保留旧 MBR 的备份副本,并且您的新 MBR 可以将您的功能加载到 ram 中,运行它,然后加载原始 MBR 并运行它,允许 Windows 继续启动。
此外,迈克尔·伯尔是对的,得到你想要的东西将是一场噩梦。
为了回答您关于如何在硬盘驱动器上实际写入的评论,有几个“原始写入”程序可以复制到磁盘上的扇区。此外,您可以从 linux live cd 启动并使用 dd 将数据写入您选择的块设备上您选择的扇区。——简单的那部分。