4

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

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

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

这可能在任何现有项目中完成了吗?

4

3 回答 3

4

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

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

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

于 2009-05-14T16:23:02.047 回答
3

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

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

如果您使用 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

于 2009-06-26T19:09:11.113 回答
1

你看过kexec吗?

于 2009-05-12T23:11:58.230 回答