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

发布于 2024-07-20 02:46:09 字数 330 浏览 14 评论 0原文

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

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

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

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

Let's say I'd like to start a small linux distro before my ordinary operating system start.

  1. BIOS load MBR and execute MBR.
  2. MBR locates the active partition which is my linux partition.
  3. Linux start and I perform what I need to do.
  4. Linux shut down and I switch to Real Mode again.
  5. The original partition boot sector is loaded and my ordinary OS start.

AFAIK, step 4 will be the difficult task, restore the state on all devices prior to linux, will INT13h be functional? Do I need to restore the Interrupt Vector Table? To mention a few.

Has this been done in any existing project perhaps?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

动听の歌 2024-07-27 02:46:09

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

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

另一种选择可能是使用 Coreboot,但我不确定这是否可以用于生产尚未启动 Windows。

Linux does not normally support this, particularly since it reinitializes hardware in a way that the BIOS and DOS programs may not expect. However, there is some infrastructure to switch back to real mode in specific cases - particularly, for a reboot (see machine_real_restart in arch/x86/kernel/reboot.c) - and has code to reinitialize hardware for kexec or suspend. I suspect you might be able to do something with a combination of these - but I don't know if the result will truly match what DOS or Windows would expect to see on reboot.

A much easier plan would be to use a chainloading bootloader that can be set to boot in a particular configuration once, like GRUB. You could invoke grub-set-default, then reboot. When GRUB comes up, it would then pass control off to Windows. By then setting the fallback OS to the Linux partition, control would return to Linux on the next boot.

Yet another option may be to use Coreboot, but I'm not sure if this is production-ready for booting windows yet.

蓝眼泪 2024-07-27 02:46:09

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

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 中

i haven't tried this so I don't know if it would work, but here goes:

There is an option in the header of a bzImage format kernel file that specifies the address of real mode code to execute before the protected mode code starts. You could create a minimal bzImage-compliant file which has no actual kernel, but which has real mode code to load your MBR using INT 0x13 to 0x7c00 and jmp into it like the BIOS does.

If you use kexec to load the bzImage using the "-t bzImage-x86 --real-mode" options, it should reset the PE bit in CR0 to drop to realmode (as bdonlan above mentioned) and execute the code pointed to by the bzImage header option.

The bzImage header option is called realmode_swtch and is documented in /usr/src/linux/Documentation/x86/boot.txt , the header format code is in /usr/src/linux/arch/x86/boot/header.S

傻比既视感 2024-07-27 02:46:09

您是否研究过kexec

Have you looked into kexec?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文