假设我想在普通操作系统启动之前启动一个小型 Linux 发行版。

  1. BIOS加载MBR并执行MBR。
  2. MBR 定位活动分区,即我的 Linux 分区。
  3. Linux 启动,我执行我需要做的事情。
  4. Linux 关闭,我再次切换到实模式。
  5. 原始分区引导扇区被加载,我的普通操作系统启动。

AFAIK,步骤 4 将是一项艰巨的任务,恢复 Linux 之前所有设备的状态,INT13h 可以正常工作吗?我需要恢复中断向量表吗?仅举几例。

也许在现有的项目中已经这样做过吗?

有帮助吗?

解决方案

Linux 通常不支持这一点,特别是因为它以 BIOS 和 DOS 程序可能不期望的方式重新初始化硬件。然而,有一些基础设施可以在特定情况下切换回实模式 - 特别是重新启动(请参阅 arch/x86/kernel/reboot.c 中的 machine_real_restart ) - 并且具有为 kexec 或挂起重新初始化硬件的代码。我怀疑您也许能够结合使用这些方法来执行某些操作 - 但我不知道结果是否真正符合 DOS 或 Windows 期望在重新启动时看到的结果。

一个更简单的计划是使用链式加载引导加载程序,可以将其设置为在特定配置中引导一次,例如 GRUB. 。您可以调用 grub-set-default,然后重新启动。当 GRUB 出现时,它将控制权交给 Windows。然后将后备操作系统设置为 Linux 分区,控制权将在下次启动时返回到 Linux。

另一种选择可能是使用 核心引导, ,但我不确定这是否已准备好用于启动 Windows。

其他提示

我还没有尝试过,所以我不知道它是否有效,但这里是:

bzImage 格式内核文件的头中有一个选项,指定在保护模式代码开始之前要执行的实模式代码的地址。您可以创建一个最小的 bzImage 兼容文件,该文件没有实际的内核,但具有实模式代码,可以使用 INT 0x13 到 0x7c00 加载 MBR,并像 BIOS 一样跳转到其中。

如果您使用 kexec 使用“-t bzImage-x86 --real-mode”选项加载 bzImage,它应该重置 CR0 中的 PE 位以下降到实模式(如上面提到的 bdonlan)并执行bzImage 标题选项。

bzImage 头选项称为 realmode_swtch ,记录在 /usr/src/linux/Documentation/x86/boot.txt 中,头格式代码位于 /usr/src/linux/arch/x86/boot/header.S 中

你有没有调查过 执行程序?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top