例如打印机如何打印页面?CPU将二进制8位代码传送给打印机而不是......那么当我们启动或关闭它时,计算机内部会发生什么?
Mar*_*oom 15
最初的AT电脑使用的AT电源其中有只有一个机械开关打开和关闭电源:
早期的微电脑电源完全开启或关闭,由机械线电压开关控制,[...].这些电源通常不具备省电模式,例如待机或"软关闭",或预定的开启电源控制.
因而没有被软件关闭.
在1994年,ATX PSU变得流行,这样的PSU引入了一个名为Power ON(以下称为PWON)的引脚,该引脚被拉至+ 5V并且必须被主板拉下以激活PSU 1.
由于PWON是电信号,因此主板可以实现不同类型的逻辑来打开和关闭电源.
首先引入了前面板开关,这是打开/关闭PC的唯一方法
然后引入了"软关闭"模式,该模式为不同的设备留下一些低功率轨道以保持活动状态并通过拉低PWON来触发唤醒.
例如:LAN 唤醒,Wake-on-ring,RTC警报.
在引入APM之前,软件无法以标准方式关闭PC.
然而,APM最近被ACPI取代,ACPI是一个非常复杂的系统.
由于PWON信号,所以需要对可以用来关闭PC的电源进行成像并不难,所需要的只是告诉连接到它的芯片将其释放回+ 5V.
没有标准的方法可以做到这一点,但ACPI的目的是克服制造商之间的差异.
特别地,ACPI定义为了使系统断电,将其置于状态S5,软件需要执行固定的步骤序列.
所有信息都可以在DSPI(差分系统描述符表)和ACPI公开的FACP(固定ACPI描述符表)表中找到.
第一步是\_S5._PTS在我的系统中调用一个名为的方法:
Method (PTS, 1, NotSerialized)
{
If (Arg0) {}
}
Run Code Online (Sandbox Code Playgroud)
这使得主板设计者有机会执行复杂的操作,因为这种方法是由他们编写的.
另一步是固定的,它是将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
Run Code Online (Sandbox Code Playgroud)
告诉我们它位于1804hIO空间2.
写入该寄存器的值被调用SLP_TYPa,它位于_S5对象中,对于我的系统:
Name (_S5, Package (0x04) // _S5_: S5 System State
{
0x07,
Zero,
Zero,
Zero
})
Run Code Online (Sandbox Code Playgroud)
SLP_TYPa是第一个数字,07h.
在将此数字写入之前PM1a_CNT,我们需要将其向左移动10并将其设置为bit13,因此要写入的实际值是3c00h.
要关闭电源,我只需要写入3c00h端口1804h3:
mov ax, 3c00h
mov dx, 1804h
out dx, ax
Run Code Online (Sandbox Code Playgroud)
1您可以使用回形针将PWON(绿色)短接到GND(黑色),并在未连接到PC时将PSU打开.
2我的系统是x86,x86s有两个地址空间:IO和内存.
3启用授权ACPI(将0a0h写入0b2h将在我的系统中启用ACPI).
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |