Shutdown

来自osdev
跳到导航 跳到搜索

为了关闭计算机,你需要使用某种电源管理。 要么是APM要么是ACPI

APM

这是关闭计算机必须给出的APM命令的基本序列。 有关如何实施这些步骤的详细信息,请参阅 APM 文章。

  • 执行安装检查。
  • 检查APM版本是否至少为‘1.1
  • 断开任何现有的APM接口。
  • 连接实模式接口。
  • 告诉APM你的驱动支持1.1版
  • 为所有设备启用电源管理。
  • 将所有设备的电源状态设置为“关闭”(03h)。

如果APM版本是1.0(或者APM没有被告知你的代码支持版本1.1,因此出于遗留目的,它将以1.0运行),则不可能为所有设备设置电源状态 (也许有办法可以单独关闭每个设备)

ACPI

ACPI Shutdown code with good explanation in C

以上论坛帖子中的ACPI关闭摘要:

从技术上讲,关闭ACPI非常简单,只需outw(PM1a_CNT, SLP_TYPa | SLP_EN );,然后计算机就关机了。 问题在于这些值的收集,特别是因为 SLP_TYPa 是在 \_S5 对象中,该对象在 DSDT 中,因此AML被进行了编码。

警告:上述代码不应在生产中使用。 作者跳过了很多事情,比如调用_PTS方法。 需要一个真正的AML解释器,例如ACPICA。

在许多硬件上,需要调用_PTS,不调用它将导致关机失败,或导致硬件在某个半关机阶段冻结。 这种现象大多发生在笔记本电脑上,但也会发生在台式机上。

模拟器专用方法

在某些情况下(例如测试),你可能需要断电方法,但不需要它在真正的硬件上工作。

在Bochs和更早版本的QEMU(低于2.0)中,你可以执行以下操作:

outw(0xB004, 0x2000);

在较新版本的QEMU中,你可以使用:

outw(0x604, 0x2000);

在Virtualbox中,你可以通过以下方式关闭:

outw(0x4004, 0x3400);

另见

文章