Shutdown
跳到导航
跳到搜索
为了关闭计算机,你需要使用某种电源管理。 要么是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);