是否可以关闭Linux内核并在实模式下恢复?

时间:2009-05-12 22:17:04

标签: linux linux-kernel boot bios real-mode

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

  1. BIOS加载MBR并执行MBR。
  2. MBR找到活动分区,这是我的linux分区。
  3. Linux启动,我执行我需要做的事情。
  4. Linux关闭,我再次切换到实模式。
  5. 加载原始分区引导扇区并开始我的普通操作系统。
  6. AFAIK,第4步将是艰巨的任务,在linux之前的所有设备上恢复状态,INT13h是否会正常运行?我是否需要恢复中断向量表?提一下。

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

3 个答案:

答案 0 :(得分:4)

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

更容易的计划是使用链加载引导加载程序,可以设置为在特定配置中引导一次,如GRUB。你可以调用grub-set-default,然后重启。当GRUB出现时,它会将控制权传递给Windows。然后将后备操作系统设置为Linux分区,控制将在下次启动时返回Linux。

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

答案 1 :(得分:3)

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

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

如果你使用kexec使用“-t bzImage-x86 --real-mode”选项加载bzImage,它应该重置CR0中的PE位以降为realmode(如上面提到的bdonlan)并执行指向的代码通过bzImage标题选项。

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

答案 2 :(得分:1)

你有没有看过kexec