例如打印机如何打印页面? CPU将二进制8位代码传送给打印机而不是......那么当我们启动或关闭它时,计算机内部会发生什么?
答案 0 :(得分:14)
原始AT computers使用了{em}仅机械开关的AT PSU来打开和关闭电源:
早期的微电脑电源完全开启或关闭,由机械线电压开关控制,[...]。这些电源通常无法实现省电模式,如待机或软关机等,或预定的开机电源控制。
因此没有被软件关闭。
在1994年,ATX PSU变得流行,这样PSU引入了一个名为 Power ON 的引脚(以下称为 PWON ) + 5V,必须通过主板拉低以激活PSU 1 。
由于PWON是电信号,主板可以实现不同类型的逻辑来打开和关闭电源。
首先引入前面板开关,这是打开/关闭PC的唯一方法
A"软关机"然后引入模式,此模式为不同设备留下一些低功率电源轨以保持活动状态,并通过拉低PWON来唤醒唤醒。
例如:Wake-on-LAN,Wake-on-ring,RTC alarm。
在引入APM之前,软件无法以标准方式关闭PC。
然而,APM最近被ACPI取代,这是一个非常复杂的系统。通过PWON信号可以很难想象关闭电脑所需的功能,所需要的只是告诉连接它的芯片将其释放回+ 5V。 没有标准的方法可以做到这一点,但ACPI的目的是克服制造商之间的差异。
特别是,ACPI定义为了关闭系统,将其置于状态 S5 ,软件需要执行固定的步骤序列。
所有信息都可以在ACPI公开的DSDT (Differential System Descriptor Table)和FACP (Fixed ACPI descriptor table)表中找到。
第一步是调用一个名为\_S5._PTS
的方法,在我的系统中什么都不做:
Method (PTS, 1, NotSerialized)
{
If (Arg0) {}
}
这使主板设计人员有机会执行复杂的操作,因为这种方法是由他们编写的。
另一步是固定的,它是将PC关闭的实际步骤,它包含将值写入寄存器。
感兴趣的注册表(实际上有两个,但我们不在这里讨论)是PM1a_CNT
,在我的系统中被宣传为
[0ACh 0172 12] PM1A Control Block : [Generic Address Structure]
[0ACh 0172 1] Space ID : 01 [SystemIO]
[0ADh 0173 1] Bit Width : 10
[0AEh 0174 1] Bit Offset : 00
[0AFh 0175 1] Encoded Access Width : 02 [Word Access:16]
[0B0h 0176 8] Address : 0000000000001804
告诉我们它位于IO空间 2 中的1804h
。
写入此寄存器的值称为SLP_TYPa
,它位于_S5
对象中,对于我的系统:
Name (_S5, Package (0x04) // _S5_: S5 System State
{
0x07,
Zero,
Zero,
Zero
})
SLP_TYPa
是第一个数字07h
在将此数字写入PM1a_CNT
之前,我们需要将其向左移10并设置其位13,因此要写入的实际值为3c00h
。
要关闭电源,我只需要将3c00h
写入端口1804h
3 :
mov ax, 2007h
mov dx, 1804h
out dx, ax
1 您可以使用回形针将PWON(绿色)短接至GND(黑色),并在未连接PC时将PSU设为ON。 2 我的系统是x86,x86s有两个地址空间:IO和内存 3 启用授权ACPI(将0a0h写入0b2h将在我的系统中启用ACPI)。