假设我想在普通操作系统启动之前启动一个小型的Linux发行版。
AFAIK,第4步将是艰巨的任务,在linux之前的所有设备上恢复状态,INT13h是否会正常运行?我是否需要恢复中断向量表?提一下。
这可能是在任何现有项目中完成的吗?
答案 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?