gpt4 book ai didi

c - 绕过 BIOS 低级别启动当前操作系统以外的另一个操作系统

转载 作者:行者123 更新时间:2023-12-01 21:30:48 24 4
gpt4 key购买 nike

与当前运行的操作系统(HDD1,分区 1)相比,是否有可能通过 C/Assembler 低级系统调用启动另一个操作系统的引导加载程序(比方说 HDD2,分区 1) ,从而绕过 BIOS?

即如果 Windows 当前正在运行,我们是否可以直接要求系统在 HDD2 分区 1 上启动另一个内核(假设是 Linux),而无需通过 BIOS 进行完全重启

或者这是 C/汇编程序无法做到的?

如果是这样,是什么阻止我们将 HDD2、分区 1、偏移量 0 和以下兆字节加载到内存中,并从那里运行代码? (即终止当前运行的操作系统并启动另一个操作系统)

最佳答案

Or is this out of reach of what C / Assembler can do?

不,他们可以做到这一点,但正是操作系统所做的,实际上,这使得这很难做到。

警告:以下是对发生的事情的粗略描述......

BIOS 会进行一定数量的初始化。它探测设备等,并在 ACPI 界面中显示它发现的内容。

给定操作系统的给定引导加载程序(即引导 block )将从 BIOS 获得控制权。它预计处于 8086/实模式。 (即关闭分页)并加载到给定的实模式地址。

引导加载程序将自行重新定位。它将使用 BIOS 调用从磁盘/分区读取操作系统内核。

然后它将控制转移到操作系统启动代码。

操作系统希望能够使用 ACPI 信息。此外,操作系统可能希望以实模式运行(或它的引导加载程序设置的任何模式)。

第一个操作系统现在将对硬件进行大量初始化。

为了能够为链加载/第二个操作系统提供它期望的环境,当关闭时,第一个操作系统必须将状态恢复到类似于 BIOS 提供的状态。

第一个操作系统执行的一些设备初始化可能会混淆第二个操作系统。因此,它必须非常干净地关闭/重置为硬件的已知状态。例如,禁用分页/MMU,返回到 8086 实模式,将第二个操作系统的引导 block 放在已知/预期的实模式地址并将控制权转移给它。

并非所有 [或许多] 操作系统都设置为执行此操作,因为它并不常见。有些会在初始化期间使用 BIOS [如我所说(例如)ACPI]。但是,某些操作系统最终会放弃 BIOS。

他们必须确保 BIOS 可以 [再次] 运行,因为第二个操作系统的引导加载程序将使用 BIOS 调用从磁盘加载操作系统代码。

可能的。而且,IIRC,一些操作系统能够做到这一点。但是,我不确定 WinX 在这一点上是否合作。

如果系统是 UEFI 系统 [vs.常年的 BIOS]。如果使用安全启动,操作系统启动加载程序包含在一个特殊分区内的 [数字签名] 文件中,该分区具有简单(例如 FAT)文件系统。

关于c - 绕过 BIOS 低级别启动当前操作系统以外的另一个操作系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62505467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com