用于挂起系统的多功能电源 开关和反馈发光二极管
本发明涉及到下列未决的申请:
申请第08/097334号,1993年7月23日提出,题为“带有单一开关挂起/继续功能的台式计算机”(委托案第BC9-93-018(21322/00158)号);
申请第08/097250号,1993年7月26日提出,题为“具有零电压系统挂起的台式计算机系统”(委托案第BC9-93-016(21322/00161)号);
申请第08/097246号,1993年7月23日提出,题为“保存和恢复在受保护方式下执行代码的CPU的状态的方法”(委托案第BC9-93-017(21322/00162)号);
申请第08/097251号,1993年7月26日提出,题为“具有多级电源管理的台式计算机系统”(委托案第BC9-93-015号(21322/00163)号);
申请第08/303102号,1994年9月7日提出,题为“挂起系统中电源故障的自动排除”(委托案第BC9-94-043(21322-00197)号);
申请第08/302148号,1994年9月7日提出,题为“挂起文件的自动分配”(委托案第BC9-94-044(21322/00198)号);
申请第08/279639号,1994年7月25日提出,题为“用于挂起系统的电源管理处理器”(委托案第BC9-94-103(21322-00203)号);
申请第08/302157号,1994年9月7日提出,题为“用于计算机系统唤醒的低功率振铃检测”(委托案第BC9-94-110(21322-002404)号);
申请第08/301464号,1994年9月7日提出,题为“断电时用系统管理中断执行系统任务”(委托案第BC9-94-112(21322-00206)号);
申请第08/302066号,1994年9月7日提出,题为“掉电之后用户选择的自动恢复”(委托案第BC9-94-113(21322-00207)号);
申请第08/303103号,1994年9月7日提出,题为“用于防止数据丢失的待机检查点”(委托案第BC9-94-114(21322-00208)号);
申请第1号,1994年月日提出,题为“用于高级电源管理(APM)的自动备份系统”(委托案第BC9-94-01118号);
本发明在总体上涉及计算机系统的结构,具体地说,涉及到一种具有系统挂起/继续能力的台式计算机系统,该系统带有一多功能开关和受BIOS支持的发光二极管(LED),所说的开关能进行状态转换,从而使系统更便于使用。
个人计算机系统在本技术中是周知的。一般的个人计算机系统特别是IBM个人计算机系统业已有广泛的应用,从而为当今社会的许多方面提供了计算机的威力。个人计算机一般界定为台式微机、落地式微机或便携式微机,它包括:一系统组件,此组件带有一个单一的中央处理单元(CPU)以及包括所有RAM和BIOSROM在内的相关易失性和非易失性存储器,一系统监视器、一键盘、一个或多个软盘驱动器、一固定的磁盘存储器(也称为“硬盘驱动器”)、一称为“鼠标器”的指点设备以及一可选择的打印机。这类系统的显著特点之一是使用了母板或系统主板以便将上述组件以电气的方式连接在一起。这类系统最初设计成给单用户以独立的计算能力并且具有不贵的价格,以便个人或小型公司购买。这类个人计算机系统的实例是IBM中PERSONALCOMPUTER AT和IBM的PERSONAL SYSTEM/1(IBM PS/1)。
个人计算机通常用于运行软件以执行各种活动,如字处理、通过电子数据表格进行数据处理、在数据库中收集数据并建立数据之间的联系、显示图形、用系统设计软件设计电子或机械系统等等。
上述申请书中的前四个相关的申请公开了一种具有四种电源管理状态的计算机系统,这四种状态是:正常操作状态、待机状态、挂起状态和关机状态。用一个开关在关机状态、正常操作状态以及挂起状态之间进行状态改变。
本发明之计算机系统的正常操作状态实际上与一般台式计算机的正常操作状态相同。用户可以使用应用程序并基本上同其它计算机一样对待这种计算机。一个不同就是存在有电源管理驱动程序,该程序在后台运行(在BIOS和操作系统中运行)并且对用户是透明的。该电源管理驱动程序在操作系统(OS)中的那部分是由Intel和Microsoft公司所写的高级电源管理(APM)的新式程序设计接口,这种接口存在于大多数在Intel 80x 86系列处理器上运行的操作系统中。上述电源管理驱动程序在BIOS(APMBIOS)中的那部分与APM OS驱动程序互通。APM OS驱动程序和APM BIOS例程一道控制着计算机向上述其它三种状态的转换以及来自这三种状态的转换。
第二种状态即待机状态,它比正常操作状态使用更少的电量,但仍使任何应用程序象它们在其它情况下运行一样地运行。一般地说,在待机状态下,通过使各设备处于相应的低功耗状态而节省了电能。例如,在待机状态下通过使磁盘驱动器内的固定式磁盘停止旋转以及通过停止生成视频信号,可以节省电能。
第三种状态是挂起状态。在挂起状态下,计算机系统消耗极小量的电能。挂起的计算机消耗很少的来自壁装电源插座的电量。仅有的功耗是用于维持监控计算机系统内部电池的开关的电路的少量功耗(当计算机系统不接收交流电时)或者是电源在辅助电源线上所产生的少量功耗(当计算机系统接收交流电时)。
通过在电源关闭之前将计算机的状态保存到固定磁盘存储器(硬盘驱动器)中,可以实现少量的用电。为了进入挂起状态,计算机系统中断任何正在执行的代码并把对计算机的控制权交给电源管理驱动程序。该电源管理驱动程序确定计算机系统的状态并将该状态写至固定磁盘存储器。CPU寄存器、CPU高速缓冲存储器、系统内存、系统高速缓冲存储器、视频寄存器、视频内存以及其它设备寄存器等的状态全都写至固定磁盘。将系统的整个状态以这样的方式保存起来:在中断不对代码应用程序产生不利影响的情况下将计算机系统的状态保存起来。然后,计算机将数据写入非易失性CMOS存储器中以指示系统已挂起。最后,计算机使电源停止供电。计算机的整个状态可靠地保存在固定磁盘存储器中,系统功耗当前处于“停止”,这时,计算机只从电源中接收少量的稳压电力以供应监控开关的电路。
第四种也是最后一种状态是关机状态。在这种状态下,电源停止向计算机系统提供稳定的电能,计算机系统的状态也不保存在固定磁盘内。这种关机状态实际上等同于按通常的方式关闭一般的台式计算机。
从一种状态到另一种状态的转换是由电源管理驱动程序控制的并且通常是以一个开关、一个标志以及两个计时器即不活动性待机计时器和不活动性挂起计时器的关闭事件为基础的。所述计算机系统带有一个单一的电源开关,此开关用于开启计算机系统,挂起计算机系统的状态、恢复计算机系统的状态以及关闭计算机系统。
上述挂起/继续系统的一个关键方面就是用户的认可。如果用户发觉用于在各种状态之间进行转换的用户界面麻烦或混乱,那么,用户甚至可能不使用系统附加的节电特征。申请第08/097334所公开的系统在减少用户进行电源管理状态转换时产生混乱方面前进了一大步,该申请于1993年7月23日提出,题为“带有单开关挂起/继续功能的台式计算机”。但是,在该系统中,系统响应按下电源开关要花数十秒钟才能使系统挂起。所需要的是一旦按下电源开关就能立即使系统挂起的方法。
立即挂起的一个问题是系统以之为基础的高级电源管理(APM)驱动器具有这样一段时间,在这段时间里没有APM驱动程序在活动。具体地说,在DOS/Windows环境下,存在着一个APM设备驱动程序已被断开、而下一个APM驱动程序尚未连上的情况。例如,当计算机系统使操作系统从DOS转换成Windows或返回时以及当计算机系统使操作系统从Windows的标准模式转换成全屏DOS对话时,这两种都是非常普遍的转换,这时,在一个APM驱动程序断开与另一个APM驱动程序重新接上的时间之间的APM覆盖域内存在有间断。
用户界面的另一个问题是,在待机状态下显示器不作显示。使用该系统的用户可能会注意到监视器未作显示,从而以为系统处于挂起状态或关机状态,于是会按下电源开关以试图使系统进入正常操作状态。但是,按下电源开关却使系统进入挂起状态或关机状态,因而用户恰好使计算机关闭或挂起,这与用户的目的正好相反。利用用户界面的另一个问题是,无论是系统处于挂起状态还是关机状态,如果业已接收到传真或某种语音邮件(假定使用了语音邮件的调制解调器和软件)并且计算机在此之后关闭或挂起,那么,对用户来说,没有通用的方法去了解有项目被接收到并正在等待处理。
依照本发明,给计算机系统增加一电源管理处理器并配置成按下电源开关就会使系统从关机状态、挂起状态或待机状态转换至正常操作状态。这样,在待机状态下按下电源开关时会使系统从待机状态转变成正常操作状态。靠设置在电源管理处理器内的故障保险计时器的到时可使状态转换达到所要求的状态。如果故障保险计时器已到时,按下电源开关会立即进行状态转换。
在APM覆盖域中有间断的时候,通过不允许立即进行状态转换而填补了APM驱动程序中的间断。更正确地说,所说的系统会监控各个APM驱动程序的连接与断开,并在APM中有间断的情况下使电源管理处理器不去进行状态转换。最佳的是,系统将电源管理处理器中的故障保险计时器重新启动成一定的值,该值能使得状态转换逻辑“桥接”APM中的间断。
依照本发明,微控制器控制着一发光二极管(LED)或其它可视的指示器以便向用户提供有关计算机系统状态的可视反馈。最佳的是使用了功率LED。在业已接收到信息并且随后关闭机器时,LED会闪亮,从而通知用户有一个信息在等待。LED可以闪烁以指示在用户离开的一段时间内接收的信息数目。BIOS调用可以通过诸如使LED的闪烁序列增加一次而使得各种应用程序影响反馈LED的状态。
本发明的上述及其它优点会从对本发明的详细说明中更明显地表现出来。
包括在本说明书中并构成本说明书一部分的附图,连同以上对本发明的总体描述,说明了本发明的实施例,并且,以下给出的详细说明用于例证本发明的原理。
图1是体现本发明的个人计算机的透视图;
图2是图1中个人计算机某些部件的分解透视图,它包括一机箱、一罩盖、一机电直接存取存储器以及一主板并说明了这些部件之间的特定关系;
图3A和图3B显示了图1和图2中个人计算机某些组件的框图;
图4为本发明之计算机系统的状态图,它显示四种系统状态:正常状态、待机状态、挂起状态和关机状态;
图5是显示电源有关部分的框图;
图6A为本发明之电源管理电路的概略电路图,它显示了与其它图的各个接口;
图6B是使上述电源管理电路与内部调制解调器相连的概略电路图;
图6C是显示用于上述电源管理电路的复位电路中各个信号的波形图;
图6D是电源故障检修电路第二实施例的概略电路图;
图7是由本发明之电源管理处理器所维持的开关状态之一的状态图;
图8是总体上显示本发明加电例程的流程图;
图9A是管理例程的详细流程图,操作系统中的APM设备驱动器大约每一秒钟调用该管理例程;
图9B是显示APM处理最近请求例程(APM Working OnLast Request Routine)细节的流程图;
图9C是显示APM拒绝最近请示例程(APM Reject ONLast Request Routine)细节的流程图;
图10是显示本发明之挂起例程(Suspend Routine)细节的流程图;
图11是显示本发明之引导例程(Boot-up Routine)细节的流程图;
图12是显示本发明之继续例程(Resume Routine)细节的流程图;
图13是显示本发明之保存CPU状态例程(Save CPU StateRoutine)细节的流程图;
图14是显示本发明之恢复CPU状态例程(Restore CPUState Routine)细节的流程图;
图15是显示本发明之保存8959状态例程(Save 8959 StateRoutine)细节的流程图;
图16是显示本发明之动态保存文件分配例程(DynamicSave File Allocation)细节的流程图;
图17是显示本发明的退出待机状态例程(Exit StandbyRoutine)细节的流程图;
图18是显示本发明之进入待机状态例程(Enter StandbyRoutine)细节的流程图;以及
图19是显示本发明之电源管理处理器例程(PowerManagement Processor Routines)细节的流程图。
在以下参照显示本发明之最佳实施例的附图详细说明本发明时,从以下说明的一开始就应该认识到,本技术的专家可以改进本文所述的发明,但仍能获得本发明的良好结果。因此,应该将以下的说明理解为是以本技术的专家为对象的广义的教导性公开,并且不限制本发明。本发明涉及到计算机系统的整体设计,包括但不局限于计算机体系结构设计、数字设计、BIOS设计、保护模式的80486代码设计、应用程序代码设计、操作系统代码设计以及高级电源管理的新式程序设计界面的使用。
参照附图,显示了体现本发明的微机系统并总体上用标号10表示(图1)。如上所述,计算机10带有相连的显示器11、键盘12、鼠标器13以及打印机或绘图仪14。计算机10带有:一罩盖15,此罩盖由装饰性外部部件16(图2)以及一内部保护部件18构成,此部件与机箱19相连从而确定了一封密有屏蔽的空间以便接收加电的数据处理和存储组件,这些组件用于处理和存储数字数据。这些组件中的至少某一些安装在多层主板20或母板上,而主板则安装在机箱19上并提供了使计算机10的组件相互电连接的装置,所说的组件包括上述组件以及其它相关的部件如软盘驱动器,各种形式的直接存取存储器、附件的适配器卡或适配器板以及类似的部件等。正如以后将要详细说明的那样,在主板20上设置了朝向或来自微机操作组件的输入/输出信号的通路。
所说的计算机系统带有:一电源17;一电源按钮21,下文中称开关21;以及一电源/反馈LED23。与一般系统内的通常电源开关不同,电源按钮21并不将交流电切换至电源17或从该电源17切换,这将在以下予以说明。机箱19带有:标号22所示的底座;标号24所示的前部面板;以及标号25所示的后部面板(图2)。前部面板24限定了至少一个开放的凹槽(在所示的图中有四个凹槽),以便接收诸如磁盘或光盘驱动器、后备磁带机之类的数据存储装置或类似的设备。在所示的图中设置了一对上部凹槽26、28以及一对下部凹槽29、30。上部凹槽中的一个26用于接收第一尺寸的外部设备(如3.5英寸的驱动器),另一个28则用接收两种尺寸(如3.5和5.25英寸)中选定的一种驱动器,下部凹槽用于接收一种尺寸(3.5英寸)的驱动器。图1中标号27表示一软盘驱动器,此驱动器是一可装卸式直接存取存储器,这种存储器可以接收插进来的软盘并如众所周知的那样用软盘接收、存储和传送数据。标号31表示一硬盘驱动器,此驱动器是一固定式直接存取存储器,这种存储器可以如众所周知的那样存储和传递数据。
在说明上述结构与本发明的关系之前,有必要概述一下个人计算机系统10的通常操作。参照图3A和图3B,显示了个人计算机系统的框图,该框图说明了诸如本发明之系统10之类的计算机系统的各种组件,包括安装在主板20上的组件以及主板与I/O槽和个人计算机系统其它硬件的连接件。与主板相连的是系统处理器40,也即CPU40,它包括一微处理器,该微处理器通过高速CPU局部总线42与内存控制部件46相连,而内存控制部件则又与易失性随机存取存储器(RAM)53相连。内存控制部件46包括内存控制器48、地址多路复用器50以及数据缓冲区52。内存控制部件46还与由四个RAM组件54所表示的随机存取存储器53相连。内存控制器48包括逻辑线路,此逻辑线路用于把去往和来自微处理器40的地址映射到RAM53的特定区域。所说的逻辑线路用于回收先前被BIOS占用的RAM。此外,内存控制器48还生成ROM选择信号(ROMSEL),此信号用于启动或中止ROM88。虽然任何适当的微处理器都可用作系统处理器40,一种合适的微处理器是INTEL公司出售的80486。Intel 80486带有内部高速缓冲存储器,所以是Intel 80486的任何CPU40都带有CPU高速缓冲存储器41。
虽然在下文中是参照图3A和图3B的系统框图来说明本发明的,但是,在以下说明的一开始就应理解,本发明的设备与方法可和主板的其它硬件配置一道使用。例如,系统处理器40可以是Intel 80286或80386微处理器。正如本文所使用的那样,凡涉及到80286、80386或80486一般均指可从Intel公司获得的微处理器。但是,最近也有其它生产者业已开发出了能执行Intel X86结构的指令集的微处理器,因而所述术语的用法包括了任何能执行该指令集的微处理器。正如本技术的专家所熟知的那样,早期的个人计算机一般把那时流行的Intel 8088或8086微处理器用作系统处理器。这种处理器具有一兆字节内存的寻址能力。最近,个人计算机一般都使用高速的Intel 80286、80386以及80486微处理器,这些微处理器能以虚模式或实模式运行来仿真较低速度的8086微处理器,或者以保护方式运行,从而对某些机型来说可将寻址范围从一兆字节扩大至四千兆字节。从本质上说,80286、80386以及80486处理器的实模式的特征使得硬件与为8086和8088微处理器所写的软件相兼容。所述Intel系统的微处理器通常只用涉及到整个类型符后三位数字的三位数来表示,如“486”等。
以下回到图3A和3B,CPU局部总线42(包括未显示的数据,寻址和控制组成部分)将微处理器40、数字协处理器44(如果不在CPU 40内的话)、视频控制器56、系统高速缓冲存储器60以及高速缓冲存储器控制器62连接起来。视频控制器56带有与之相联的监视器(或视频显示终端)11以及视频存储器58。缓冲器64也连在CPU局部总线42上。缓冲器64又与(和CPU局部总线42相比)速度较低的系统总线66相连,系统总线也包括地址、数据和控制组成部分并且在缓冲器64与另一缓冲器68之间延伸。系统总线66还与总线控制及定时部件70和DMA(直接存储器存取)部件71。相连DMA部件71包括中央仲裁器82以及DMA控制器72。辅助缓冲器74提供了系统总线66与诸如工业标准结构(ISA)总线之类的可选的特性总线76之间的接口。总线76与多个用于接收ISA适配器卡(未显示)的I/O槽78相连。ISA适配器卡以插接的方式与I/O槽78相连并为系统10提供了附加的I/O设备或存储器。
仲裁控制总线80将DMA控制器72及中央仲裁器82与I/O槽78、磁盘适配器84及集成驱动器电子线路(Integrated DriveElectronics-IDE)的固定磁盘控制器86相连。
虽然显示出微机系统10带有基本的四兆字节RAM组件53,但应该注意,也可以通过增加可选的高密度存储器组件54而如图3A和图3B所示那样连上附加存储器。仅从说明的角度出发,参照基本的四兆字节存储器组件来说明本发明。
锁存缓冲器68连接在系统总线66和主板I/O总线90之间。主板I/O总线90包括地址、数据和控制组成部分。沿着主板I/O总线90连接有多个I/O适配器与其它组件,如磁盘适配器84,IDE盘适配器86,中断控制器92,RS-232适配器、本文称之为NVRAM的非易失性CMOS RAM96,CMOS实时时钟(RTC)98、并行适配器100、多个计时器102、只读存储器(ROM)88、8042 104以及电源管理电路106。标号104所示的8042是与键盘12与鼠标器13相连的从属微处理器。电源管理电路106在电路上与电源17,电源开关21、电源/反馈LED23以及内部调制解调器900和/或外部调制解调器902相连。正如本技术的专家所熟知的那样,外部调制解调器通常与变压器904相连,而该变压器又与壁装电源插座相连。调制解调器900、902与通常的电话口相连。电源管理电路106显示在图6A及图6B中并在与图6A、图6B、图6C以及图7有关的内容中予以更全面的说明。只读存储器88包括BIOS,BIOS用于连接I/O设备与微处理器40的操作系统。存储在ROM88中的BIOS可拷贝到RAM53以便减少BIOS的执行时间。ROM88还可响应内存控制器48(通过ROMSEL信号)。如果用内存控制器48启动ROM88,BIOS就会从ROM中执行。如果内存控制器48终止了ROM,则ROM不响应来自微处理器40的地址查询(即BIOS从RAM中运行)。
实时时钟98用于计算日期的时间,NVRAM96用于存储系统配置数据。也就是说,NVRAM96包含说明系统当前配置的值。例如,NVRAM96包括说明固定盘或软盘容量、显示器类型、内存量、时间、日期等的信息。此外,每当运行诸如SET配置之类的特定配置程序时,上述数据都存储在NVRAM中。上述SET配置程序的目的是把描述系统配置的值存储到NVRAM内。
几乎所有的上述设备都包括易失性寄存器。为了避免对附图作不必要的分类,特定设备的寄存器总是涉及到该设备。例如,CPU寄存器称为CPU40的寄存器,视频控制器寄存器称为视频控制器56的寄存器。
如上所述,所说的计算机带有一总体用标号15表示的罩盖,此罩盖与机箱19相配合形成一封密有屏蔽的空间,该空间用于包容微机的上述组件。罩盖15最好形成有外部装饰性罩盖部件16以及薄金属板衬里18,所说的外部装饰性罩盖部件是一成整体的模制组件,由可模制的合成材料构成,而薄金属板衬里则呈符合上述装饰性罩盖部件结构的形状。但是,也可以以其它周知的方式形成前述罩盖,本发明的实用性并不局限于上述类型的外罩。操作的状态
参照图4,显示了本发明之计算机系统的状态图。本发明的计算机系统10具有四种状态:正常操作状态150、待机状态152、挂起状态154以及关机状态156。图4所示的状态之间的转换用于说明最佳实施例,但不限定最佳实施例。因此,也可以用其它的事件来导致状态转换。
本发明之计算机系统10的正常操作状态150实际上等同于任何通常的台式计算机的正常操作状态。用户可以使用应用程序并且基本上把上述计算机看作是任何其它的计算机。一个不同点是在操作系统中有在后台运行的电源管理驱动程序(“APM OS驱动程序”)以及多种APM BIOS例程,它们对用户是透明的。APM BIOS例程将在以后说明,它们中包括挂起例程、继续例程、引导例程、管理例程、保存CPU状态例程以及恢复CPU状态例程。所有附图中都未示出的一个APM BIOS例程是APM BIOS路由选择例程。APM BIOS路由选择例程主要从APM OS驱动程序中接收指令并调用适当的APM BIOS例程。例如,在APMOS驱动程序发出Suspend(挂起)指令时,APM BIOS程序选择例程就会调用挂起例程。作为另外一个实例,每当APM OS驱动程序发出Get Event(获取事件)指令时,APM BIOS路由选择例程都会调用管理例程。上述例程处于BIOS内并在投影BIOS时被投影掉。OS内的电源管理驱动程序以及APM BIOS例程控制着计算机在四种状态之间的转换。虽然上下文可能有所限定,但对“APM”一词的引用通常就是指APM OS驱动程序。
第二种状态即待机状态152要比正常操作状态150使用更少的电能,但能使应用程序象在其它情况下运行的那样运行。一般地说,在待机状态152下可通过代码将设备设置成各自的低功耗方式而节电。在所述的最佳实施例中,正如以下将会详细说明的那样待机状态152通过使固定磁盘存储器31内的固定磁盘(未显示)停止转动、通过停止生成视频信号以及通过将CPU 40设置成低功耗方式,从而节约了电能。但是,这并不是一种限制,而是可以使用其它方法如减慢或停止CPU时钟等来降低功耗。
在所说的最佳实施例中,以三种独立的方式节约电能。第一,在正常操作状态150下,固定磁盘存储器31内的固定盘以例如3600转/分(RPM)、4500转/分(RPM)或5400转/分(RPM)的转速不断旋转。在待机状态152下,给IDE盘控制器86以指令从而使固定磁盘存储器31进入低功耗方式(固定磁盘存储器31内的固定磁盘停止转动),因此节省了固定磁盘存储器31内的电机(未显示)在使固定磁盘旋转时所消耗的电能。
第二,在正常操作状态150下,计算机系统的视频控制器56不断地产生对应于在视频显示终端11所看到的图象的视频信号(诸如本技术中所周知的HSYNC、VSYNC、R、G、B等等)。在待机状态152下,视频控制器56停止产生视频信号,从而节约了通常被视频控制器56所消耗掉的电能,HSYNC、VSYNC、R、G、B等信号均近似为0.00VDC。使用VESA(视频电子线路标准协会)监视器会进一步节电,这是因为,当HSYNC和VSYNC近似为0.00VDC时,VESA监视器会关闭自身。
第三,在正常操作状态150下,CPU40不断地执行指令,因而消耗了电能。在待机状态152下,BIOS响应AMP CPU的空调用(Idle Call)而发出HALT(停机)指令。执行HALT指令会明显地降低CPU的能耗直至发生下一个硬件中断。CPU确实空闲时会在90%以上的时间内停止运转。
请注意,某些系统带有“屏幕保护程序”(Screen-savers),这种程序能使屏幕11变暗以防止视频显示终端前表面荧光物质老化。在大多数这种系统中,视频控制器56仍产生视频信号,只是产生对应于黑暗屏幕或动态显示的视频信号。因此,执行屏幕保护程序的计算机系统仍消耗电能,这些电能是产生上述视频信号所必需的。
第三种状态是挂起状态154。在挂起状态154下,计算机系统消耗非常少的电能。在所述的最佳实施例中,挂起的计算机消耗少于100毫瓦的电能。仅有的功耗是由电源17的低效率以及电源管理电路106使用的少量电能所导致的约为5瓦的功耗。
通过在关闭电源之前将计算机系统的状态保存至固定磁盘存储器(硬盘驱动器)31,可以实现上述少量的用电。为了进入挂起状态154,CPU40中断任何的应用程序并将CPU的程序执行控制权转交给电源管理驱动程序。电源管理驱动程序确认计算机系统10的状态并将该计算机系统的全部状态写至固定磁盘存储器31。将CPU40的寄存器、CPU高速缓冲存储器41、系统RAM53、系统高速缓冲存储器60、视频控制器56的寄存器、显示器内存56以及其它易失性寄存器的状态均写入固定磁盘驱动器31。以这样的方式保存系统10的整个状态,即:可在不明显损失有效性的情况下恢复该系统的状态。也就是说,用户不必等待系统象通常那样加载操作系统、加载图形用户界面以及应用程序。
然后,所述计算机将数据写入非易失性CMOS存储器96以指示系统被挂起。最后CPU40指令微处理器40使电源17停止经由±5VDC和±12VDC线向计算机系统提供稳压的电力。这时计算机系统10处于降低功耗的状态,而且,该计算机的整个状态被安全地存储到了固定盘存储器31上了。
在本文中以两种类似但可能混淆的方式使用“状态”一词。设备可以“处于”特定的状态。四种系统状态—正常150、待机152、挂起154以及关机156—均涉及到本发明之计算机系统10的整体状态。这些“状态”以通常的方式描述了计算机系统10。例如,在处于正常操作状态150时,CPU40仍在执行代码并能改变系统10内的多个寄存器。同样,在处于待机状态152时,会产生类似的活动。因此,当计算机系统10处于正常操作状态150和待机状态152时,系统10的内存与寄存器的配置是动态的。
其它设备也可以“处于”某种状态。电源管理电路106最好使用一第二处理器作为电源管理处理器,如图6A中所示的微控制器U2,以便实现各种电源管理特征。多种这样的处理器都是适用的,在所述的特定实施例中,电源管理处理器是预先编程了的83C750微控制器。正如与图6A有关的内容所要说明的那样,微处理器U2的变量和引线可处于好几种状态。
设备的“状态”如“计算机系统10的状态”或“CPU40的状态”与以上内容相对比,设备的“状态”涉及到该设备在特定计算机工作周期内的状况。所有的内存存储单元和寄存器均具有特定的二进制值。一个设备的“状态”是该设备内容的静态二进制快照。
计算机系统10的“状态”是指操作性等价值但不一定是精确的拷贝。例如,状态A下的计算机系统可能在CPU高速缓冲存储器41或系统高速缓冲存储器60内有某些存储内容。可能会将各高速缓冲存储器的内容“倾泻”进系统RAM53并将计算机系统设置成状态B。单纯地说,计算机在状态A下的状态不同于该计算机在状态B下的状态,这是因为,高速缓冲存储器的内容与系统RAM的内容是不同的。但是,从软件操作性的观点来看,状态A和状态B是相同的,这是因为,除系统速度略有降低(这是由程序不具有从高速缓冲存储器中执行的有利条件所引起的)以外,正在执行的程序不受影响。也就是说,尽管高速缓冲存储器已被清空的计算机在效率方面略有降低直至用有用的代码重新加载该高速缓冲存储器的区域,但状态A下的计算机与状态B下的计算机在软件操作性方面是等价的。
按两种类似但可能混淆的方式使用“Power”一词,“Power”大多数情况下是指电能。但“Power”也偶而指计算的功率。上下文将清楚地表明特定的用法。
“电路”通常指物理上的电子设备或多个相互电连接的设备,但“电路”一词也包括物理电子设备的等效CPU代码。例如,一方面,可用74 LS00或等价地在可编程设备中实现两个输入的与非门。这两个设备是物理的电子设备。另一方面,也可以通过使CPU40从两个CPU可读输入端口读出两个输入、利用CPU指令生成与非的结果并将该结果经由CPU可写输出端口输出,从而实现与非门。上述CPU接口端口可以是诸如解码的锁存器之类的简单设备,也可以是等效的可编程设备,或者是诸如外围接口适配器(PIA)之类的复杂设备,这些设备在本技术中都是众所周知的。“电路”一词有包括了上述与非门的全部三种实例的足够广泛的含义。“电路”在某些情况下可能仅指电通路。电通路的类型包括印刷电路板上的导线、线路或通道或者是构成一个电连接通路的几种类型电通路的任何组合。
“信号”涉及到单一的电学波形或多个波形。例如,视频控制器产生一视频信号。正如在本技术中周知的那样,上述视频信号实际上是多个电导体上的多个信号:HSYNC、VSYNC、R、G、B等。
参照图4,第四种也是最后一种状态是关机状态156。关机状态156实际上等同于在通常意义上业已关闭的通常计算机系统。在这种状态下,电源17的初级/稳压部件172会停止向计算机系统10提供稳压后的电能(除经由AUX5提供少量的电能以外,这将参照图5予以详细的说明),但还未将计算机系统的状态保存至固定磁盘31。挂起状态154和关机状态156在电源17不再产生稳压电能方面是相似的。它们的不同在于,在关机状态156下,不象在挂起状态154下那样将计算机系统10的状态保存至磁盘驱动器31。而且,在离开关机状态156时,计算机10会象开机那样进行“引导”。也就是说,必须由用户或者自动地由诸如AUTOEXEC.BAT文件之类的方式启动任何可执行的代码。但是,在离开挂起状态154时,计算机10则会在它被中断的位置处恢复执行。
图4还显示了在四种状态之间引起转换的事件的概况。在参照与图6至图8有关的内容中将对这些事件作进一步的说明。但是,作概略的说明可能是有帮助的。电源开关21、两个计时器(不活动性待机计时器以及不活动性挂起计时器,见图9及其所附文字)、唤醒计时器的分钟数以及允许挂起标志(见与图6A和图7及与其有关的内容)均会影响计算机进入何种状态。一般地说,上述两个计时器可以是硬件或者是在CPU中作为程序执行的CPU代码计时器。在所说的最佳实施例中,上述两个计时器均为从BIOS数据段开始执行的CPU代码计时器。但是,这两个计时器也可以是硬件计时器,这会是一个比较好的方案,因为这会减少所述系统的总开销。与图9有关的内容将更详细地说明上述两个计时器。在计算机10处于正常操作状态150或待机状态152时,上述两个计时器都是活动的。如下所述,计时器与其它例程相联,从而任何一个计时器的到时都会引起转换。可以根据用户的特定要求将一个或两个计时器配置成能在特定的时间之后到时。在所述的最佳实施例中,可将不活动性待机计时器及不活动性挂起计时器设置成在10至90分钟后到时。也可以使一个或两个计时器停止,即将计时器设置成不会到时。使计时器“停止”实际上是停止了该计时器的增量计数活动或者是忽略了它们的到时。在所述的最佳实施例中,将计时器到时值置为零值会使得不检验该计时器的到时。例如,联网计算机的用户可能不让计算机进入挂起状态154,因为这样做会使局域网(LAN)相对该计算机失效。
从理论上说,计时器可递增计数或递减计数,而且在启动(或重新启动)计时器时,可被复位到预定的状态,该计时器可以期望计数到一种预定的状态,或者使用当前值以及作为边界终止触发器所计算出的差值或总和,在所述的最佳实施例中,在复位计时器时,将来自实时时钟98的分钟数变量的当前值存储起来。通过从所保存的分钟数值中减去当前的分钟数并比较其差值与用户所选定的值,可以检验计时器的到时。
某些系统活动会影响上述两个计时器。例如,在所述的最佳实施例中,正如与图9有关的内容所要详细说明的那样,用户按下键盘12之按键的活动、移动鼠标器13的活动、按下鼠标器13之按钮的活动或者硬盘驱动器31的活动均会使各个计时器被重新启动;所以,当用户按下键盘12的按键或使用鼠标器13时,或者当应用程序存取硬盘驱动器31时,两个计时器均不会到时。此外,其它的系统活动也会复位所说的计时器。对活动来说,也可以监控任何硬件的中断。因此,最好能使打印(IRQ5或IRQ7)或通信(COMM)端口访问(IRQ2或IRQ3)阻止系统进入挂起状态154。
允许挂起标志是微控制器U2内的CPU可控且可读的锁存器,与图6A有关的内容将对该标志予以详细的说明。简要地说,将微控制器U2设置成一种方式会导致按下开关21就能将系统10置于关机状态156,而将微控制器U2设置成另一种方式则会导致按下开关21就能将系统10置于挂起状态154。在清掉了写至微控制器U2的允许挂起标志的情况下,如果计算机系统10处于正常操作状态150并按下了电源开关21,那么,计算机系统10就会进入关机状态156,如标号158所示。如果计算机系统10处于关闭状态156且按下电源开关21,则计算机系统10会进入正常操作状态150,如标号160所示。此外,以下将作详细说明的若干“外部事件”也会使计算机系统从关机状态156转换至正常操作状态150。
如果计算机系统10处于正常操作状态150,有一种事件可以使计算机进入待机状态,即:如果不活动性待机计时器到时,则计算机系统10会转换至待机状态152,如标号162所示。另外,所说的计算机系统也可以提供对话框、开关或其它输入设备之类的手段以便用户强迫系统立即进入待机状态。而在待机状态152下,包括用户按下电源开关21在内的上述任何用户或系统的活动都会使计算机10离开待机状态152并重新进入正常操作状态150,如标号164所示。
按下电源开关21会使系统从待机状态152转换至正常操作状态150从而防止用户弄错。如上所述,在处于待机状态时,监视器11不作显示,电源/反馈LED23或者是亮的或者是闪烁的,这取决于微控制器内的允许挂起标志是如何配置的。接近计算机系统的用户会注意到监视器11没有显示,认为系统处于挂起状态154或关机状态156,于是按下电源开关21以试图使系统进入正常操作状态150。如果按下电源开关21使系统进入挂起状态154或关机状态156,那么,上述用户恰好关闭或挂起了计算机,这正与用户的意图相反。所以,在处于待机状态152时按下电源开关21应能使计算机系统从待机状态转换至正常操作状态。CPU40即使是空闲的也会立即检测出是否按下了电源开关。硬件的中断使CPU40每秒脱离空闲状态约20次,此后,在下一个APM获得事件(Get Event)的过程中,查询微处理器U2确定是否按下了开关21。
如果计算机10处于正常操作状态150,有两个事件会使该计算机进入挂起状态154。首先,如果不活动性挂起计时器到时,计算机系统10会转换至挂起状态154,如标号166所示。第二,在写至微控制器U2的允许挂起标志已被设定的情况下用户可通过按下电源开关21立即使计算机10进入挂起状态154,如标号166所示。此外,APM驱动程序会通过“设置电源状态:挂起”命令发出挂起请求,此请求使得APM BIOS驱动程序调用挂起例程。在处于挂起状态154时用户可通过按下电源开关21而转换至正常操作状态150。如标号168所示。
此外,有若干外部事件可用于使系统10从挂起状态154转换至正常操作状态150,如标号168所示,或从关闭状态156转换至正常操作状态150,如标号160所示。例如,图6A电路中微控制器U2内的电话振铃检测电路配置成能使系统10在所连接的电话线铃响时离开关机状态156或挂起状态154并进入正常操作状态150。这种特点有助于系统接收电传数据或数字数据。计算机系统响应电话铃声进入正常操作状态,并执行诸如接收到达的传真发送、上装或下装文件、对系统进行远距离存取等预置的功能,且响应不活动性挂起计时器的到时而再次进入挂起方式,同时,该计算机系统只在处于正常操作状态时才消耗电能。
同样,微控制器U2实现唤醒告警计数器的分钟数,它允许告警型事件使系统10离开挂起状态154或关机状态156并进入正常操作状态150。这种系统对在特定情况下发送电传或数字数据以降低电话使用率来说是有用的,并且对执行诸如用磁带备份系统备份系统硬盘驱动器31之类的系统维护来说也是有用的。在后一种情况下,设置上述唤醒告警的分钟数以便在调度程序使磁带备份程序执行之前将机器开启一段固定的时间。另外,APMBIOS调度程序可用于使磁带备份程序运行。
最后,如果计算机系统10处于待机状态152并且不活动性挂起计时器到时,那么,计算机系统10就会转换至挂起状态154,如标号170所示。计算机系统10不能从挂起状态154往回转换至待机状态152,但只能如转换168的文字所说明的那样转换至正常操作状态150。
很明显,计算机系统10不能立即改变状态。在相对四种状态之一的每种转换中,都需要特定的时间来进行必要的系统转换。与图6至图15有文的文字将详细说明每种转换的时间。系统硬件
在说明CPU40执行的代码细节之前,先说明实现上述四种状态所需的硬件是有益的。图5显示了电源17的框图。电源17带有两个部件:控制部件174和初级/稳压部件172。电源17带有若干输入:Line-In(线路输入),它从通常的壁装电源插座接收115伏交流电或220伏交流电;以
ON(开),它控制着电源17的稳压活动。电源17也带有若干输出:。AC Line-Out(交流电线路输出);±5DC(±5伏直流电输出);±12VDC(±12伏直流电输出);AUX5(辅助输出);GND(接地)以及POWERGOOD(电源良好)。AC Line-Out是115伏交流电,它一般流至视频显示终端11的电力输入口(未显示)。控制部件174接收
ON输入并产生POWERGOOD输出。初级/稳压部件172有选择地将来自Line-In输入的115伏交流电稳压降至±5伏直流电和±12伏直流电。初级/稳压部件172是否在±5VDC和±12VDC线路处稳压取决于和控制部件174相连接的
ON的值。在所述的最佳实施例中,控制部件174应使用诸如适当的光隔离器为产生
ON信号的电路提供绝缘。
Line-In输入和AC Line-Out,±5VDC、±12VDC、GND以及POWERGOOD输出在本技术中都是周知的。当电源17“关闭”,即不从Line-In中提供稳压电压时,POWERGOOD为逻辑0。当电源17“接通”时,电源17从115伏交流电Line-In中产生±5伏和±12伏的直流稳压电压。正如本技术中所周知的那样,上述四种稳压电压以及相关的GND是“系统电力”。当所说的稳压电压达到可接受的容差范围内的水平时,POWERGOOD信号就会改变成逻辑1。每当+5或+12伏线路落在容差范围之外,POWERGOOD信号都会变成逻辑0,以便指示这种情况。
AUX5输出为主板提供辅助的+5伏直流电。当把电源17插入供给额定115伏直流电的通常壁装电源插座内时,无论电源17是处于“接通”还是“断开”初级/稳压部件172都会在AUX5处提供稳压了的+5伏直流电。因此,电源17在接收交流电时总会经由AUX5提供额定±5伏的直流电。AUX5输出不同于前述+5伏的输出,因为初级/稳压部件172只有在电源17“接通”时才在该+5伏输处产生稳压的+5伏直流电。AUX5还在以下方面不同于前述的+5伏输出,即:在所述的最佳实施例中,初级/稳压部件172经由前述+5输出提供电压为+5伏多个安培数的直流电,而初级/稳压部件172则经由AUX5输出提供电压为+5伏不超过一安培的直流电。
一般的先有电源使用了高安培数的双掷开关以使得Line-In输入与电源的稳压部分接通及断开。本发明的电源17不使用高安培数的双掷开关。相反,开关21控制着产生
ON信号的电路。在所述的最佳实施例中,开关21是瞬时单极单掷按钮开关。但是,本技术的专家可以使图6A的电路适应使用诸如单极双掷开关之类的其它类型开关。AC Line-In总是从壁装电源插座连接至初级/稳压部件172。当
ON是逻辑1(近似地说,AUX5为额定+5伏直流电)时,初级/稳压部件172并不将115伏的ACLine-In稳压成经由±5或±12输出的±5或±12伏直流电流。初级/稳压部件172只在AUX5输出处提供低安培数的额定+5伏直流电。另一方面,当
ON是逻辑0(近似为GNO)时,初级/稳压部件172将115伏的AC Line-In分别稳压成经由四个±5和±12输出的±5及±12伏直流电。因此,当
ON为1时,电源17是“断开”的,当
ON是0时,电源17是“接通”的。
如果指定的话,就可从通常电源供应商那里获得类似上述电源17、带有AUX5输出和
ON输入的电源。
参照图6A,它显示了本发明之计算机系统10的概略电路图。图6A中的电路用于形成开关21,电源/反馈LED23、电源17、视频显示终端11以及在CPU40中执行的代码之间的连接。
如图6A所示,上述电路包括四个集成电路以及电路中各种分立的组件,上述四个集成电路是:U1,第一预编程的PAL16L8;U2,预编程的83C750微控制器;U3,本技术中众所周知的74LS05;以及U4,第二预编程的PAL16L8(未显示)。一般来说,电路U1和U4(未显示)将图3A和图3B的主板I/O总线90与微控制器U2连接起来,微控制器与图6A的其余电路相连,而这些电路则与开关21、电源17、视频显示终端11以及可编程时钟合成器906相连。时钟合成器906可以是本技术中普通人员所周知的多种这类设备中的一种。其中一种是由Chrontel公司生产的可从多方面广泛获得的CH9055A。
图6A的电路还包括:开关21;16MHz晶体检波器Y1;十八个电阻R1-R18;八个电容C1-C8;三个N型MOSFET(金属氧化物半导体场效应晶体管)Q1-Q3,这些MOSFET在所述的最佳实施例中是适于起逻辑开关作用的标准低电流NMOSFET;以及六个IN4148小型信号二极管CR1-CR6,这些电器件全部如图6A所示那样配置且相连。电阻R1-R8为1/4瓦电阻,它们具有图6A所示的电阻值,误差为±5%。电容C1是10μF(±10%)的电解电容。电容C2和C3是22PF(±10%)的钽电容。电容C4-C8是0.1μF(±10%)的陶瓷电容。最后,电容C9是1000PF(±10%)的陶瓷电容。
正如在本技术中所周知的那样,晶体检波器Y1和电容C2及C3产生微控制器U2用来控制操作定时的信号。二极管CR1和CR3以及电阻R14将AUX5的信号隔离于VBAT信号,同时允许AUX5信号补充VBAT信号,这是因为,当电源17产生AUX5信号时,电池171并未放电。相反,AUX5的信号经由二极管CR1和CR2降压,从而转为与VBAT相连的设备提供适当的电压。此外,VBAT的线路绝缘于AUX5的线路。
第二PAL U4(未显示)与地址线SA(1)至SA(15)以及AEN(地址启动)线相连。SA(1)至SA(15)以及AEN均是图3A和图3B所示的主板I/O总线90的一部分。仅将第二PAL U4编程为一地址解码器,以便在地址线SA(1)至SA(15)上出现预定的地址且AEN(地址启动)线活动时提供一低电平有效信号DCD#。在所述的特定实施例中,对第二PAL U4进行预先编程以便在地址0ECH和0EDH处对两个接连的8位I/O端口解码。此外,正如本技术的专家所周知的那样,也可以由诸如内存控制器或ISA控制器芯片组之类的其它电子设备来产生DCD#信号。
对第一PAL U1编程以提供以下几个功能:(i)CPU与微控制器U2之间的读/写接口以便在CPU40与微控制器U2之间传递命令和数据;(ii)对鼠标器中断INT12和键盘中断INT1进行逻辑或;以及(iii)响应来自CPU40的命令,复位输出来复位微控制器U2。
第一PAL U1使用了两个接连的I/O端口,本文也称之为“电源管理端口”。第一PAL U1具有来自主板I/O总线90的八个输入:SD(4)、SD(0)、SA(0)、IOW#、IOR#、RST_DRV、IRQ1以及IRQ12。正如本技术的专家所周知的那样,引线7(I6)处的高电平有效信号RST_DRV输入可将第一电路U1复位成已知的初始状态,而上述RST_DRV输入则是由内存控制器46所产生的。
微控制器U2的复位线RST751位于引线9处。复位子电路920用于产生RST751信号,并且包括:四个电阻R4、R16、R17和R18;两个电容C1和C8;以及两个MOSFET Q2和Q3,这些器件如图6A所示与第一PAL U1和微控制器U2呈电路通连。复位子电路920将来自第一电路U1的复位输出信号RESET转接成微控制器U2的复位输入信号RST751,因此,当RESET线处于逻辑1时,会使得RST751线也会逻辑1,从而能复位微处理器U2。
第一PAL U1响应CPU40将逻辑1写至控制端口0EDH的第0位而复位微控制器U2。将逻辑1写至控制端口0EDH的第0位会导致第一PAL U1将RESET线置成逻辑1,而RESET线又将RST 751线置成逻辑1,从而复位了微控制器U2。CPU40通过将逻辑0写至控制端口0EDH的第0位而清除复位请求。
此外,如图6C所示,在通往电源17的交流电源“降压”或“消失”时,AUX5的电压会下降,此后,AUX5信号的电压必然会上升一定的量,不论何时出现这种情况,复位子电路都会将RST751线置为逻辑1,从而复位了微控制器U2。83C750的制造者Philips公司建议使用简单的RC电路(阻容电路)以防止复位问题;但是,简单的RC电路会使83C750在电源降压期间锁住。在图6A的特定结构中,当AUX5电压在一段大于由R4、R16和C1所决定的时间常数的时间内上升一阈值时,就会使RST751线置成逻辑1一段时间,这段时间是由R17和C8所决定的(从而复位了微控制器U2)。这种情况在通常的降压或消失之后会出现。在图6A所示的实施例中,所说的阈值约为直流电1.5V。
参照图6C,它显示了AUX5电压随着交流电供给电源17而上升那段时间以及发生“降压”那段时间内用于复位电路920的波形。在t0之前,所述电源未产生AUX5,VBAT约为3.3V,Q3导通而使RST751线接地。在t0时刻,电源开始产生AUX5,AUX5的电压开始以一定的速率上升,所说的速率取决于负荷以及电源内影响AUX5的电容。结点1即C1与R4之间的结点电容性地连接于AUX5,所以能随AUX5的上升而上升。
在t1时刻,结点1达到约为1.5V,这足以触发Q2,而Q2则使结点2接地。在t2时刻,当结点2超过2.5V时,Q3停止导通,RST751线借助R18突增到AUX5的电平并随AUX5上升至约为5V。当RST751线变成约3V时,就会复位微控制器U2。
在t3时刻,AUX5停止上升,所以,结点1停止上升并开始按C1和R4所确定的速率放电至地电平(第一电路U1的RESET线是低的)。在t4时刻,当结点1经过约1.5V时,Q2停止导通,结点2按C8和R17所确定的速率充电。在t5时刻,当结点2超过约2.5V时,Q3导通并使RST751接地。因此,完成了电源接通时的复位,计算机系统通常处于这样的状态:AUX5为5V、VBAT为3.3V,结点1接地且结点2处于VBAT的状态。
在t6时刻,AUX5线处开始降压且AUX5放电。由于结点1电容性地连接于AUX5,所以它试图随AUX5的变化而变化,但却不可能产生这种变化,因为,第一电路U1内的二极管会阻止结点1处于大大低于-0.5V的状态。在t7时刻,AUX5处于最低点并开始再度上升。而且,结点1随AUX5变化并且上升。在t8时刻,结点1达到约1.5V,这足以触发Q2,而Q2则使结点2接地。在t9时刻,当结点2超过2.5V时,Q3停止导通,RST751线会借助R18突增至AUX5的电平并随AUX5上升至约为5V。当RST751线变成约为3V时,就会复位微控制器U2。
在t10时刻,AUX5停止上升,所以,结点1停止上升并开始按C1和R4所确定的速率放电从而接地(第一PAL U1的RESET线是低的)。在t11时刻,当结点1通过约为1.5V时,Q2停止导通,结点2按C8和R17所确定的速率充电。在t12时刻,当结点2通过约2.5V时,Q3导通并使RST751线接地。因此,完成了因降压而引起的复位周期。请注意,在这种特定的降压期间,结点1不会上升至3V以上,因而,尽管微控制器与RST751的引线相连,结点1也不可能复位微处理器。但是,AUX5的电压会降至4V以下,这足以使微处理器U2进入不确定的状态。
用于触发一次复位的阈值由参照值所限定,所以,为了能使阈值电压上升或下降,就必须使参照值(在本例中是VBAT)上升或下降。复位电路为微控制器U2提供了提高重置保护的好处,同时又非常廉价并且在不复位微处理器U2时基本上不耗电。
参照图6A,微控制器U2通过第一PAL U1与CPU相接并具有多个输入、输出以及可内部控制的功能。
SWITCH(开关)信号在引线8(P0.0)处输入并反映了按钮21的当前状态。按钮21是常开的。当按钮21断开时SWITCH线通过电阻R1被置为逻辑0(接地)。当按下按钮21从而引发闭合事件时,SWITCH线通过电阻R13被置为逻辑1(AUX5)。电容C6起作用以消除开关闭合事件弹跳,正如本技术的专家所周知的那样,在微控制器U2内通过读取SWITCH预定的次数例如50次并确认在所有的读取中SWITCH线都是相同的,从而进一步消除了开关21闭合事件的弹跳。
微控制器U2可直接控制对电源17的稳压。如图6A所示,On(开)信号在引线5(P3.0)处输出并经由电阻R6与SWITCH信号作线“或”以便控制电源的ON#信号。当ON信号为逻辑1时,MOSFET Q1导通,从而使ON#线(JP2的引线2)成逻辑0(接地),因而使电源17开始通过±5VDC和±12VDC线向计算机系统提供稳压的电力。另一方面,当ON线为逻辑0时,MOSFETQ1不导通,所以,ON#线(JP2的引线2)会被电阻R7置成逻辑1(AUX5),从而使得电源17停止经由±5VDC和±12VDC线供给稳压的电力。
微控制器U2响应开关21的接通事件以及通过微控制器U2内CPU40可写的可写寄存器位响应CPU40从而控制ON线的状态。AUX5对微控制器U2加电,所以,微控制器U2总是处于加电状态并能执行代码且控制着计算机系统。如果电源17不通过±5VDC和±12VDC线向计算机系统提供稳压的电力并且(i)按下开关21或者(ii)出现了所说的外部事件之一,那么,微控制器U2就会确认ON信号,从而使得电源17通过±5VDC和±12VDC线向计算机系统提供稳压的电力。释放开关21之后,微控制器会继续确认ON信号。
作为一种后备系统,电源17也可在用户通过按钮21的直接控制下接通。如果微控制器U2正如计算机系统未响应按下电源开关21而起动所表现出来的那样停止起所希望的作用,那么,一般就可以使用上述选择。如图6A所示,开关21还通过二极管CR2、MOSFET Q1、电阻R7以及连接器JP2控制电源17的ON#线。在一般情况下按钮21是断开的,SWITCH线通过R1被置为逻辑0并且MOSFET Q1不导通,所以ON#线(JP2的引线2)通过电阻R7被置为逻辑1(AUX5),因而电源17不经由±5VDC和±12VDC线提供稳压的电力。当用户按下并按住按钮21时,SWITCH线被置为1,MOSFET Q1导通,从而将ON#线(JP2的引线2)置为逻辑0(GND),因此使得电源17开始经由±5VDC和±12VDC线提供稳压的电力。在继续按住按钮21的情况下,计算机系统加电之后,BIOS会使CPU40检测微控制器U2是否还在起作用。如果不起作用,CPU40就会复位微控制器U2,而微控制器在被复位之后会检测到开关21正被按下。因此,在按钮21仍被按住的情况下,微处理器会确认ON信号,所以用户在知道了微控制器目前正在控制电源17的情况下会最终放开开关21。为了使用这种后备的选择,用户必须按下按钮21数秒的时间即在标志(logo)出现之后约为两秒。
微控制器U2只响应(i)按下开关21或者(ii)CPU40命令微控制器关闭系统而关闭计算机系统。对微控制器来说,上述事件都是相同的,这是因为,微控制器配置成开关21的接通事件或CPU40都能引发一次开关按下,硬件上的按钮按下/释放基本上看成是与软件上的按钮按下/释放一样的。如果微控制器U2中的允许挂起标志被清除,则微控制器U2在没有CPU指令的情况下便关闭计算机系统。在这种情况下,当计算机系统处于加电状态且清除了允许挂起标志,那么,微控制器U2就会响应开关21的接通事件而清除ON信号,从而使电源17停止经由±5VDC和±12VDC线向计算机系统提供稳压的电力。在释放开关21之后,ON信号仍保持在被清除的状态。
微控制器U2也会响应CPU在系统状态已成功地保存到硬盘驱动器上(挂起)之后必定会发出的命令而关闭计算机系统。微控制器U2响应上述命令而清除ON信号,从而使电源17停止经由±5VDC和±12VDC线向计算机系统提供稳压的电力。
微控制器U2在某些外部事件发生时也会检测并影响计算机系统。EXT_RING(外部振铃)信号在引线7(P0.1)处输入并使微处理器U2检测来自加电后外部调制解调器902的振铃。正如本技术的专家所周知的那样,当在插塞尖端与振铃电话线上检测到振铃信号时,一般的外部调制解调器会提供振铃信号,该信号会以周知的RS-232C格式触发逻辑1。上述信号经由二极管CR6通向微控制器U2并被电阻R10和R11分流且最终经由EXT_RING线输入微控制器U2。微控制器U2每25毫秒对触发的信号进行一次取样并加以分析,从而,对两个连续的样本这一输入是逻辑1时,便认为存在有振铃。微控制器U2响应所满足的上述条件确认ON信号,从而使电源17经由±5VDC和±12VDC线向计算机系统提供稳压的电力。为了用EXT_RING信号来检测呼入电话,必须存在有从外部加电的调制解调器902。
此外,提供符合RS-232规范的二进制信号(或充分接近RS-232规范从而足以确认EXT_RING信号)的其它设备可与EXT_RING线相接并用于唤醒计算机系统,例如,这些设备可以是运动传感器、防盗警报器、语音激活传感器、光传感器、红外线传感器、“鸣叫”型传感器等。
如图6A和图6B所示,本实施例还带有用于检测来自内部调制解调器900的电话振铃信号的装置,此装置带有一以振铃检测电路为基础的光隔离器OPTD1。例如Hewlett Packard生产多种合适的光隔离器,这些隔离器可从多方面广泛地获得。可将内部调制解调器900设计在系统主板20的电路内,或者插在扩展槽78上。在后一种情况下,必须对调制解调器900加以改进以提供一Berg或类似的接头,从而使来自光隔离器OPTD1的信号电连接于图6A电源管理电路的电路。有许多调制解调器的生产商改进了它们的内部调制解调器以提供适合于和本发明电路一道使用接头。EXT_WAKEUP#(外部唤醒)信号在微控制器U2的引线4(P0.2)处输入并用于从内部调制解调器中输入来自振铃检测光隔离器OPT01的信号。此信号经过电阻R9和R5二极管CR6以及电容C9,最后经由EXT_WAKUP#线输入微控制器U2。
内部调制解调器900的阈值及保护部分905与标准的插塞尖端(Tip)和振铃电话线相接,并且(i)提供防止可能损坏调制解调器900的闪电和其它电学事件的保护以及(ii)如调制解调器设计技术的专家所周知的那样设置振铃阈值电压。
微控制器U2检测并分析来自光隔离器OPTD1的触发信号,从而,每当该信号在EXT_WAKEUP上的三个连续信号周期具有15.1Hz至69.1Hz的频率,就认定存在有振铃。与必须加电才能沿EXT_RING提供振铃信号的EXT_RING信号不同,对光隔离器OPTD1来说,不必为内部调制解调器900加电就能沿EXT_WAKEUP#线提供适当的信号,该信号通常可由R5升至AUX5。
如果CPU40带有系统管理中断(SMI)(CPU40不一定要带有SMI才能使系统利用本发明的多种优点),那么,微控制器U2就会通过CPU的系统管理中断(SMI)中断CPU40。SMI_OUT#(系统管理中断输出)信号在微控制器U2的引线3(P3.2)处输出并使得微控制器U2在不等待操作系统确认或允许中断的情况下立即中断CPU40。位于微控制器U2内CPU40可写的一个可写寄存器位控制SMI_OUT#线的状态。此外,微控制器U2可以确认SMI_OUT#信号从而(i)根据在ACTIVITY#(活动)线上所检测到的活动(ii)或者在微控制器U2使电源17停止向计算机系统提供稳压电力之前中断CPU40。从CPU到微控制器U2的命令可以使上述一个或两个事件有效或失效。
对于每个SMI,CPU40内的微码都将CPU的状态从内存保存至特定的CPU状态保存区域或保存至内存。此后,CPU40执行SMI中断处理程序,该程序执行以下功能。为了恢复CPU的状态,SMI中断处理程序发出RSM(继续)指令,此指令使CPU40从上述特定的保存区域中恢复CPU自身的状态。
在CPU40使微控制器U2通过CPU的SMI中断CPU40之前,CPU40将一指示系统管理中断(SMI)原因的值写至CMOSNVRAM内的变量中。CMOS NVRAM内的这个值缺省为00H,它向CPU40指明正如在微控制器U2使电源17停止提供稳压电力之前所出现的那样微控制器U2正在异步地中断CPU40。每次SMI之后,CPU40都将CMOS NVRAM内的上述变量置为00H。在假定微控制器U2即将使计算机系统掉电的情况下,CPU40会响应上述值去执行某些任务。在CPU40通过周期性地重新启动微控制器U2内的降低功耗延时计时器而在微控制器U2使计算机系统降低功耗之前,CPU40可以延时一段时间。
在计算机系统掉电之前的这段时间内、CPU40可以执行多种任务。例如,由于用户可能改变了影响唤醒警铃的一个或多个参数,所以CPU会重新计算出距唤醒的新的分钟数值并将该分钟数值写至微控制器U2。此外,CPU还将以后要写入硬盘驱动器31的某些信息如计算机系统从最近一次通电开始运行的时间等写至CMOS NVRAM。
CPU40所写的其它值包括:01H,它表明CPU40要转至标号254处的挂起例程;02H,它表明CPU40要转至标号454处的继续例程;以及0FFH,它表明CPU40要在E000H段数据结构内创建前述特定的CPU状态保存区域。
在本实施例中,微控制器进行控制使显示器11不显示。DISP_BLANK(显示器不显示)信号在微控制器U2的引线1(P3.4)处输出并直接控制着显示器11的不显示。两个非门U3D和U3E通过ESYNC#和BLANK#线与DISP_BLANK信号相连。在ESYNC#和BLANK#处于逻辑1(VCC)的情况下,视频控制器56会产生视频信号。当ESYNC#和BLANK#线处于逻辑0(接地)时,视频控制器56停止产生视频信号。位于微控制器U2内CPU40可写的一个可写寄存器位控制着DISP_BLANK的状态。当计算机系统进入待机状态152时,CPU40会指示微控制器U2使显示器不显示。此外,响应开关21的接通事件而依次对DISP_BLANK线置1和清0。与此相似,在本例中为INT1和INT2的任何一种活动中断处的活动都会使微控制器对DISP_BLANK线清0,从而使得视频控制器56产生视频信号。
此外,微控制器U2控制着时钟合成器906所产生的时钟信号的频率。三个Berg型跳接器(未显示)JP0、JP1以及JP2按下述方式控制着时钟合成器:当JP0=0、JP1=1且JP2=0时,时钟合成器产生33MHz的时钟信号;当JP0=1、JP1=1且JP2=0时,时钟合成器产生25MHz的时钟信号;当JP0=0、JP1=1且JP2=0时,时钟合成器产生8MHz的时钟信号。对应于JP0、JP1和JP2的三个时钟线CLK0、CLK1以及CLK2也控制着时钟合成器906。如图6A所示,微控制器U2通过CLK_SLOW#信号控制着上述时钟线CLK0、CLK1和CLK2,而CLK_SLOW#信号则在微控制器U2的引线2(P3.3)处输出。如图所示,带有开放收集器输出的非门U3A、U3B和U3C双重反相CLK_SLOW#信号。而且,电阻R15和R8都是负载电阻,它们分别用于将U3A的收集极开路的输出和朝向时钟合成器906的CLK0输入上升至逻辑1。
上述三个时钟信号CLK0、CLK1和CLK2以及三个跳接器JP0、JP1和JP2按如下方式控制着时钟合成器:当CLK_SLOW#信号为逻辑1时,CLK1和CLK2信号也为逻辑1,时钟合成器906跳接器JP1、JP2所控制并产生供计算机系统使用的25MHz和33MHz的较高频时钟信号。另一方面,当CLK_SLOW#信号为逻辑0时,CLK1和CLK2信号也为逻辑0,时钟合成器906会产生供计算机系统使用的8MHz较低频信号,从而使计算机系统有较少的功耗。如图6A所示,一Berg型跳接器将CLK_SLOW#线与CLK0线分开。如果一个跳接器就位,那么,CLK0线中就会跟随CLK_SLOW#信号。另一方面,如果没有跳接器就位,那么,电阻R8就会在与CLK_SLOW#信号无关的情况下将CLK0置为逻辑1。位于微控制器U2内CPU40可写的一个可写寄存器位控制着CLK_SLOW#线的状态。此外,微控制器U2可以响应ACTIVITY#线上的活动将CLK_SLOW线清零。正如本技术的专家所知道的那样,本发明也可以使用其它的时钟合成器,这时需改变微控制器U2与时钟合成器之间的相互连接关系以便符合所使用的特定合成器的特殊规格。
另外,微控制器U2还直接控制着电源/反馈。LED23的发光。LED_CNTRL(LED控制)信号在引线22(P3.6)处输出并使得微控制器U2直接控制电源/反馈LED23。电阻R2和R3以及二极管CR4和CR5根据处于逻辑0的LED_CNTRL线使AUX5电源线或VCC电源线驱动电源/反馈LED23。当LED_CNTRL线处于逻辑1时,电源/反馈LED23不亮。正如以下将要详细说明的那样,微控制器U2响应开关21的接通事件、响应唤醒警铃、响应振铃检测输入的一次或多次振铃或者响应处于待机方式下的计算机系统而控制LED_CNTRL线的状态。
微控制器U2可将LED23控制成简单的电源LED。这样,在开关21使计算机系统从关机状态156或挂起状态154转变成正常操作状态150的接通事件之后,LED23会发光。同样,在开关21使计算机系统从正常操作状态150转变成挂起状态154或关机状态156的释放事件之后,微控制器U2会使LED23熄灭。
此外,微控制器U2可以使LED23按特定的速率例如每秒一次有选择地闪亮,以指示计算机系统正处于待机状态152。再有,微控制器U2还可以使LED23按不同的速率例如每半秒一次有选择地闪亮,以指示计算机系统被振铃或警铃所唤醒或者计算机系统处于关机或挂起状态。另外,微控制器U2也可以使LED23以成组闪亮的方式有选择地闪亮以指示计算机系统因诸如振铃、警铃之类的外部事件而加电以及因不活动性挂起计时器到时而掉电的次数。在这种情况下,BIOS具有一种或多种功能以允许OS及应用程序修改微控制器U2使LED23闪亮的次数。例如,如果计算机系统被振铃唤醒并接收到了呼入的传真传输,那么,运程通信应用程序就会调用特定的BIOS功能使闪亮数加一。此后,BIOS使CPU40将新的闪亮值写至微控制器U2,从而使LED 23闪亮所命令的次数。
POWERGOOD信号在微控制器U2的引线4(P3.1)处输入并允许微控制器U2和CPU40使用这一信号。具体地说,微控制器使用POWERGOOD信号使基于反馈的检错及纠错电路确定电源17是否出现故障并排除掉这种故障。正如本说明书其它部分所说明的那样,如果已确立了ON信号一段时间(例如三秒)并且POWERGOOD信号为逻辑0从而指示电源17未以适当的电平提供稳定的电压,那么,微控制器U2就假定电源17因诸如过载电流而出现故障。因此,为了能够排除该故障,微控制器U2会停止确立ON信号一段时间(例如5秒)以便排除上述故障。此后,微控制器U2会重新确立ON信号并等待POWERGOOD变成逻辑1,从而表示电源17目前正在向计算机系统提供稳压的电力。在不存在上述基于反馈的检错及纠错的情况下,电源17总是会继续处于出错状态并且微控制器U2总是不断地确立着ON信号以试图使电源17开始产生稳压的电力。唯一的方案是从上述电源上拨掉交流电以排除所说的故障。
图6D显示了电源检错与纠错电路的另一实施例。该实施例使用了四个FET Q10-Q13,电阻R20-R23、电容C20以及74HC132以检测电源17何时出现故障并排除这种故障。当ON信号为HIGH(高),AUX5加电且VCC低于触发Q11的阈值时,Q12将ON信号置为LOW(低)一段时间,该时间是由R22和C20所决定的,从而排除电源中的故障。
ACTIVITY#信号在微控制器U2的引线19(INT1)处输入,微控制器U2使用这一信号以响应键盘12和鼠标器13上的活动。IRQ1是键盘的硬件中断信号,它在第一PALU1的引线8(I7)处输入,按下键盘12上的按键会使IRQ1信号产生脉动。IRQ12是鼠标器的硬件中断信号,它在第一PALU1的引线11(I9)处输入,移动鼠标13或按下鼠标器13上的按钮会使IRQ12信号产生脉动。IRQ1和IRQ12在第一电路U1内作逻辑“或”并作为ACTIVITY#信号输出。使用ACTIVITY#信号会使得微控制器U2不会遗漏键盘12或鼠标器13的活动。
当处于待机状态时,上述任一种中断的活动都会使微控制器立刻恢复视频显示。在从待机状态152返回至正常操作状态154时,按上述方式使用中断IRQ1和IRQ12会给用户直接的反馈,该反馈是恢复了的视频显示。否则,正如图9中的文字所述的那样,用户可能在几秒钟之后当APM检查用户活动时,才接收到反馈。
利用SD(0)、SD(1)、SD(2)、SD(3)、IO_STROBE以及PROC_RDY进行CPU40与微控制器U2之间的通讯,SD(0)在第一PAL U1的引线18(I/06)处输入并经由RWD0线输入至微控制器U2,RWD0线则在第一电路U1的引线B(I/01)处输出并在微控制器U2的引线13(P1.0)处输入,SD(1)在微控制器U2的引线14(P1.1)处输入,SD(2)在微控制器U2的引线15(P1.2)处输入,SD(3)在微控制器U2的引线16(P1.3)处输入,SD(4)在第一电路U1的引线6(I5)处输入,IO_STROB#在微控制器U2的引线18(INTO)处输入,PROC_RDY在微控制器U2的引线20(P1.7)处输出。将第一PAL U1和微控制器U2配置并编程为以便提供:(i)从CPU40沿SD(0)经由RWD0、SD(1)、SD(2)以及SD(3)到微控制器U2的四位并行写操作,其中一个地址基本上是用于复位微控制器U2的一位写操作,而其它地址则是写入微控制器U2的半个字节,该半个字节只有在数据位SD(4)为HIGH时才是有效的;以及(ii)由CPU40从微控制器U2中沿SD(0)经由RWD0所进行的串行读操作(一位),其中一个地址对应于状态位,而其它地址则对应于来自微控制器U2的数据位。
参照图19,它显示了在微控制器U2内运行的几个例程,这些例程始于1160处。微控制器U2通常执行两个主例程中的一个:位于任务1168至1216的通电例程或位于任务1260至1308处断电例程。当电源17在±5和±12线处提供稳压的电力,或电源17虽不在±5和±12线处提供稳压的电力但计算机系统处在通电过程时,微控制器U2就执行通电例程。当电源17不在±5和±12线处提供稳压的电力或电源17虽在±5和±12线处提供稳压的电力但计算机系统处于断电过程时,微控制器U2就执行断电例程。此外,还有三种中断驱动例程:一个是在1220至1232处的用于和CPU 40进行通信的例程;一个是在1236至1244处的用于检测鼠标器13或键盘12活动的例程;一个是位于1248至1256处的提供25毫秒、半秒、秒以及分钟分辨率的时基的例程。
首先,在1164处初始化微控制器U2,在这期间,初始化所有的变量,初始化计数器变量,初始化计时器中断并使之生效,同时初始化控制通信例程及活动例程的外部中断。
通讯例程是一始于1220处的中断驱动例程,它响应被第一PAL U1置为逻辑0的IO_STROBE而执行,逻辑0表示CPU40正在开始一命令或查询。简要地说,此例程在1224处接收来自CPU40的一个或多个半字节命令或查询、在1128处执行上述命令或响应上述查询而返回数据、并且在1232处将程序执行控制权交还给被中断的代码。
微控制器顺序地接收来自CPU构成命令或查询的半字节。在接收一个半字节之后,微控制器将PROC_RDY置为LOW。当微控制器准备好接收下一个半字节时,微控制器再将PROC_RDY置为HIGH。CPU40一旦检测到在PROC_RDY处有上述从LOW到HIGH的转换就写下一个命令的半字节。
微控制器U2在执行来自CPU40的命令或查询时不能接收另外的命令,所以,微控制器U2使PROC_RDY保持为逻辑0,以便(通过状态端口的读操作)向CPU40表明微控制器还不能接收下一个命令/查询。当上述工作完成时,PROC_RDY被置为逻辑1,从而(通过状态端口的读操作)向CPU40表明微控制器U2随时都可以接收下一个命令/查询。
活动例程是一始于1236处的中断驱动例程,它响应被第一PAL U1置为逻辑0的ACTIVITY#线而执行,逻辑0表示用户已经使用了鼠标器13或键盘12。简要地说,此例程响应中断的接收而在1240处进行下列工作:(i)设置一个位,该位表示已存在有鼠标器13或键盘12的活动;(ii)如果启动时钟减慢则恢复时钟速度,(iii)如果屏幕不显示,则使屏幕显示;(iV)重新启动故障保险计时器;以及(V)如果有效,则向CPU生成一SMI。此后,该例程在1244处将程序执行控制权交还给被中断的代码。然后,如本说明书其它地方所说明的那样,每当APM“获得事件”,管理例程都查询上述例程所设置的位。
计时器例程是一始于1248处的中断驱动例程,它响应内部计时器中断而执行,内部计时器中断以一个16位自由运行的计数器为基础,该计数器配置成每25毫秒产生一次上述内部计时器中断以便为微控制器U2提供时基。计时器例程提供下列时基:25毫秒、半秒、秒和分钟。简要地说,计时器例程在1252处接收中断、确定何时出现不同的时间、执行适当的活动并在1256处将程序执行控制权交还给被中断的代码。
如果电源未提供稳压的电力并且微控制器配置成响应振铃,则计时器例程每一瞬间(25毫秒)检查EXT_RING线的RS-232振铃,并且,如果有振铃,就设置一个位。
如果处于关机状态或挂起状态,计时器例程每半秒钟就会如本说明书其它地方所说明的那样确定是否应触发LED23以便进行外部振铃唤醒指示闪亮。
如果处于待机状态,计时器例程就会如本说明书其它地方所说明的那样每一秒钟确定是否应触发LED23以便进行挂起指示闪亮。
而且,如果合适的话,计时器例程每一秒钟都会减小故障保险计时器、减小APM故障挂起计时器以及减小电源故障计时器,同时如果有任何一个计时器到时,计时器例程还设置一对应的位。故障保险计时器是一个20秒的计时器,它在到时时可使得微控制器切断计算机系统的电源。管理例程响应APM的获得事件频繁地重新启动复位故障保险计时器,所以,只要CPU中运行的代码在正确地执行,故障保险计时器就不会到时。但是,如果上述代码真正地停止执行,故障保险计时器就会到时,并且,在假定BIOS和其它例程发生故障的情况下,微控制器U2会响应按下及释放电源按钮21使电源17停止在±5和±12线处提供稳压的电力。
APM故障挂起计时器是一个18秒的计时器,在故障保险计时器到时以使微控制器关闭计算机系统之前,当开关21处于关闭/释放状态(表示用户试图关闭计算机系统)时,APM故障挂起计时器是有效的,并且,APM故障挂起计时器在到时时使计算机系统设法挂起。同故障保险计时器一样,CPU40中执行的代码例如APM Get Events、APM Working On Last Request以及APMReject Last Request等会频繁地重新启动(复位)APM故障挂起计时器,所以,只要CPU 40中执行的代码在正确地执行,APM故障挂起计时器就不会到时。但是,如果所说的代码真正停止执行,APM故障挂起计时器就会到时。
当APM故障挂起计时器到时时,微控制器U2会设置一个位。在每次计时器0级中断期间检查该位,正如本技术的专家所周知的那样,这种情况约每55毫秒出现一次。此外,计时器0级中断服务例程重新启动故障计时器。如果计时器0级中断服务例程检测到APM故障挂起计时器业已到时,它就会转至挂起例程以试图挂起计算机系统,如与图10有关的文字所述。
由计时器0级中断服务例程所引起的中断并不是进行中断的最佳方法。APM可察觉多种应用程序和适配器,并且,这些应用程序和适配器可响应被挂起的计算机系统而执行多种任务。计时器0级中断服务例程所引起的中断不能使用APM去向这些APM可察觉的实体表明即将进行挂起。因此,在这些实体没有正确地准备好的情况下挂起计算机系统。这样,计时器0级中断服务例程所引起的中断将会把系统保存起来,所以,内存中的数据不会丢失,但是,在保存了所需数据之后,用户要重新引导机器以便将计算机系统设置成适当的状态。
APM故障挂起计时器特别有助于修补OS内APM驱动程序中的“漏洞”。例如,当显示Microsoft Windows3.1模态对话框时,Windows APM驱动程序停止发送APMget events。因此,如果在用户按下电源按钮21以试图挂起系统时有模态对话框显示,那么,计算机系统将不会挂起。微控制器U2会注意到电源开关处于关闭/释放状态,但因为所有的APM get event均已停止,所以不会去调用管理例程。按下开关直到用户清除掉模态对话框才会起作用。但是,一旦APM故障挂起计时器到时并且计时器0级中断服务例程检测到这种到时,有可能在不向APM可察觉实体表明计算机系统正在被挂起的范围内将系统的状态保存起来。
每一分钟,计时器例程都会减少唤醒警铃计时器和活动计时器的分钟数。当唤计时器的分钟数到时时,如果有效的话,微控制器就会使电源17开始在±5和±12线处提供稳压的电力。
初始化微控制器U2之后,会在1168处测试电源以确定是否断电。如果是通电的、微控制器17会在1172处检验电源是否有故障。电源17有若干种内部保护措施,这些措施会使电源关闭或“出现故障”。微控制器U2按下列方式确定电源17是否出现故障:如果微控制器正在运行(表示AUX5已加电,即正将交流电提供给电源17),并且微控制器U2保持着ON信号以试图使电源17在±5和±12线处提供稳压的电力,同时不确立POWERGOOD线(表示电源17不在±5和±12线处提供稳压的电力),那么,就是电源17出现了故障并且必须复位该电源。
在任务1172处,实际测试电源17两次。微控制器U2确立ON信号,然后如内部时基所测定的那样等待三秒钟。如果在ON信号确立了三秒钟之后未确立POWERGOOD信号,那么,微控制器U2就会清除ON信号并等待另外的五秒钟。然后,微控制器U2再度确立ON信号并等待另外的三秒钟。如果在ON信号确立了三秒钟之后仍未确立POWERGOOD信号,则微控制器U2会清除ON信号并认定电源17出现了故障。
如果电源出现了故障,微控制器U2会转至断电例程,如1174处所示。另一方面,如果电源17未出现故障而是关闭了,则微控制器会在1175处使该电源开始在±5和±12线上提供稳压的电力并且在1176处初始化I/O端口、开启LED23并使外部中断生效。
图7显示了机器在微控制器U2内所维护的开关状态。如该图所示,所说的状态响应开关21的接通事件或其它事件如复位计算机系统10以及CPU40的写操作等而改变。在电源17来提供AUX5的情况下,微控制器U2不被加电,所以174处的开关状态是无意义的。按下开关21,来自其它方向的电话振铃、警铃计时器时间数的到时以及来自CPU40的命令都会导致微控制器使电源17开始向计算机系统提供电力,如伴随图6的文字所述。
如图7所示,开关21具有四种由微控制器U2监控的状态:(i)接通/按下状态176(在这种状态下,用户按着按钮并试图开机);(ii)接通/释放状态178(在这种状态下,用户已释放了按钮并试图开机),(iii)断开/按下状态180(在这种状态下,用户接着按钮并试图关机);以及(iV)断开/释放状态182(在这种状态下,用户业已释放了按钮并试图关机)。然后,在1180处微控制器U2测试开关是否处于断开/释放状态,从而表明用户业已释放了按钮并试图关机。
在处于状态174并按下开关21时,微控制器U2进入接通/按下开关状态176。释放开关21会使微控制器U2进入接通/释放开关状态178。与此相似,当复位微控制器U2时,微控制器U2会进入接通/释放状态178。再次按下开关21会使微控制器U2进入断开/按下开关状态180。再次释放开关21会使微控制器U2进入断开/释放开关状态182。随后接通开关21会使微控制器U2按上述四种状态循环,如图7所示。当计算机系统10处于正常操作状态150时,微控制器U2处于接通/释放开关状态178。处于这种状态时会执行应用程序。在这种状态下,计算机系统10可能会进入和离开待机状态152。这种状态还对应于用户提出的挂起中止请求。断开/释放开关状态是对应于用户提出的挂起请求的开关状态。也就是说,从系统处于关闭状态156开始,按下并释放开关21一次会使计算机系统处于正常操作状态150。再次按下并释放开关21可产生挂起请求,该请求由管理例程所读取,这将在图9的文字中予以详细地说明。在计算机系统10处于挂起状态154之前,第三次按下并释放开关21会产生挂起中止请求,该请求由挂起例程所读取。
参照图19,如果用户业已释放了按钮并试图关机,那么,微控制器U2就会转至断电例程,如1184所示。
另一方面,如果按钮处于断开/按下状态,这表示用于正按着按钮并试图关机,那么,微控制器就会在1192处测试开关是否被BIOS所屏蔽。BIOS在进入待机状态的入口处屏蔽开关21以防止按下开关使计算机系统从待机状态转换成挂起状态,从而如本文其它地方所述的那样防止用户搞混。
如果BIOS业已屏蔽了开关21,那么,微控制器的代码就会转回任务1176并清除屏蔽位以便允许下一次按下开关使得计算机系统进入关机状态或挂起状态。另一方面,如果未屏蔽开关21或者如果开关21不处于断开/按下状态,微控制器就会在1196处执行心搏例程(heartbeat routine)。
心搏例程用于向CPU40表明微控制器U2正在正确地发挥着作用。微处理器的CMD_STATE#线的输出(管脚17,P1.4)通常为逻辑1。每50-60微秒微控制器U2就会将该线置为逻辑0约达1.5微秒,然后使之回到逻辑1。由于CPU40所读取的电源管理状态端口是CMD_STATE#和PRO_RDY线的逻辑“与”,所以CPU40能如此频繁地例如在系统引导时监控这种从HIGH到LOW及返回到HIGH的转换,从而确保了微控制器U2正确地起作用。
然后,微控制器U2在1200处测试BIOS是否业已命令断电。CPU40可以存取并改变微控制器U2内的每一个变量。如果BIOS例如在挂起期间系统的状态被写入硬盘驱动器31之后业已设置了表示应使计算机系统断电的变量,那么,微控制器U2就会转至断电例程,如1204所示。
另一方面,如果BIOS未命令断电,那么,微控制器就会在1208处执行故障保险例程。故障保险计时器是一个20秒的计时器,当电源17在±5和±12线处提供稳压的电力时,该计时器是有效的。故障保险例程检查故障保险计时器是否已到时并且在该计时器业已到时时设置一个二进制位。如果BIOS命令重新启动故障保险计时器,那么,故障保险例程还会重新启动故障保险计时器。
然后,在1212处,作为一种安全措施并且为了使微控制器与电源17同步,微控制器会检查POWER_GOOD线以便检测电源17是否仍在±5和±12线处提供稳压的电力。
如果电源17未在±5和±12线处提供稳压的电力,那么,微控制器U2就会转至断电例程,如1216所示。另一方面,如果电源17正在±5和±12线处提供稳压的电力,那么,微控制器的代码就会转回1180并继续执行。
断电例程始于任务1260处。首先,微控制器U2在1264处使活动中断无效以防止显示器不变空白。
其次,在1268处,微控制器检查POWER_GOOD线以检测电源17是否仍在±5和±12线处提供稳压的电力。如果电源17正在±5和±12线处提供稳压的电力,那么微控制器U2就在1272处测试是否应该使显示器不显示与/或并断开LED23。如果是这样的话,微控制器U2就使视频控制器56停止产生视频信号和/或断开LED23。
此后,如果LED和显示器均未不显示,则微控制器测试:(i)BIOS是否业已通过设置一个二进制位命令计算机系统应回到开机,或者(ii)用户是否业已通过再次按下电源按钮21命令计算机系统应回到开机。如果产生上述情况中的任何一种,那么,计算机系统都将回到加电并且微控制器U2会转至通电例程。如1284所示。
然后,微控制器确定在来自光隔离器OPTO1的EXT_WAKUP#线上是否有振铃出现。就RS-232线来说,这仅仅是检查EXT_RTNG线是否为HIGH。对来自光隔离器OPTO1的信号来说,这包括微控制器U2所作的更多的检查工作。电阻R5通常将EXT_WAKEUP#线置为HIGH。如果Tip和Ring两端的电压高于由阈值和保护部分905所设置的电压阈值例如在电话振铃时的60V,光隔离器OPTO1就会将EXT_WAKEUP#线置为LOW。但是,测试电话线或电话线上的噪音都能满足上述条件。所以仅等待EXT_WAKEUP#线为低可能使得虚假的“振铃”唤醒计算机系统。
因此,微控制器通过测定振铃的频率来确定信号是否是振铃。标准的振铃是一在16Hz到58Hz之间的信号。微控制器U2在EXT_WAKEUP#信号的四个上升边缘之间测定三个时间周期,如果这三个都对应于15.1Hz和69.1Hz之间的频率,则微控制器认定在EXT_WAKEUP#线上出现了适当的振铃并且设置一对应的二进制位。
EXT_WAKEUP#线上所检测到的LOW信号会启动检查例程。如果对三次接连的读取来说EXT_WAKEUP#线都为LOW,那么,微控制器U2就会等待EXT_WAKEUP#线在三次接续读取的时间内返回到HIGH。紧接着读取构成计时器中断基础的16位计数器并将其值存储起来,而且,微控制器U2在三次接连读取的时间内等待EXT_WAKEUP#线转换到LOW。微控制器然后测试头两个上升边缘之间的时间是否在15毫秒与66毫秒之间,这表示信号在15.1Hz和69.1Hz之间。如果是这样的话,再次对上述具有高分辨率的计数器进行取样,微控制器在等待下一次LOW至HIGH转换时计算两次计数器取样之间的差值。对EXT_WAKEUP#线上下两次的LOW至HIGH转换重复上述过程。如果这三个时间周期全都在所说的范围内,那么微控制器U2就认定在EXT_WAKEUP#线上出现了适当的振铃并设置一对应的二进制位。如果在EXT_WAKEUP#线上不存在LOW或者上述三个时间周期中的任何一个超出了所说的范围,微控制器的代码会继续但不设置所说的二进制位。
然后,微控制器在1286处测试是否存在有振铃或者唤醒警铃的分钟数业已到时。对RS-232振铃、光隔离器振铃或唤醒警铃的分钟数来说,还包括微控制器U2测试是否设置了相关的二进制位。
如果存在振铃或唤醒警铃的分钟数到时,那么,计算机系统就会回到被加电,微控制器U2会转至加电例程,如1287所示。
此后,在1288处,微控制器测试电源17是否在±5和±12线处提供稳压的电力。如果未供电,则代码转回至任务1280并再次开始循环。另一方面,如果电源17在±5和±12线处提供稳压的电力,那么,微控制器U2在1292处执行心搏例程并在1296处执行故障保险例程。这两个例程已在任务1196和1208的文字中作了说明。
微控制器U2只在下列三种情况下才使得电源17停止在±5和±12线处提供稳压的电力:(i)BIOS业已命令立刻断电,这是在通信例程中实现的;(ii)故障保险计时器业已到时;或者(iii)用户按下电源按钮并且未设置微控制器U2的允许挂起标志,这是微控制器U2在每次读取SWITCH输入时所检测的条件。所以,微控制器在1300处检测故障保险计时器是否业已到时。如果没有到时,代码就转回任务1280并再次开始循环。
另一方面,如果故障保险业已到时,这表示计算机系统将要减少功耗,那么,如果有效的话,微控制器U2就会在1304处向CPU40生成一SMI。这就能使CPU在假定计算机系统将要在此后立刻断电的情况执行某些任务。例如CPU40重新计算唤醒警铃值的更新的分钟数并将该分钟数写至微控制器U2。
如果CPU40不执行其它活动,则在可编程SMI计时器到时之后,微控制器会使计算机系统断电。CPU40可以通过将适当的值写至微控制器U2重新启动SMI计时器,从而能延长该时间间隔。
此后,如果1268处的测试表明电源未提供合格的电力,则微控制器U2在1308处使计算机系统断电。这包括:(i)使电源17停止在±5和±12线处提供稳压的电力;(ii)使通信中断无效,这是因为CPU40即将掉电;(iii)将输出端口(除ON端口)置为HIGH以使它们的功耗减至最低(在这种状态下,微控制器U2仍可读取SWITCH,EXT_RING、EXT_WAKEUP等);(iV)设置断电变量以使得其余的例程知道已切断了通向计算机系统的电力;以及(V)将开关的状态转换成断开/释放状态,从而下一次按下按键将接通计算机系统。
此后,代码转回至1280并开始再次循环,以等待振铃、等待按下开关、等待BIOS命令该代码唤醒计算机系统或等待唤醒警铃的分钟数到时。系统软件
业已说明了本发明之计算机系统10的硬件方面,以下说明其代码方面。
参照图8,它显示了增加功耗例程的概况。当CPU转至复位矢量(Reset Vector)所指示的这一代码并执行该代码时,上述例程就在200处开始执行。每当CPU加电并且每当复位硬件信号复位了CPU或当通过转至上述复位矢量所指示的代码而执行复位指令时,上述情况就会出现。这种复位过程在本技术中是周知的。
首先,增加功耗例程的流程取决于为什么要使计算机系统增加功耗。正如图11所要详细说明的那样,计算机系统可能因节电或熄灭而要增加功耗。这样,使计算机系统保存在通电状态是不适合的。所以,增加功耗例程首先在940处确定计算机系统是否应处于通电状态。如果计算机系统不恰当地增加功耗,那么,CPU40就在942处命令微控制器U2使电源停止向计算机系统提供稳压的电力。
在确定计算机系统是否仍处于加电状态所进行的一种测试是在计算机系统响应微控制器认为是振铃而使系统加电的情况下确认电话线正在振铃。具体地说,在使计算机系统增加功耗之后,如果响应振铃而唤醒计算机系统,则在计算机系统等待硬盘驱动器31内的硬盘起转时,CPU40会查询已完全加电的调制解调器900或920是否也检查到了振铃信号。如果未检测到振铃信号,系统就会减少功耗。如果调制解调器900或902也检测到了振铃信号,则计算机系统使引导过程延续。
假定计算机系统处于加电状态,则从总体上说加电例程的流程取决于计算机系统是处于关机状态156还是处于挂起状态154。即在CMOS NVRAM96内清除还是设置了挂起状态。如202处所示,计算机系统通过非易失性CMOS存储器96读取挂起标志来确定是处于关机状态156还是处于挂起状态154。当计算机系统离开正常操作状态150到达关机状态156或挂起状态154时,每个例程都或者设置或者清除NVRAM96中的挂起标志。如果在NVRAM96中设置了挂起标志,则计算机系统10是处于挂起状态154,并且将计算机系统10的状态存储到固定存储器31内。另一方面,如果在NVRAM96内清除了挂起标志,则计算机系统10是处于关机状态156,并且不将计算机系统10的状态存储到固定盘存储器31内。这样,如果在NVRAM96内设置了挂起状态,则计算机系统就会执行“正常”的引导例程,如任务204-210所示。如204处所示,第一项任务是通电自检(POST),这将在伴随图11中的文字中给予详细的说明,从POST返回之后,CPU40调用PBOOT例程以加载操作系统,如206处所示。
PBOOT例程是一种在IBM计算机上运行的典型例程,但略有变化,这将下文中予以说明,PBOOT确定从哪里(是从硬盘驱动器31还是从软盘驱动器内的磁盘上)引导并加载操作系统,而操作系统则按CONFIG.SYS的指令去分析和实现系统的变化并最终执行AUTOEXEC.BAT批处理文件。PBOOT例程在本技术中是周知的。OS加载APM设备驱动程序,该驱动程序向BIOS查询APM是否认识该BIOS。如果是这样的话,BIOS APM例程和OS APM例程进行信号交换,此后共同提供本文所述的各种功能。如210处所示,操作系统根据用户的指示不定地执行代码。但是,向APM报告管理例程的结果是APM BIOS和APM OS使得管理例程与正在运行的程序“并行”地执行,如212处所示。也就是说,计算机系统10是时间多路复用式的多任务系统,并且可周期性地运行APM Get Event,从而能周期性地运行管理例程。最终的结果是,约每秒钟执行管理例程一次。图9中的文字将详细说明管理例程。正常的引导例程204-210结果之后,计算机系统10处于正常操作状态150,如伴随图4的文字所述。
参照任务202,如果在NVRAM96内设置了挂起标志,则将系统状态保存至硬盘驱动器31,并且计算机系统10执行继续引导例程,如214-220所示。首先,计算机系统执行简化的POST,如21 4处所示。伴随图11的文字将详细说明简化的POST。在简化的POST之后,计算机系统调用继续例程,如216处所示。伴随图12的文字将详细说明继续例程。这里只说明继续例程将计算机机系统10的状态恢复成挂起之前的配置就够了。与任务204-210所示的正常引导例程不同,继续引导例程不必向APM API报告存在有管理例程,这是因为,APM例程必须运行才能使系统挂起,并且,在恢复系统状态时,APM被装回内存。这样,在继续例程完成恢复计算机系统10的状态时,APM已处于适当的位置并以与所恢复的代码相“并行”地运行,如212和210处所示。继续引导例程214-220结束之后,计算机系统10处于正常的操作状态150,如伴随图4的文字所示。因此,执行了正常的引导例程204-210或继续引导例程214-220之后,计算机系统10会处于正常的操作状态150。
图9是显示管理例程详细内容的流程图,该管理例程在“GetEvent”过程中约每秒钟都由APM所调用。不同的操作系统以不同的频率Get Event。
管理例程始于图9中的222处。以下内容假定计算机系统10始于正常的操作状态150。第一项任务是在224处测试用户是否按下了开关21。正如与图6A和图7有关的内容所详细说明的那样,通过CPU 40查询微控制器而测试开关21。
如果任务224处的测试表明用户按下了开关21,则管理例程在950处继续确定是否先前向OS中的APM设备驱动程序发出了挂起请求。
如果任务950处的测试表明还未将挂起请求发送给APM驱动程序,则管理例程在226处向OS的APM设备驱动程序发出“挂起请求”,然后在228处返回至APM驱动程序。APM驱动程序响应连接“挂起请求”的APM返回代码而广播即将进行的挂起,从而APM可识别的设备可以执行任何必要的系统任务(如使硬盘同步等),然后,APM驱动程序发出“挂起命令”,该命令使得APM BIOS路径选择例程调用挂起例程。与图10有关的内容将说明挂起例程。挂起例程基本上使计算机系统10离开正常操作状态150并进入挂起状态154,而且可将控制权在若干条指令(如果计算机系统尚未准备好挂起)或若干分钟、若干小时、右干天、若干周或若干年(如果计算机被挂起并且被继续)之后交还给管理例程。无论是挂起程序在没有挂起的情况下返回还是在完成挂起和继续之后返回,挂起程序总是会设置“正常继续”的APM返回代码。
通常在任务224处未按下开关21,因而管理例程会转至任务952以确定是否设置了临界挂起标志。同样,如果先前向OS中的APM驱动程序发送了挂起请求,则管理例程这时也会转至任务95 2以确定是否设置了临界挂起标志。如果设置了临界挂起标志,则管理例程会继续在954处测试是否先前向APM驱动程序发出了临界挂起请求。
如果未向APM驱动程序发出临界挂起请求,则管理例程在956处引发临界挂起请求APM返回代码,然后在958处返回至APM驱动程序。APM驱动程序响应临界挂起请求而在不广播即将进行挂起的情况下立即挂起计算机系统,所以,APM所认识的设备不能执行各自的预挂起任务。
如果在952处未设置临界挂起标志或者在954处已向OS中的APM驱动程序发送了临界挂起请求,则管理例程在957处确定挂起未决是否超过15秒。如果是这样的话,管理例程在958处设置临界挂起标志,从而在下一次APM Get Event过程中进行任务954处的测试。
此后或者如果挂起未决不超过15秒,管理例程就在959处检查挂起是否是未决的。如果是这样的话,CPU 40就在960处使微控制器U2重新启动(复位)故障保险计时器以及APM故障挂起计时器。
此后或者如果挂起不是来决的,则管理例程转至任务230以确定计算机系统是否刚被继续。如果调用了挂起例程,那么,不管挂起例程是在没有挂起的情况下返回,还是在完成挂起与继续之后返回,计算机系统认为自己刚刚继续。在230处测试这种继续,并且,如果计算机系统刚刚继续(或者因DMA或文件活动未执行挂起),则在232处发布APM返回代码“正常继续”并在234处返回至APM。据此,APM OS驱动程序更新系统时钟以及在暂停期间可能变为失去时效的其它值。
通常,计算机系统10不是刚刚继续的,因而管理例程转至任务236以测试任何用户活动。在任务236处测试三种类型的用户活动:硬文件31的活动、键盘12的活动以及鼠标器13的活动。每当有APM Get Event时,管理程序都作以下工作:从硬盘驱动器31读取用于硬文件磁头、柱面和扇区的值;查询微控制器U2是否在鼠标器中断线或键盘中断线上存在有表示用户活动的活动;以及从实时时钟98中读取分钟数值,该数值在0分至59分的范围内并在每小时开始时返回为0分。暂时将硬盘驱动器的三个活动变量(磁头、柱面以及扇区)以及上述分钟数值存储起来。然后比较这三个硬盘驱动器活动变量和来自先前Get Event所保存的硬盘驱动器活动变量。如果当前的三个硬盘驱动器值与来自先前Get Event的值相同并且如果在鼠标器中断或键盘中断方面没有活动,则就是不存在有用户的活动。如果所述硬盘驱动器的值是不相同的,或者在鼠标器中断或键盘中断方面已存在有活动,那么,就是有了用户的活动,因而将当前的硬盘驱动器活动变量保存起来以便用来与下次Get Event过程中所读取的值作比较。
上述活动检测方案是在CPU中运行一个例程以确定硬盘驱动器的活动,并且只监控两个硬件中断的活动。另外,也可以按硬件方式专门监控活动。例如,可以监控所有16条硬件中断线的活动。
如果存在有活动,则管理例程在238处通过测试待机标志来确定计算机系统10是否处于待机状态152。如果设置了待机标志,这表示计算机系统10处于待机状态152,那么,管理例程就在240处退出待机状态152并进入正常操作状态150。管理例程通过使在进入待机状态152时减少功耗的设备增加功耗而退出待机状态152,如图18所示。简要地说,当计算机系统退出待机状态152时,管理例程作下列工作:恢复视频信号;使硬盘驱动器31内的硬盘起转;恢复系统时钟;使APM CPU空调用无效,从而使得来自APM驱动程序的CPU空调用不再使CPU 40停止;以及清除指示计算机系统10处于待机状态152的标志。
此外,如果存在有活动,则还将来自实时时钟98的分钟数值保存起来以便用来与后续的Get Events过程中所读取的分钟数值作比较。保存当前分钟数值实际上是在241处复位不活动性待机计时器和不活动性挂起计时器。在正常使用过程中,存在有用户的活动,并且,管理例程会在242处设置“No Event”(无事件)APM返回代码并在243处返回至APM调用代码。APM响应“NoEvent”返回代码而不调用任何例程。
如果任务236处的测试表明不存在有用户的活动,则管理例程分别在245和247处测试不活动性待机计时器以及不活动性挂起计时器是否到时。如果计算机系统10处于待机状态152,则不检查不活动待机计时器的到时情况,相反,在任务244处跳过上述测试。
通过从所保存的分钟数值中减去当前的分钟数值以获得与自从有用户活动以来的分钟数值相对应的值,从而可以检查上述两个计时器的到时情况。所说的值在245处与不活动待机暂停值作比较,并在247处与不活动挂起暂停值作比较。上述两个暂停值可由用户选择并且能被设置成使计算机系统因两个计时器中的一个到时而不会进入待机状态152,不会进入挂起状态154,或者不会进入待机状态152中挂起状态154。将上述任一暂停值设置为零(0)表示相应的计时器不会到时。
如果自从最近的用户活动以来的分钟数等于或大于不活动待机暂停值,则管理例程会在246处使计算机系统10进入待机状态152。如果不活动的待机计时器尚未到时,则管理程序在247处测试不活动挂起计时器的到时情况。另一方面,如果不活动待机计时器业已到时,则管理例程通过使某些组件处于各自的低功率方式而使得计算机系统10进入待机状态152,如图18所示。简要地说,在所述的最佳实施例中,管理例程做下列工作:使视频信号不显示;使硬盘驱动器31中的硬盘停转;减慢系统时钟;使APM CPU空调用有效,因而来自APM驱动程序的CPU空调用会中止CPU 40;以及设置表示计算机系统10处于待机状态152的标志。在使计算机系统10进入待机状态152之后,管理例程在247处测试不活动挂起计时器的到时情况。
管理例程在247处测试不活动挂起计时器是否业已到时。如果自从最近的用户活动以来的分钟数等于或大于不活动挂起的暂停值,则管理例程在248处设置“挂起请求”APM返回代码,然后在243处返回至APM。正如以上与任务226有关的内容所说明的那样,APM响应设置“挂起请求”APM返回代码而执行任何必要的系统任务,然后调用挂起例程。挂起例程将在与图10有关的内容中更全面地预以说明,简要地说,挂起例程使计算机系统10离开正常操作状态150并进入挂起状态154。正如与任务226有关的内容所说明的那样,挂起例程无论是否使计算机系统10挂起的情况下都能将控制权交还给管理例程。另一方面,如果不活动挂起计时器尚未到时,则管理例程在242处设置APM返回代码“No Event”并在243处返回APM调用代码。
尽管最经常的是将APM返回代码“No Event”返回给APM,但也可以使各种其它事件返回给APM。然而,对于每个APM GetEvent来说,只能指定一个APM返回代码。例如,在进入待机状态152之后,将“No Event”返回给APM。在离开挂起状态154之后,将APM返回代码“Normal Resume”(正常继续)返回给APM。为APM而排队的特定报文取决于计算机系统的精确特征。管理例程也可以返回APM返回代码“Normal Resume”或“Suspend Request”。
参照图9B,它显示了APM处理最近请求例程(APMWorking On Last Request Routine),此例程始于916处。BIOSAPM例程响应所发出的APM处理最近请求(APM Working OnLast Request)而在962处重新启动微控制器U2中的APM故障挂起计时器以及故障保险计时器、在963处重新启动15秒的挂起未决计时器,以便在OS APM等待计算机为挂起作适当准备时阻止发出临界挂起请求并且在964处返回。
参照图9C,它显示了APM拒绝最近请求例程(APM RejectLast Request Routine),此例程始于965处。BIOS APM响应所发出的APM拒绝最近请求(APM Reject Last Request)而在966处重新启动微控制器U2内的APM故障挂起计时器以及故障保险计时器、在967处设置临界挂起标志以便强制立刻挂起并在968处返回。
利用对挂起例程的认识可以更好地理解增加功耗和继续例程。所以,应认识到最好按下列次序检验对APM BIOS例程的说明:对本发明加电例程的概略说明(如以上图8所述)、对管理例程的详细说明(图9)、对本发明挂起例程的详细说明(图10)、对本发明增加功耗过程的详细说明(图11)、对本发明继续例程的详细说明(图12)、对保存CPU状态例程的详细说明(图13)、对恢复CPU状态例程的详细说明(图14)以及对保存8259状态例程的详细说明(图15)。
应该认识到,虽然因多数例程是相互作用并且挂起/继续过程就是一种连续的循环操作,因而对本发明之计算机系统10的任何说明都略微有些循环,但是,最有帮助的还是在引导例程(图11)或继续例程(图12)之前说明挂起例程(图10)。参照图10,它显示了挂起例程的流程图。回忆一下,在执行了正常引导例程204-210或继续引导例程214-220之后,计算机系统10处于正常操作状态150。而且,如以上与图8有关的内容所说明的那样,无论是正常引导计算机系统204-210还是继续引导计算机系统214-220,在这两个例程中任何一个例程结束之后,APM OS驱动程序都会认识诸如管理例程之类的APM BIOS例程,如图8所示。因此,APM约每一秒钟都会轮询管理例程。
图10显示了挂起例程,该例程始于250处。APM响应管理例程向APM返回APM返回代码“Suspend Request”而调用挂起例程。此外,当计算机系统执行如与图17和图18有关的内容所详细说明的检查点(Checkkpoint)时,调用并部分地执行挂起例程。首先,挂起例程的流程在970处取决于CPU 40是否是带有SMI的S部件。如果是这样话,CPU 40在972处使微控制器U2给CPU40生成一SMI。正如本技术的专家所周知的那样,CPU 40内的微码会在974处将CPU 40的状态保存至E000H段的数据结构内。
另一方面,如果CPU 40不是带有SMI的S部件,则调用保存CPU状态例程,如252处所示。与图13有关的内容将会详细说明保存CPU状态例程。这里,只说以下内容就足够了:在初始调用挂起例程时,无论CPU 40处于什么模式,都会按CPU 40处于实模式来执行挂起例程的其余部分,所以能够在不必担心产生任何错误的情况下执行上述挂起的其余部分,而所说的错误则是由试图执行容许地址空间之外的指令或试图执行特权指令而引起的。
保存CPU状态例程在253处以独特的方式将程序控制权交还给挂起例程。从保存CPU状态例程“返回”至挂起例程指的是复位CPU,这将在以下与图13中任务630和632有关的内容中予以详细说明。挂起例程的重要细节是业已将CPU寄存器写至了E000H的数据结构,并且,CPU 40当前处于实模式。
在保存CPU状态例程返回之后,或者中CPU响应SMI而保存了自己的状态之后,挂起例程继续在254处确认是否已按下了开关21。如与图6及图7有关的内容所说明的那样测试开关21的接通情况。如果未按下开关,则正在进行的挂起是软件挂起并在CMOS NVRAM 96中设置软件挂起标志。这就确保了软件挂起不会与因开关接通而引起硬件挂起相混淆。所有的软件挂起都会通过在微控制器U2内设置一二进制位而转化为硬件挂起。将软件挂起转化为硬件挂起之后,接通开关会中止该挂起。
下一步的任务是在E000H段内建立一个堆栈,如262处所示。
建立起堆栈之后,挂起例程在264处检验DMA控制器72、磁盘适配器84以及IDE盘控制器86以了解当前是否正在分别进行任何的DMA传送、软盘驱动器传送或硬文件传送。如果是这样的话,就不能进行挂起,这是因为,这三种类型所特有的性质会阻止进行令人满意的挂起。例如,如果正在进行来自硬盘驱动器31的硬文件传送,则IDE控制器业已读取了数据,但数据尚未被传送至系统内存53。CPU无法充分地存取上述数据,所以,如果在硬文件读操作中间挂起计算机系统,数据就会丢失。因此,如果正在进行上述三种传送中的任何一种,都推迟挂起直至下一次的APM Get Event,那时,会再一次检测DMA和软盘控制器的活动。
因此,必须将在352、260和262处执行的任务颠倒,从而将控制权转给APM。首先,BIOS从读/写变为只读,如265处所示。这是通过关闭仍包含有投影数据的E000H段而实现的。弹出并恢复在任务262处创建的堆栈。最后,在267处将控制权转回给APM之前,在266处由恢复CPU状态例程恢复CPU的状态。在下一次Get Event期间APM再过约一秒钟再次轮询挂起例程。到那时,可能完成了阻止挂起的传送活动,从而使挂起继续。
参照任务264,如果当前没有进行DMA传送,软盘驱动器传送或硬文件传送,则可以进行挂起。挂起例程在268处继续。使故障保险计时器连续地递减计数,当开关21处于断开/释放状态时,故障保险计时器如果到时则会使计算机系统自身关闭。所以,第一项任务就是复位与图6A和图19有关的内容所述的故障保险计时器,如268处所示。
然后,在270处保存8042协处理器104的状态。8042协处理104的寄存器在本技术中是周知的。CPU 40可以直接读取上述寄存器并且这些寄存器的值可以直接写入E000H的数据结构中。
随后,在272处保存8259中断控制器92的状态。挂起例程调用8259保存状态例程,在与图15有关的内容中将详细说明上述8259保存状态例程。这里,只说下列内容就够了:尽管8259中断控制器92的某些寄存器是只写的,但8259保存状态例程能够确认两个8259中断控制器的无名寄存器的内容。该寄存器的值可以直接写至E000H的数据结构中。
在保存了中断控制器92的状态之后,必须将中断控制器92的配置改变成已知的状态以使得挂起例程执行各个中断驱动的任务的正常功能。所以,在274处交换BIOS数据区与矢量表(BIOS data Areas & Vector Table)。挂起例程将0000H段中的当前状态BIOS数据区和矢量表的内容拷贝至E000H段中的存储单元。然后,将已知状态BIOS数据区和矢量表的内容从E000H段中的数据结构拷贝至0000H段内的存储单元。在引导例程的任务414中将已知状态BIOS数据区和矢量表拷贝至E000H段,引导例程如图11所示并在以下予以说明。最后,将当前状态BIOS数据区和矢量表从0000H段拷贝至E000H段内的数据结构。当274处的例程结束时,诸如中断13H(磁盘读/写中断)和中断10H(视频存取中断)之类的所有中断会象所希望的那样起作用。
然后,在276处将计时器102的状态保存起来。该计时器的寄存器在本技术中是周知的。CPU 40可以直接读取所有的这些寄存器,并且,这些寄存器的值可直接写入E000H的数据结构。在276处还将IDE磁盘控制器86的状态保存起来。IDE磁盘控制器86的寄存器在本技术中是周知的。CPU 40可以直接读取所有的这些寄存器,并且,这些寄存器的值可直接写入E000H的数据结构。
下一步是为将系统内存写至硬盘驱动器31的挂起文件(Suspend File)而做好准备。系统内存包括系统RAM 53(它包括主内存和任何扩展内存)以及视频内存58。这时,部分RAM 53可以处于外部高速缓冲存储器60内。在286处倾泻CPU的高速缓冲存储器,这将在以下与图13有关的内容中予以说明。然后,在286处倾泻外部高速缓冲存储器并使该存储器提高向硬盘31的写的速度。
在计算机系统10内执行的代码可能已将IDE控制器86置入了未知的状态。因此,下一步是在292处将IDE控制器86初始化成已知的状态。这是通过把值直接写至IDE控制器86内的寄存器而实现的。
然后,在976处启动中断驱动的并行线程以读取任何调制解调器的状态并使该状态保存至E000H的数据结构中。该例程做以下工作:捕捉对应于COMM端口的中断,而COMM端口则与特定的调制解调器有关;将命令传递给上述调制解调器以使该调制解调器顺序地传回该调制解调器之寄存储的内容;接收从上述调制解调器所传送的寄存器内容;以及将上述寄存器的值保存至E000H的数据结构中。这一例程将一第一命令传送给调制解调器,然后以中断驱动的方式响应,以便接收调制解调器的应答并响应每个COMM端口的中断将下一个命令传递给调制解调器,直至保存了所有调制解调器的寄存器。如果不是作为并行线程运行的,则这一例程给挂起计算机系统所花费的时间增加几秒钟(每个调制解调器为3-5秒,这取决于特定的调制解调器以及当前的波特率)。由于是中断驱动的并行线程,所以,如果该例程在已将系统状态写至硬盘驱动器31之前结束运行,则该例程不给挂起增加时间。
在上述中断驱动并行线程的调制解调器保存例程启动之后,必须在294处使挂起文件处在硬盘驱动器31的固定盘上。挂起文件的磁头、扇区和柱面均存储在CMOS存储器96中。一旦确定了挂起文件的位置,就读取该文件的大小与特征。在所说的最佳实施例中,上述特征是任意长度的ASCII码,它表示存在有挂起文件。也可以用其它方法实现所说的特征,例如使用二进制串,该串具有能在硬文件系统上被随机查找到的非常低的概率。
取读了挂起文件的文件大小与特征之后,下一步就是在296处确认该特征和文件大小是否是正确的。如果所说的特征不正确,这表明其它程序已修改了挂起文件,或者如果所说的文件大小是不正确的,这表明挂起文件的大小已被修改过,那么,挂起例程就在298处调用致命挂起错误例程(Fatal Suspend ErrorRoutine),此例程始于图13的任务652处。如果用户按下开关17,以退出致命挂起错误例程,程序控制权从任务299转至任务506。
另一方面,如果所说的特征是正确的并且挂起文件足够大,则挂起例程开始将计算机系统的状态写至内存。
在将计算机系统10的状态写至硬盘驱动器31之前,CPU 40在297处命令微控制器U2重新启动(复位)故障保险计时器并查询微控制器U2以确定是否再次按下了开关21。如果没有再次按下开关21,则挂起例程继续。另一方面,如果再次按下了开关21,则中止挂起。可以在挂起例程内的若干点处重新启动故障保险计时器并测试开关21的接通情况。任务297仅仅是说明性的,这项应用技术中普通的电路设计者能够确定重新启动故障保险计时器的次数及其间容许的时间。在故障保险计时器到时以使电源17“关闭”之前,挂起例程应复位故障保险计时器。同样,应不时检查一下开关21。如果再度按下开关21,这表示用户希望中止挂起,那么,上述代码应转至继续例程中的适当点处以便“不进行挂起”并从部分挂起中恢复。
与此类似,在350处按下Ctrl-Alt-Del键会中止挂起。按下Ctrl-Alt-Delete键(同时按下Control键、Alt键和Delete键)是复位以IBM BIOS和Intel 80X86系列CPU为基础的一般计算机系统的周知方法。计算机系统10用本技术中周知的BIOS一号中断处理程序来处理Ctrl-Alt-Del。计算机系统10在350处带有略有改变的1号中断处理程序,该处理程序在352处清除CMOS存储器96中的挂起标志并在354处复位时转至引导例程。
在本发明的计算机系统10中,挂起例程正在运行时按下Ctrl-Alt-Del会使得计算机系统进入关机状态。这是因为,在开关21接通之后,按下Ctrl-Alt-Del会调用引导例程,而引导例程则会将微控制器U2初始化成这样的状态:故障保险计对器业已到时且开关仍处于断开/释放状态。因此,在处于挂起例程时按下Ctrl-Alt-Del会使计算机系统10进入关机状态。
参照任务300,再次使挂起文件处在硬盘驱动器31上,将特征短语在300处写至挂起文件的第一字节。然后,在302处将E000H段中的整个64K字节的数据写入挂起文件。E000H的上述64K拷贝实际上只是一个位置保留区并且将会在挂起例程结束时重写这一相同位置。
然后,在303处将视频控制器56的状态保存起来。视频控制器56的寄存器在本技术中是周知的。CPU 40可以直接读取上述所有的寄存器,而且,这些寄存器的值可直接写至E000H中的数据结构内。
随后,将系统内存写至挂起文件,这是由一双缓冲区系统来实现的,该双缓冲区系统从系统内存中读取数据、并压缩该数据且将其写至E000H段,最后将已压缩的数据从E000H段写至挂起文件。在一时间多路复用结构中有两个例程在工作:一个压缩数据并写至E000H段,另一个写至挂起文件。前者在前台运行,后者则是在后台运行的中断驱动例程。很明显,由于只有一个CPU 40,因此在给定的时间内只能执行一个例程,但是,由于后一个例程是由中断驱动的,所以该例程在需要时可中断前一个例程的运行,使向挂起文件传递数据的速度最佳。上述两个缓冲区的每一个都为8K字节长,这被认为是可使向硬盘驱动器31的传递时间最佳化。
上述过程始于304,它读取足够的数据并进行压缩且写至E000H段以填充第一个8K的缓冲区。利用持续长度编码法压缩所说的数据,但是,也可以使用任何适当的压缩法。这时,在306处启动总体上在标号307处所示的写自缓冲区例程(Write fromBuffer Routine)。写自缓冲区例程307是一种在后台运行的中断驱动例程,包括任务308至任务310。总体上在标号311处所示的压缩例程包括任务312至任务318并且是一种前台例程。首先,写自缓冲区例程307在308处将刚被任务304所填写的缓冲区写至挂起文件。当写自缓冲区例程307将缓冲区的内容写至挂起文件时,压缩例程311在312处继续从系统内存中读取后面的字节并压缩它们且将压缩后的数据写至前述两个8K缓冲区中的另一个内。一旦压缩例程311用压缩后的数据填满了上述缓冲区,下一步就在314处确定是否已压缩了整个系统内存。
IDE控制器86不能很快地将数据写至硬盘驱动器。因此,压缩例程311总是会在写自缓冲区例程307完成将8K缓冲区写至硬盘驱动器31之前完成填满未被写至硬盘驱动器31的8K缓冲区。所以,压缩例程311必须等待写自缓冲区例程307完成将缓冲区写至硬盘驱动器31。如果压缩例程311尚未完成压缩所有的系统内存并对它们进行写操作,则压缩例程311在316处等待写自缓冲区例程307。压缩例程311和写自缓冲区例程307通过一组标志而相互通信。写自缓冲区例程307在完成将当前缓冲区写至挂起文件时会随后转换该缓冲区的标志,以便向压缩例程311表明它可以用压缩后的数据填写刚被写至挂起文件的缓冲区。然后,在309处复位故障保险计时器C2并以与任务297有关的内容所述的方式检查开关21的接通事件。
然后写自缓冲区例程307在310处确定刚写至挂起文件的缓冲区是否是最后一个要写的缓冲区。如果不是,则写自缓冲区例程将刚由压缩例程311所填写的缓冲区写至挂起文件。同时,压缩例程311通过检验缓冲区标志而确定是否为另外压缩的系统内存准备好了缓冲区。也就是说,压缩例程在316处等待直至写自缓冲区例程处理完当前的缓冲区,这时在312处继续压缩循环。请注意,如果支持线性帧缓冲技术,则可压缩视频内存58,但对VESA页存取来说却不压缩视频内存58。相反,视频控制器56利用VESA调用读取VESA页存取视频内存并且在不用以上详细说明的双缓冲区系统进行压缩的情况下写VESA页存取视频内存。
一旦压缩例程311完成了压缩所有系统内存,该例程就会在318处等待写自缓冲区例程307完成将最后的缓冲区写至挂起文件。一旦写自缓冲区例程307结束,该例程就会从310转至318并不再存在。这时,没有后台例程在运行并且主程序在320处继续。
然后,在任务320处,将DMA部件71(DMA控制器72和中央仲裁器82)、82077软盘控制器84以及RS-232 UART(通用知的寄存器。软盘控制器84和UART 94内的所有寄存器均可由CPU 40直接读取,并且,这些寄存器的值可直接写至E000H内的数据结构中。DMA部件不带有可读寄存器。相反,一般在每次DMA传送之前都建立起只写寄存器。为此,如果正在进行DMA传送,则挂起例程停止挂起。
随后,挂起例程在978处测试与任务976有关的内容所述的中断驱动的调制解调器状态例程是否结束。如果没有结束,则挂起例程等待上述调制解调器状态例程结束。
应该认识到,一旦计算机系统10进入挂起状态150,就最好能检测到对挂起文件的任何修改。例如,对某些人来说,可能会生成一修改过的挂起文件并将该挂起文件传送至硬盘驱动器31且试图使计算机系统10恢复成与所保存的状态不同的状态。为此,将一伪随机值放至到E000H段的数据结构中。如328处所示,在中断驱动的调制解调器状态保存例程结束之后,从高速计时器102之一中读出一16位的时标。然后将该时标写至E000H段的数据结构中。
然后,通过在不考虑进位的情况下将E000H中的各个16位字加在一起而计算出用于整个E000H段的16位校验和。该校验和在330处写至E000H段的数据段中并在332处写至CMOSNVRAM 96中。此后,在334处将所有的工作变量从CPU 40写至E000H段的数据结构中,并且,在336处将整个E000H段从挂起文件的特征短语之后开始(紧接在该特征之后)重新写至挂起文件。然后,在338处设置CMOS NVRAM 96内的挂起标志,以便通知计算机系统10已将该计算机系统的状态保存到了挂起文件内。
随后,挂起例程在980判定是否已采用了检查点。如果是这样的话,计算机系统就不应降低功耗,反之,计算机系统必须继续到从刚刚进行的部分挂起中恢复的程度。所以,如果已采用了检查点,挂起例程在982处转至继续例程的任务484处,然后,继续例程进行部分的继续。
如未采用检查点,则CPU 40通过命令微控制器U2将
ON信号设置成逻辑0而“关闭”电源,从而使电源17的初级/稳压部件172停止沿±5和±12线提供稳定的电压。该电压要花几秒钟的时间才能递减至约为0,从而给CPU 40以时间去执行多条命令。所以,在342处,CPU 40在等待电源17所产生的系统电压减小时会作无限的循环(“旋转”)直至CPU 40停止起作用。
参照图11,它显示了引导例程的详细内容。与图8有关的内容概述了引导的过程。当CPU 40转至复位矢量(Reset Vector)所指的代码并执行该代码时,引导例程就在380处开始。每当CPU 40增加功耗并且无论何时CPU 40因转至上述复位矢量所指的代码时,都会出现上述情况。复位的过程在本技术中是周知的。
第一项任务是在382处测试CPU 40并初始化内存控制器46。CPU是由POST例程来测试的。CPU的测试部分确定CPU 40是否是带有SMI的“S”部件。如果是这样的话,就设置一标志以指示这一情况。POST例程还初始化内存控制器46。
然后,引导例程在986处测试微控制器U2是否在起作用。为此,CPU顺序地读取电源管理电路106的状态端口并等待该端口处从HIGH到LOW以及从LOW回到HIGH的转换。这种转换说明微控制器U2的心搏正在起作用,所以,CPU 40可以在假定微控制器U2按希望的那样起作用的情况下继续进行引导过程。
如果CPU在预定的时间如一秒或两秒内没有检测到状态端口处的转换,则微控制器U2就不具有心搏,CPU 40就会在988处命令第一电路PAL U1复位微控制器U2,如前所述。然后,CPU 40在990处再次等待状态端口处从HIGH到LOW的转换。如果CPU在一秒或两秒的时间内又没有检测到状态端口的转换,则微控制器U2不具有心搏,因而CPU 40会于922处在假定微控制器U2处于不能复位的状态的情况下使本文所述的电源管理特征无效。
另一方面,如果微控制器U2正在起作用,则CPU 40在994处刷新微控制U2内唤醒警铃值的分钟数。RTC 98的时基要比微控制器U2的时基精确得多。所以,为了在不给微控制器U2增加更精确因而是更昂贵的时基的情况下克服上述局限性,BIOS使上述不太精确的时基与上述更为精确的时基相同步并在每次系统引导时用来自RTC 98的更为精确的值更新微控制器U2内唤醒警铃值的分钟数。为了做到这一点,CPU 40从CMOS存储器96中读取警铃的绝对日期和时间并计算唤醒警铃值的分钟数且将该分钟数写至微控制器U2。
此后并且如果微控制器U2不起作用从而使所说的电源管理特征无效,则引导例程在996处确定是否因电源17的加电而引导了计算机系统。最佳的是,总是有交流电加载于电源17的初级/稳压部件172上,并且,ON#输入控制着对±5和±12线处的电压调节。这样电源17可以不断向使电源管理电路106通电所需的AUX5供电,并且,电源管理电路106在不转换交流电的情况下控制电源17。
但是,正如本技术的专家所周知的那样,某些用户喜欢用开关式配电板(未显示)来对计算机系统加电,从而用一个单一的开关接通和断开整个计算机系统的交流电。这对电源管理电路106来说就存在着问题,因为,微控制器U2和其它设备均被配置成要由AUX5电源线不间断地供电。所以,计算机系统必须具有能确定它已因接通了交流电而被加电并且相应地活动的方法。
但是,AUX5线还会遇到上述电压降低和断电的情况。在出现电压降低和断电的情况之后,复位子电路920会复位微控制器U2以防止该微控制器因超出容许电压而中止。所以,计算机系统必须能进一步确定在降低电压之后或加载了交流电之后是否唤醒了微控制器。
因此,CPU在996处向微控制器U2查询有关使电源17接通的事件。微控制器可以返回下列四种应答之一:(1)微控制器已被复位,因而使得电源17开始在±5和±12线处提供稳压的电力;(2)唤醒警铃的分钟数到时;(3)在来自光隔离器OPTO1的振铃输入或RS-232振铃输入处产生了振铃;以及/或者(4)按下了开关21。诸如调度程序之类的应用程序可以直接从微控制器U2中读取计算机系统通电的原因,而所说的调度程序则会响应系统增加功耗的原因而运行特定的程序。另外,通过一个或多个BIOS调用也可以成为使计算机增加功耗的原因。
除了可被CPU 40复位以外,微控制器U2只能被复位子电路920所复位,每当AUX5线被加电或者故障,上述电路都会复位微控制器。所以,如果微控制器U2被复位或者微控制器返回了一在997处测试的无效唤醒代码,则CPU 40必须要在998处确定电源是否应继续在±5和12±线处调节电压。为此,在CMOSNVRAM内使用了一个标为DEFAULT_ON的标志。如果设置了该标志,则电源17应在微控制器U2被复位之后继续提供稳压的电力。另一方面,如果未设置DEFAULT_ON,则电源17应在微控制器U2被复位之后停止提供稳压的电力,所以,CPU 40会在1000处命令微控制器U2使电源17停止在±5和±12线处提供稳压的电力,此后,电压会花几秒钟的时间下降至约为零,从而给CPU 40以时间去执行多条命令。因此,CPU 40在等待电源17所产生的系统电压下降时会在1002处执行无限循环(“旋转”),直至CPU 40在1004处停止起作用。如上所述,微控制器U2最好由AUX5线不间断地供电并连续执行已编程的例程。
此后,如果微控制器在997处返回一有效的唤醒代码,或者如果虽微控制器U2被复位,但计算机系统仍在998处保持加电状态,则CPU 40会在1004处命令微控制器U2在确认应关闭电源而使电源17停止在±5和±12线处提供稳压电力之前向CPU 40产生一SMI。此外,CPU还在1004处设置CMOS NVRAM内的DEFAULT_ON位,因此,如果断掉交流电,计算机系统会在重新加载交流电时自己返回接通状态。
然后,引导例程在1006处执行本技术中专家所周知的FirstPlug & Plan Resource Allocation Pass(第一次插入及计划资源分配)。
随后,测试影子内存并将BIOS从ROM 88拷贝至RAM 53的影子内存部分。所执行代码的流程取决于是否在CMOSNVRAM 96内设置了挂起标志。如果设置了挂起标志,则计算机系统10处于挂起状态150,因而应将计算机系统10恢复至它被挂起时所处的状态。对E000H和F000H段内的系统RAM 53进行简化的测试。为了减少计算机系统继续所花费的时间,只检查上述内存的适当大小并将该内存置零(将0000H写至各个存储单元)。
另一方面,如果在CMOS NVRAM 96中清除了挂起标志,则对E000H和F000H段中的系统RAM 53作标准的深层次的内存测试,包括:(1)粘接位(sticky-bit)测试;(2)双位内存测试;以及(3)交叉地址线测试。这些测试在本技术中都是周知的。
在测试了E000H和F000H段之后,可投影BIOS,这包括将ROM BIOS 88拷贝至系统RAM 53以及将内存控制器配置成能够执行来自RAM的BIOS。投影BIOS可以增加系统的速度,并且能提高系统的效率,这是因为,正在运行来自较快的系统RAM53的BIOS(通常存取时间为80毫微秒)而不是来自较慢的ROM88的BIOS(通常存取对间为250毫微秒)。投影BIOS包括:将BIOS拷贝程序加载至内存低区的地址处;将BIOS从ROM 88拷贝至系统RAM 53的E000H段和F000H段;以及使影子RAM生效。
然后,在384处测试并初始化视频控制器56同时测试视频内存。这些测试及初始化工作在本技术中都是周知的。
随后,引导例程在1008处执行本技术的专家所周知的Second Plug & Plan resource allocation pas(第二次插入及计划资源分配)。
所执行代码的流程在386处取决于是否在CMOS NVRAM96内设置了挂起标志。如果设置了挂起标志,则象任务383那样只检查其余的系统RAM 53的大小,然后将该RAM置零。但是,如果清除了CMOS NVRAM 96内的挂起标志,则在398处用与任务383有关的内容所说明的三步骤深层次内存测试法来测试其余的系统RAM 53。
测试内存之后,在400处测试并初始化包括8259、UART、8042以及其它设备在内的辅助设备。在408处初始化固定盘控制器。
所执行代码的流程在409处取决于是否在CMOS NVRAM96内设置了挂起标志。如果设置了挂起标志,这表示在最近断电时已成功地保存了系统的状态,那样,引导例程就会跳过对硬盘驱动器控制器86和硬盘驱动器31的测试。另一方面,如果在CMOS NVRAM 96内清除了挂起标志,这表示在最近断电时未保存系统的状态,那么,正如在本技术中所周知的那样,引导例程在任务410处对固定盘控制器86以及硬盘驱动器31作完全的测试。
然后,在412处测试并初始化软盘驱动器控制器84。
这时,所有的设备均被初始化并且矢量均指向已知的存储单元,因此所有的中断例程都会象所希望的那样工作。所以,引导例程会在414处对BIOS数据区和矢量表进行快照,即将BIOS数据区和矢量表的拷贝写至E000H段的数据结构内。挂起例程在任务274处利用BIOS数据区和矢量表的上述拷贝将计算机系统10置为已知的状态,同时,所有的中断均能象所希望的那样工作。
然后,在416处如在本技术中所周知那样“扫描进”并初始化BIOS的任何扩展部分。BIOS的扩展部分是BIOS代码的程序块,该程序块是由诸如网络适配器之类的外部适配器增加给计算机系统。BIOS的扩展部分一般位于ISA总线76的C000H和D000H段内并且具有相关的“特征”以标识该BIOS扩展部分自身。如果检测到BIOS的扩展部分,就检查其长度并计算和检查校验和。如果上述特征、长度和校验和都表明存在有有效的BIOS扩展部分,则程序控制权转至位于上述特征后面三个字节处的指令,并且,BIOS扩展部分可执行诸如初始化外围适配器之类的任何所需要的任务。一旦上述BIOS扩展部分结束执行,控制权会返回至引导例程,而引导例程则会搜索其它的BIOS扩展部分。与上述BIOS扩展部分一样处理任何其它的BIOS扩展部分。如果没有检测到其它的BIOS扩展部分,则引导例程会转至任务417。
然后,CPU在1010处读取系统加电的时间增量并将该增量加至存储在硬盘驱动器31特定分区内的值,同时,将新的加电的总时间重新写回硬盘驱动器31的特定分区内。正如在本文其它地方将要说明的那样,微控制器U2在使计算机系统降低功耗之前会通过确立SMI线而中断CPU 40。因此,CPU会在假定计算机系统即将减少功耗的情况下执行某些特定的任务。最佳的是,这包括将某些信息(如加电时间计时器所测量到的经过时间)加电增量等保存至CMOS NVRAM。此后,CPU 40允许微控制器U2使计算机系统减少功耗。
引导例程在417处搜索硬盘驱动器31上特别为挂起文件而分配的分区。如果在分区表内找到带有PS/1标识符“FE”的分区或带有标识符“84”的冬眠分区,并且该分区足以容纳用于所述特定计算机系统的挂起文件,那么,就将该分区用于挂起文件。因此,将挂起文件的特征(Suspend File Signature)写至上述区域的第一字节处,并将该区域的起始磁头、扇区以柱面写至CMOSNVRAM 96。
然后所执行代码的流程在418处做分支转移,这取决于是否在CMOS NVRAM 96中设置了挂起标志。如果清除了挂起标志,则引导例程在420处将控制权转交给PBOOT例程。PBOOT在本技术中是周知的,它负责从软盘或硬盘驱动器31上加载操作系统(OS)以及命令解释程序。如果在任务417处未找到用于挂起文件的分区,则OS执行与图16有关内容所说明的OS专用驱动程序,该驱动程序检查是否找到了一个分区,并且,如果没有,则在FAT(文件分配表)中分配一由连续扇区构成的文件(如果必要的话,对一区域去除分段),将所说的特征写至挂起文件的第一个字节并将挂起文件的起始磁头、扇区以柱面写至CMOS NVRAM96。
不管在何时分配挂起文件,该文件均应是连续的扇区,从而在挂起和继续期间能够分别快速地写至磁盘以及快速地从磁盘中读出。
然后,OS按在CONFIG.SYS文件中所找到的指令配置计算机系统。最后,OS运行AUTOEXEC.BAT文件,该文件最终将执行控制权返回给操作系统。如果在CMOS NVRAM 96中清除了挂起标志,这表明最近断电时未保存计算机系统的状态,那么,就忽略RESUME.EXE,在与任务421有关的内容将详细说明RESUME.EXE。
参照任务418,如果在CMOS NVRAM 96中设置了挂起标志,这表示最近断电时保存了计算机系统的状态,那么,所执行代码的流程就会在419处作分支转移,这取决于是否在CMOSNVRAM 96内设置了重新初始化适配器标志(ReinitializeAdapters Flag)。如果设置了重新初始化适配器标志,则引导例程在421处将控制权交给PBOOT例程。同通常的PBOOT例程一样,本发明的PBOOT加载OS,OS则根据在CONFIG.SYS和AUTOEXEC.BAT文件中找到的命令配置计算机系统,此外,还加载驱动程序并按本技术中所周知的方式配置计算机系统。
CONFIG.SYS和AUTOEXEC.BAT中的命令可以初始化计算机系统中的适配器卡。本申请假定存在有三种类型的适配器卡:I型适配器不需要初始化;II型适配器需要初始化但被BIOS扩展部分或被每个CONFIG.SYS或AUTOEXEC.BAT所加载的驱动程序设置成周知的工作状态;III型适配器由计算机系统执行的代码所修改。可以挂起和恢复包括I型及II型适配器的计算机系统,但不能恢复包括含有多种网络适配器的III型适配器的计算机系统,除非该适配器卡带有相关的APM可认识的设备驱动程序,该驱动程序在诸如系统断电之类的情况发生之后可重新初始化上述适配器。系统可以挂起带有APM可认识的设备驱动程序的III型适配器卡。
在本实施例中,将文件RESUME.EXE加到AUTOEXEC.BAT文件内,RESUME.EXT负责将程序控制权从OS传送给继续例程。OS在任务420忽略RESUME.EXE的存在,但OS在任务421却执行RESUME.EXE,在OS从CONFIG.SYS和AUTOEXEC.BAT加载的设备驱动器结束初始化II型适配器之后,RESUME.EXE将控制权转给继续例程。
参照任务419,如果在CMOS 96中清除了重新初始化适配器标志,则OS通过RESUME.EXE将执行控制权转给继续例程。继续例程从硬盘驱动器上的挂起文件中恢复系统状态,继续例程将在与图12有关的内容中予以详细说明。
参照图12,它显示了从任务450至任务530的继续例程的详细内容。首先,在451处测试CPU,如果CPU带有SMI,则产生一CPU继续SMI,该SMI将CPU置为SMM(系统管理监控)模式并转至任务454处的代码。如果CPU不带有SMI,则停止继续,其中,进行复位,复位处理程序转至任务454处的代码。在配置进程中,可能会将BIOS数据区和矢量表修改成未知的状态。所以,基本的BIOS例程可能不象希望的那样起作用。因此,继续例程会在454处使E000H段成为可读/写的并且在456处调用交换BIOS数据区和矢量表例程(Swap BIOS Data Area & VectorTable Routine)。该例程将在任务414处拷贝至E000H段的已知且适当的BIOS数据区和矢量表与当前在0000H段内活动的经过修改的BIOS数据区和矢量表作交换。当上述交换例程结束时,上述已知的BIOS数据区和矢量表在E000H段内是活动的,而上述经过修改的BIOS数据区和矢量表则处在0000H段内,并且,BIOS例程会象所希望的那样起作用。
然后,继续例程在458处使除了支持键盘和硬盘驱动器的中断以外的所有中断都无效。此后,继续例程在460处确定挂起文件在硬盘驱动器31上的位置并读取文件的长度和特征,该特征如上所述是一用于挂起文件的多字节标识符。所执行代码的流程随后在462处作分支转移,这取决于挂起文件是否有正确的长度和特征。如果挂起文件不具有正确的长度和特征,则挂起例程在464处清除CMOS内的挂起标志,程序控制权在466处转给处于复位矢量(Reset Vector)所指向位置处的代码,从而使得计算机系统就象从未挂起那样进行引导。另一方面,如果挂起文件具有正确的长度和特征,则继续例程在468处继续,它通过将位于挂起文件内上述特征之后的64K块(挂起文件对应于E000H段信息的部分)读至1000H段内而使得计算机系统继续。
随后,在470处计算位于1000H段内的上述数据块的校验和,并在472处从CMOS非易失性存储器96中读出先前存储的校验和,引后,所执行代码的流程在474处作分支转移,这取决于任务470处所计算出的校验和是否与任务330处所计算出的校验和相同。如果任务470处所计算出的校验和不同于任务330处所计算出的校验和,则挂起文件因某种原因存在有问题(例如它可能被改变了等等),因而控制权转至任务464处,该任务如与任务464和466有关的内容所说明的那样清除挂起标志并复位计算机系统。如果任务470处所计算出的校验和与任务330处所计算出的校验和相同,则假定挂起文件与挂起例程所写的挂起文件是同一个文件,因而在476处将1000H段内的数据拷贝至E000H段。
继续例程在478处将一特定的信号屏面写至屏幕,该信号屏面用于通知用户计算机系统正在恢复以及用户应按下Cltrl-Alt-Del键以中止继续。同挂起例程一样,按下Ctrl-Alt-Del键会在526处清除挂起标志,并在528处重新引导计算机系统。因此,在按下Ctrl-Alt-Del键且继续例程正在运行时会重新正常引导计算机系统。
然后,在480和482处通过将来自E000H数据结构的值分别写至82077软盘控制器的寄存器以及DMA部件的寄存器中而恢复82077软盘控制器84和DMA部件71。
随后,在1020处启动中断驱动的并行线程,该线程用于从E000H的数据结构中恢复任何调制解调器的状态。同任务976处的例程一样,调制解调器恢复例程做以下工作:捕获与涉及该特定调制解调器的COMM端口相对应的中断;读取来自E000H数据结构的值;将命令与值传递给调制解调器以使该调制解调器恢复其中的寄存器。上述例程将一第一命令传递给调制解调器然后以中断驱动的方式进行应答,以便接收调制解调器的应答并响应各COMM端口的中断而将下一个值传递给调制解调器,直至恢复了所有的调制解调器的寄存器。同调制解调器保存例程一样,如果上述例程不是作为并行线程执行的,则该例程会在它要使计算机系统继续所花费的时间上增加几秒钟。作为一种中断驱动的并行线程,如果上述例程在从硬盘驱动器31中读出系统状态之前全部执行了,则该例程不给前述继续工作增加时间。
当从任务486到500处的中断驱动的并行线程调制解调器恢复例程开始之后,利用一双缓冲区例程从挂起文件中恢复系统内存,上述双缓冲区例程同与挂起例程中任务304至318有关的内容所说明的例程相类似。上述双缓冲区系统从挂起文件中读取压缩数据,将该压缩数据写至E000H段内,对压缩的数据进行解压缩并写至系统内存。有两个例程以时间多路复用的方式进行工作:一个从挂起文件中读取数据并将数据写至E000H段内;另一个对上述数据进行解压缩并将解压缩后的数据写至系统内存。后一个例程在前台运行,前一个例程则是在后台运行的中断驱动的例程。很明显,由于只有一个CPU,所以在给定的时间内只能执行一个例程,但是,由于上述前一个例程是中断驱动的,所以它可以根据需要中断后一个例程的执行,从而使来自挂起文件的数据传送的速度最佳化。上述两个缓冲区均为8K字节长,这认为能使传送时间最佳化。
上述进程始于486处,它从挂起文件中读取数据并将足够的数据写至E000H段以填充第一个8K的缓冲区。这时,在306处启动读自缓冲区例程(Read from Buffer Routine),该例程总体上用标号489表示。读自缓冲区例程489是一中断驱动的例程,它在后台运行并包括任务490-492。总体上用标号493所表示的解压缩例程(Decompression Routine)包括任务494-498并且是前台例程。首先,读自缓冲区例程489在490处开始读取挂起文件的下一个8K数据并将其写入现在为当前缓冲区的另一个缓冲区中。当读自缓冲区例程489从挂起文件中读取下一个8K数据并将其写入当前缓冲区中时,解压缩例程493在494处读取由任务486所填写缓冲区、对压缩的数据进行解压缩并将已解压缩的数据写至系统内存。一旦解压缩例程493对上述缓冲区内的所有数据进行了解压缩,则下一步就是在496处确定是否已对整个的系统内存进行了解压缩。
IDE控制器86不能很快地从硬盘驱动器31中读取数据。因此,解压缩例程493总是在读自缓冲区例程489结束将数据从硬盘驱动器31中读进当前缓冲区之前结束对未写至硬盘驱动器31的8K缓冲区的解压缩工作。所以,解压缩例程493必须等待读自缓冲区例程489结束从硬盘驱动器31读出数据。如果解压缩例程493尚未解压缩和写所有的系统内存,则解压缩例程493在498处等待读自缓冲区例程489。解压缩例程493和读自缓冲区例程489通过一组标志而相互通信。当读自缓冲区例程489结束将数据挂起文件读进当前缓冲区时,该例程489随后在490处转换上述缓冲区标志,这向解压缩例程493表明它可以开始对缓冲区内刚从挂起文件读出的数据进行解压缩。然后,读自缓冲区例程489在492处确定是否仍要从挂起文件中读取一8K的块。如果不是,读自缓冲区例程在502处从挂起文件中读取剩下的数据并将该数据写至当前缓冲区。然后读自缓冲区例程在后台停止运行,这实际是在500处等待解压缩例程完成对前面的内存所进行的解压缩工作。
同时,解压缩例程493通过检验缓冲区的标志而确定缓冲区是否准备好被解压缩至系统内存。也就是说,解压缩例程在498处等待,直至读自缓冲区例程结束对当前缓冲区的处理,这时,解压缩循环在494处继续。
一旦解压缩例程493结束了对所有系统内存的解压缩,则唯一在后台运行的例程是中断驱动的调制解调器恢复例程,而主程序则在504处继续,上述恢复例程在与任务1020有关的内容中给予了说明。
然后,在504和506处通过将来自E000H段数据结构的值写至视频控制器的寄存器以及IDE控制器的寄存器而恢复视频控制器56和IDE控制器86。任务504也是这样的程序点:如果已采用了检查点,则挂起例程就转至该程序点(见任务1024)。
此后,继续例程在1022处测试与任务1022有关的内容所述的中断驱动的调制解调器恢复例程是否结束。如果不是,则继续例程等待上述恢复例程结束。
如508处所示,中断驱动的调制解调器状态恢复例程结束之后,通过将适当的值写至CPU 40和高速缓冲存储器的控制器62而分别使CPU高速缓冲存储器41以及系统高速缓冲存储器60有效。随后,继续例程在510至514处通过将来自E000H段数据结构的值写至计时器控制器102、8042键盘接口微处理器104以及8259中断控制器92内的寄存器中而恢复这些设备的状态。
然后,通过在484处将来自E000H段数据结构的值写至UART的寄存器中而恢复UART 94。
此后,继续例程在516处调用交换BIOS数据区和矢量表例程。在调用上述例程之前,已知的BIOS数据区和矢量表在0000H段内是活动的,而从挂起文件中所读出的BIOS数据区和矢量表则在E000H段数据结构中是不活动的。交换之后,已知的BIOS数据区和矢量表在E000H段内是不活动的,而由挂起例程所保存的BIOS数据区和矢量表则在0000H段内是活动的。
最后,继续例程在518处转至恢复CPU例程(Restore CPURoutine),该例程将CPU 40恢复至挂起之前状态。在与图14有关的内容中将详细说明恢复CPU例程。恢复CPU例程最终将执行控制权交还给APM。
最后,CPU 40执行RETURN指令,从而使计算机系统返回至APM。系统当前继续执行代码,就好像它从未挂起过。从实用角度看,计算机系统不受挂起/继续过程的影响。
参照图13,它显示了保存CPU状态例程(Save CPU StateRoutine)的流程。挂起例程在600处转至保存CPU状态例程。请注意,APM已使上述例程从中开始执行的E000H和F000H段成为可读/写的。此外,APM将EFLAGS和八个通用寄存器保存起来,如602处所示。保存CPU状态例程在604处首先等待任一DMA结束并与鼠标器13的数据包相同步,以确保上述例程能在鼠标器数据包传输之间执行。下列步骤能使DMA结束并与鼠标器数据包相同步:(1)使中断生效;(2)用7毫秒等待任一DMA结束;(3)使中断无效;(4)用5毫秒等待鼠标器数据包的边界;(5)使中断生效;(6)再用5毫秒的时间等待鼠标器数据包的到达;以及(7)使中断无效。这些步骤之后,所说的代码可在鼠标器数据包之间安全地运行。
然后,在606处将地址线(Address Line)20(I/O端口92H)的状态压至堆栈。
随后所执行代码的流程在1030处做分支转移,这取决于CPU 40是否是带有SMI的“S”部件。如果是这样的话,CPU 40在1032处命令微控制器U2产生一SMI给CPU 40。CPU 40内的微码响应SMI而在1034处将CPU 40的状态保存至E000H段数据结构中的E000∶FE00H处。此后,CPU 40在1036处保存浮点协处理器的状态并在1038处调用挂起例程(图10)。正如本文其它地方所说明的那样,挂起例程在1040处返回并在1040处恢复浮点协处理器的状态。然后,在1042处,一RSM(继续)指令恢复CPU状态并转至任务732。
另一方面,如果CPU 40不带有SMI,则必须在608处用图13代码的其余部分将CPU的状态保存起来并将算术协处理器44的状态压至堆栈。然后,在610处设置或清除一标记以分别指示CPU是在32位模式下运行还是在16位模式下运行。
随后,所执行代码的流程在612处作分支转移,这取决于CPU 40是否在保护模式下运行。如果CPU 40不是在保护模式运行,则CPU 40必定在实模式运行并且可以非常直接的方式保存其寄存器。首先,在614处将机器状态字的值以及CR3写至E000H段的数据结构中。仍在614处将零写至E000H段数据结构中与TR和LDTR相对应的区域内,这是因为,在实模式下TR和LDTR均为零。
然后,上述代码并入616处的共用代码流程,在该流程处,将存储在GDTR和LDTR内的值写至E000H段的数据结构中。随后所执行代码的流程在618处做分支转移,这取决于CPU 40是否以虚拟8086模式运行。如果CPU 40未以虚拟8086模式运行,则代码沿共用路径继续至任务620,在此处将排错寄存器DR7、DR6、DR3、DR2、DR1以及DR0压入堆栈。这些寄存器供排错程序及其它例程使用的。在622处将DS、ES、FS和GS压入堆栈。然后将CS、SS和ESP写至E000H段的数据结构中。
这时,已对所有要写至E000H段数据结构的值进行了写操作,因此,可在626处将影子RAM的E000H和F000H段改回为只读的。然后在628处用Write-Back和Invalidate Cache指令倾泻CPU的高速缓冲存储器。
随后,在630处设置CMOS非易失性存储器96内的一个独特的关机标记(Shutdown Flag)。最后,保存CPU状态例程在632处实际上“返回”至挂起例程。所说的“返回”实际上是一种复位,该复位的后面是代码中的分支。通过转至复位矢量所指示的代码而复位CPU 40。复位CPU 40强制CPU进入实模式,这种方式下,在不必担心产生保护错误的情况下可以存取所有的设备与内存存储单元。此后,将CPU的状态已保存起来,并且,挂起例程必须将计算机系统其余的状态保存起来。
在复位矢量所指向的代码内,程序控制作分支转移,这取决于是否在CMOS 96内设置了关机标记。如果清除了关机标记,则计算机会象通常那样引导。另一方面,如果设置了关机标记,则代码转至挂起例程的其余部分,也就是说,执行控制权转至图10挂起例程中的任务253,该任务完成了挂起计算机系统10。因此,保存CPU状态例程在623处实际上“返回”至了挂起例程。
参照任务612,如果CPU处于保护模式,则代码在634处作分支转移,这取决于CPU是否处于虚拟8086模式。如果CPU不处于虚拟8086模式,则代码在636处再次作分支转移,这取决于当前的特权级别是否为零。如果当前的特权级别不为零则是一没有适当特权的例程正在执行保存CPU状态例程,因而要调用致命挂起错误例程(Fatal Suspend Error Routine,始于任务652处)。以下将详细说明致命挂起错误例程。如果程序控制从致命挂起错误例程返回,则CPU必须返回至调用保存CPU状态例程之前的状态,所以,程序执行会转至图14中的任务794,该任务能部分地恢复CPU。由于CPU中很少有变化,所以只需要部分地恢复。
参照任务636,如果调用代码具有适当的特权级别,则保存工作在642处继续,从而将CR0、CR3、TR以及LDTR的值保存至E000H段的数据结构中。然后,代码的流程进入616处的共用代码流程,在616处,如以上所述那样将GDTR和IDTR的值保存至E000H的数据结构。从此处开始,代码沿以上说明过的流程618至632执行,从而“返回”(复位加上一个分支转移)至其余的挂起例程代码。
参照任务634,如果CPU 40处于虚拟8086模式,则在644处继续执行,在644处,将机器状态字的值(CR0的低16位)保存至E000H的数据结构中,并设置一位于E000H段数据结构内的标志(Flag)以指示CPU处于虚拟8086模式。然后,代码经由转换646和648进入616处的共用代码。在任务618处,如果CPU处于虚拟8086模式,则控制转至650,在650处,将DS、ES、FS和GS的值保存到E000H段的数据结构中。代码再次并入624处的共用代码。从此处开始,代码沿以上说明过的流程624至623执行,从而“返回”(复位加上一个分支转移)至其余的挂起例程代码。
任务652至664显示了致命挂起错误例程,如果具有不适当特权级别的代码试图保存CPU的状态,则调用致命挂起错误例程。首先,在654处复位故障保险计时器,然后,在656处扬声器以可听见的频率蜂鸣数次,例如以886Hz长0.25秒蜂鸣三次,蜂鸣间隔为1/6秒。三声蜂鸣警告用户未进行所尝试的挂起。蜂鸣之后,在658处再次复位故障保险计时器从而在故障保险计时器到时之前给用户固定的15至18秒的时间以关闭电源17。
然后,致命挂起错误例程在660至662处重复地检查用户是否按下了开关21,这表示用户要中止挂起。通过CPU查询微控制器U2是否产生了接通事件,从而能检查开关的接通情况。如果用户按下了按钮21,则执行控制返回至前述的任务640。如果用户未在15至18秒内按下按钮21,则故障保险计时器将会到时,微控制器会“关闭”电源17,因而很明显,CPU 40所执行的代码在系统电压降至容差范围之外时均会停止。
参照图14,它显示了恢复CPU状态例程(Restore CPURoutine),该例程始于700处。在其余的硬件及内存均已恢复至它们挂起之前的状态以后,继续例程会调用上述恢复CPU状态例程。首先,如果E000H段还不是可读/写的,则应在702处将该段置成可读/写的。
然后,所执行代码的流程在704处作分支转移,这取决于CPU 40在挂起时是否是以虚拟8086模式运行。如果CPU 40在计算机系统10挂起时以虚拟8086模式在运行,则代码进入任务706至728,任务706至728是恢复虚拟8086 CPU专用的。然后代码并入从任务730至748的共用流程。
如果在保存CPU状态时CPU处于虚拟8086模式,则用于将CR、LDTR及TR的值保存至E000H段数据结构中的保存CPU状态例程无法存取CR3、LDTR和TR。所以,必须分别在706、708以及710处估计CR3、LDTR以及TR。一般地说,通过遍历系统RAM 31查找CR3、LDTR和TR所指向的结构,可估计出它们的值。例如,查找GDT内的LDT条目可以确定出LDTR。
在任务706处估计CR3。CR3包括页面目录基址寄存器(PDBR)。该寄存器包含有页面目录的页帧地址、页面级高速缓冲存储器禁止(PCD)位以及页面级写完(PWT)位。认识到页面目录一定始于系统RAM 53内的4K边界处,知道了由保存CPU状态例程保存到E000H段数据结构内的IDTR值和GDTR值并且假定BIOS代码从F000H段开始执行,就可以估计出PDBR。上述假定是合理的,这是因为,为了速度的缘故已将BIOS代码投影进了影子RAM。如果操作系统将BIOS代码拷贝至不同的区域,则对CR3的估计就会失败。
利用上述知识和假设,检测物理内存所有4K页面是否有对应于BIOS代码段的页转换表。也就是说,相对上述页面的03C0H偏移总是包含值000F0×××、000F1×××、000F2×××,……000FE×××。一旦确定了上述页面的位置,就在系统RAM 53内查找一页面目录,该目录的第一个条目对应于以上确定的页面表的物理地址。上述页面目录的物理地址是PDBR的最佳“猜测”值。
然后,通过确保PDBR能正确地转换用于GDTR和IDTR的地址而验证假设的PDBR。也就是说,PDBR用于转换GDTR的线性地址,并且GDT的第一个条目被验证是空的(null)(在任何CPU模式下GDT的头八个字节都是00H)。此后,验证所返回的物理地址是在物理内存的范围内。为了能进行线性至物理转换,使用模仿CPU转换方法的子例程,如果在物理内存中有该物理页面存在,则在ESI(段结束指示符)中返回经转换的地址并清除进位标志CF,如果内存中不存在该物理页面,则设置CF。利用这一转换例程从内存53中读取GDT的第一个字节。如果GDT的第一个条目为空(null),则假设的PDBR就通过第一次检验,因而会被再次检验。然后用该PDBR转换IDTR以便利用上述转移例程查找IDT。此后证实所返回的物理地址是在物理内存的范围内。如果IDT的第一个存储单元出现在物理内存内,则PDBR通过第二次检验。
如果假设的PDBR正确地转换成了GDTR和IDTR,则假定该值是PDBR,并将该值写至E000H段数据结构内的CR3区域。另一方面,如果假设的CR3没有通过检验,则上述例程会再次开始以在系统内搜索另外的BIOS代码段页转换表,该表可能会得出有效的CR3。
对正常的主板操作来说,总是假定PCD和PWT固定在00H。将它们的值置为0并同PDBR一起写入E000H段数据结构内的CR3区。
一旦估算出了CR3,就在708处估算LDTR。由于已知LDT在GDT内的某一位置处并且LDT一定会出现在内存中,所以,在估算出CR3的情况下,可以估算出LDTR。为了估算LDTR,在GDT内查找标记为当前的LDT。将在物理内存中出现(用与任务706有关的内容所说明的转换例程来测试)并被标记为当前的第一个LDT假定为LDTR所指向的表。将该表的起点的物理地址保存至E000H段数据结构内的LDTR区。
即使是在OS/2中有多个LDT可被标记为当前的并出现在物理内存中,上述估算LDTR的方法也是足够可靠的,因而可以使用。EMM 386是普通的虚拟8086模式(Virtual 8086 Mode)例程,因此似乎会有问题,但是,由于EMM 386只有一个CR3和一个LDTR,所以很容易估算出EMM 386的CR3和LDTR。
一旦估算出了CR3和LDTR,就在710处估算TR。从实质上说,要在GDT和LDT内的各个任务选择器条目中查找设置了忙位的任务状态选择器。测试各条目的类型字段以确定该条目是忙的80286任务状态选择器还是忙的80486任务状态选择器。假定忙的286 TSS(任务状态选择器)或忙的486 TSS中的第一个条目是TR所指向的地址。将带有忙的286或忙的486 TSS的上述条目的物理地址保存至E000H段数据结构内的TR区。如果没有条目带有忙的286或486 TSS,则将0保存到E000H段数据结构内的TR区。
估算出CR3、LDTR以及TR之后,代码在任务712处继续。在712处,如果TR指向有效的TSS,则在714处清除TR所指向的TSS内的忙位。不管怎样,代码在716处继续,在716处,将对GDT有效的选择器加载进DS、ES、FS和GS。在718处利用来自E000H段数据结构的值加载CR3和CR0。然后,在720处启动分页,因此,线性地址等于物理地址的区域只有E000H和F000H段内的区域。随后在722处将存储在E000H段数据结构内的值加内的区域。随后在722处将存储在E000H段数据结构内的值加载进IDTR、GDTR、LDTR以及TR。
最后,在724和726处通过将来自E000H段数据结构的对应于GS、FS、DS、ES、SS、ESP、EFLAGS(设置了VM位之后)以及CS的值压入虚拟8086中断堆栈(Virtual 8086 Interrupt Stack)而建立该堆栈。而且,还在726处将对应于任务730处的代码的返回地址压入上述堆栈。其后,执行IRETD指令以将CPU 40设置回虚拟8086模式并将执行权转给对应于任务730的代码。
任务730启动图14中各种线程均使用的共用线程。在任务730处,从保存在E000H段数据结构内的值中恢复协处理器44。然后地址线20(I/O端口92H)在732处从堆栈中弹出。任务732也是以SMI为基础的CPU保存状态例程所转至的程序点(见任务1046)。此后在734处使影子RAM的E000H段再次成为只读。在736处通过重新启动故障保险计时器而使ARM与硬件相连接,如与图6A和图19有关的内容所述。在738处再次使影子RAM的E000H和F000H段成为只读的。最后,恢复CPU状态例程在740处设置一标志,此标志表示进行了正常的继续。恢复CPU状态例程并不执行任务742、744和746,这些任务只用于表示:在返回到被挂起事件所中断的代码之前的某一时刻,八个通用寄存器会弹出堆栈;使可屏蔽的中断有效(如果代码中断时它们已被置为有效的话);以及所说的标志弹出堆栈。最后,恢复CPU状态例程返回至管理例程,管理例程将控制权交返给APM,APM又更新任何旧的系统值并将控制权交返给被中断的代码。
参照任务704,如果CPU 40在中断时不处于虚拟8086模至748的共用线程。在750处,如果E000H数据结构中的TR值显示出TR指向有效的TSS,则在752处清除上述TSS内的忙位,然后在754处将来自E000H段数据结构的值装入GDTR和CR0。
然后在756至764处将一空的(dummy)页面目录表和页面转换表装入E000H段。首先,在756处使影子RAM的E000H段成为可读/写的。其次,在地址0E 000H处创建一新的页面目录表,如758处所示。第三,在760处更改上述新页面目录表内的第一个条目以使之指向0E 1000H。第四,在0E 1000H处创建一新的页面转移表,以使得地址0E 000H至0FFFFF是存在的,并使得线性地址等于这一地址范围内的物理地址,如762处所示。最后,将0E 000H装入CR3内的页面目录基址寄存器。因此,可以通过0E 0000H内的新的空(dummy)页面目录和页面转换表来进行地址转换。当在任务754处加载754时,重新激活页面调度(如果可行)。
然后,在766处使影子RAM的E000H和F000H段成为可读/写的。此后,如果CPU 40在挂起时正在执行16位的代码,则CPU处于16位模式(16-Bit Mode),因而在770处将指向16位代码路径的偏移值保存至E000H段的数据结构内。另一方面,如果CPU 40不处于16位模式,则CPU处于32位模式(32-BitMode),因而在772处将指向32位代码路径的偏移值保存至E000H段的数据结构内以代替16位的偏移值。无论是哪一种情况,上述两种代码路径都是平行的,不同点只在于一个使用16位操作操作数,另一个使用32位操作数。任务770和772只在上述平行的路径之一中建立所说的偏移值。在以下所述的任务782处进入上述路径之一(与偏移值相对应的那个路径)。
然后,在774处,将来自E000H段数据结构的CR3值装入EDX,将来自E000H段数据结构的SS值装入CX,将来自E000H段数据结构的ESP值装入EBP,将来自E000H段数据结构的TR值装入ESI的高位部分,将来自E000H段数据结构的LDTR值装入ESI的低位部分(SI)。这些值被移位进下面各自适当的存储单元。在776处将来自E000H段数据结构的值装入GDTR、LDTR和CR0。在778处,将存储在SI内的LDTR值装入LDTR。然后代码远程转移至在任务770或772处设置的偏移值。通过直接将操作码放进源代码内并利用来自任务770或772的偏移值,可以将上述远程转移偏码。然后,代码转至16位操作码路径或32位操作码路径,如782处所示。
此后,在784处将存储在EDX内的CR3值装入CR3、将存储在CX内的SS值装入SS、将存储在EBP内的ESP值装入ESP。在786处将GS、FS、ES和DS弹出截栈。在788处,如果被中断的CPU 40正在以受保护模式执行代码,则在790处将存储在ESI高位部分内的TR值装入TR。无论是哪一种情况,代码都在任务792处继续,在任务792处,排错寄存器DR0、DR1、DR2、DR3、DR6以及DR7均弹出堆栈。
这时,代码的流程并入任务730至748的共用代码流程,此代码已在以前作了说明。在794处,错误恢复例程从保存CPU状态例程的任务640进入上述共用代码流程。
参照图15,它显示了保存8259状态例程(Save 8259 StateRoutine)的流程图,该例程始于800处。保存8259的状态始于在802处保存实时时钟98所使用的周期性中断值,以及在804处将所有的其它可读寄存器保存至E000H段的数据结构。正如在本技术中所周知的那样,计算机系统10的结构需要某些8259只读寄存器具有固定的值。这些值是周知的,并且不需要确定。难以获得的8259值是8259的基地址、8259从属地址以及OS将两个8259设置成能显示出未决的中断还是能显示出进行中的中断。
用图15中的其余代码判定上述四个项目。在仅不屏蔽键盘12和鼠标器13的中断的情况下屏蔽8259,如806处所示。
在808处通过将1K的底部物理内存拷贝至E000H段数据结构而将中断矢量表保存起来。然后,在810处,通过加载256个独特的空矢量而将一新的“空”(dummy)中断矢量表装进上述1K的底部物理内存,而所说的256个空矢量则指向256个空中断服务例程,这些例程始于C800H段。如812处所示,在C800H段内生成256个空中断服务例程。
然后在814处禁止键盘12和鼠标器13中断。在816处确认任何未被确认的键盘12和鼠标器13的中断。
此后在818处产生一键盘中断并在820处测试该中断以确定是否将基址8259设置为未决的或是使用的。随后将该值写至E000H段的数据结构中。代码在822处等待对中断的服务。通过调用上述空服务例程中的一个而在824处对中断进行服务。调用上述空服务例程来确定8259的基地址并确定该8259是处于未决模式还是处于工作中模式,将所说的基地址与模式保存至E000H段的数据结构中。
对从属的8259来说,在任务826、828、830和832处执行类似的过程。
在834处通过将来自E000H数据结构的值拷回1K的低部物理内存而恢复中断矢量表。然后在836处再次将E000H段置为只读的,并且,在838处屏蔽所有的中断,以便在840处返回调用程序。
参照图16,它显示了用于动态分配挂起文件的例程。如与任务1012有关的内容所说明的那样,分配在FAT内的挂起文件应是连续的扇区以便能在挂起与继续过程中分别快速地写至磁盘和快速地从磁盘中读出。此外,正如本技术的专家所知道的那样,挂起文件必须足够大以便存储整个系统状态经压缩的内容。
为此,上述动态分配挂起文件的例程始于1050。每当计算机系统在不执行继续例程的情况下进行引导时,OS就执行上述例程,并且该例程是在系统中增加内存之后执行的。首先,图16所示的分配例程在1052处通过检查CMOS NVRAM内的标记来测试是否存在有电源管理电路。如果不存在电源管理硬件106,则程序在1054处退出。如果存在电源管理的硬件106,则该例程在1056处检查确定是否有未决的继续,如果有,则程序在1058处退出。
如果继续不是未决的,则分配例程在1060处测试是否有保存文件的分区(Save File Partition)。如果存在有保存文件的分区,则程序在假定该分区足以能存储整个系统状态的情况下而在1062处退出。
如果不存在保存文件的分区,则必须在FAT中为该保存文件(Save File)分配一个文件。首先,在1064处确定上述文件的长度。此长度是通过把系统RAM 53的长度、视频存储器58的长度、其它任何带有较大易失性存储容量的设备的长度以及用于存储诸如CPU 40之类的各种设备的寄存器值的64K字节区域加在一起而计算出来的。
计算出所需的保存文件长度之后,分配例程在1066处试着在FAT内分配该保存文件。如果在硬盘驱动器31上没有足够可用的存储空间,则分配例程就在1070处调用一个例程,在可能情况下增加硬盘驱动器31可用空间长度。
DOS调用无法保证文件中连续的扇区。所以,如果硬盘驱动器31具有足够的空间去存储保存文件,则分配例程在1072处确定该空间是否是连续的。如果保存文件是分段的(不连续),则分配例程就在1074处调用一个例程,在可能情况下消除硬盘驱动器分段,以便为保存文件提供连续的文件。
如果保存文件不是分段的,则分配例程在1076处将特征(“PS/1 Power Management”)写至保存文件的第一个扇区。然后,分配例程在1078处将上述文件的DOS句柄转换成用于BIOS的物理柱面、磁头以及扇区并将这些值写至CMOS NVRAM。最后,分配例程在1080处退出。
在1074处调用的用于消除硬盘驱动器31的分段的例程始于任务1082并继续至任务1094。首先在1084处测试硬盘驱动器31以确定是否已用一种本技术专家所周知的硬盘驱动器压缩例程对它进行了压缩。
如果硬盘驱动器31未被压缩,则在1086处用本技术专家所周知的消除分段实用程序来消除整个硬盘驱动器31的分段。此后,上述例程在1088处返回以便在1090处重新开始分配例程的分配部分。
如果硬盘驱动器31是压缩的,则在1092处将其压缩部分减至最少。此后,在1094处用本技术专家所周知的消除分段实用程序来消除硬盘驱动器31未被压缩的部分的分段。然后,所述例程在1088处返回以便在1090处重新开始分配例程的分配部分。
在1070处调用的用于增加硬盘驱动器31上可用空间的例程始于任务1100并继续至任务1110。首先,在1102处测试硬盘驱动器31以确定是否用一种本技术专家所周知的硬盘驱动器压缩例程对它进行了压缩。
如果硬盘驱动器31未被压缩,则它没有可用于保存文件的足够空间,因而在1104处显示一报文以通知用户使用挂起或继续特征,用户必须增加额外的硬盘驱动器容量或者从硬盘驱动器31上删除一些文件。
如果硬盘驱动器31是压缩的,则如果可能的话,在1108处增加其未被压缩部分的长度。此后,所述例程在1110处返回以便在1090处重新开始分配例程的分配部分。
参照图17,它显示了退出待机状态的例程,该例程始于1120处。从概念上讲,计算机系统在退出待机状态152时会反向改变系统从正常操作状态150转换至待机状态152时所产生的变化。简要地说,计算机系统在退出待机状态152时会作下列工作:恢复视频信号;使LED 23发光;使硬盘驱动器31内的硬盘起转;恢复系统时钟;禁止APM CPU空闲调用,因此,来自APM驱动器的CPU空闲调用不再会使CPU 40停机;以及清除指示计算机系统10处于待机状态152的标记。
首先,所述例程在1122处测试是否在计算机系统进入待机状态152时产生了一检查点(Cheekpoint)。如果是这样的话,则在1124处清除检查点采用位以表明该检查点不再有效。在本特定的实施例中,当计算机系统退出待机时,该检查点会失效。如果计算机系统在处于待机状态时失效,则检查点数据只用于使该系统继续,这是因为,多数系统都使用硬盘驱动器上的虚拟交换文件,并且,从该检查点数据的继续工作会将机器置成这样的状态,在这种状态下,上述交换文件完全不同于作为检查点数据而存储起来的系统状态所预期的交换文件。另外,可在下一次磁盘存取之后使检查点数据失效。此外,在系统从检查点数据继续时,可以在磁盘存取一个可能使计算机系统出现问题的文件之后使检查点失效。再有,如果用户理解从检查点数据的继续工作可能使硬盘驱动器31上的部分或全部数据丢失,则用户可以随时使用检查点数据。
此后并且如果未采用检查点,则CPU 40在1126处命令微控制器U2作下列工作:(i)使视频控制器56再次开始生成视频信号;(ii)使时钟合成器906恢复较高的系统时钟频率(25MHz或33MHz);以及(iii)使LED 33发光。然后,CPU 40在1128处将适当的值写至固定盘控制器86以使硬盘驱动器31的硬盘开始旋转。随后,在1130处禁止APM CPU空调用,因此CPU不会停机。最后,在1132处清除待机标志(Standby Flag),这表示计算机系统10处于正常操作状态150,并且,所说的例程在1140处返回调用程序。
参照图18,它显示了进入待机状态例程,该例程始于1140。简要地说,计算机系统在进入待机状态152时会做下列工作:断开视频信号;使LED 23闪亮;使硬盘驱动器31内的硬盘停转;减慢系统时钟;使APM CPU空调用生效,因此,来自APM驱动程序的CPU空调用会使CPU 40停机;以及设置指示计算机系统10处于待机状态152的标志。
首先,上述例程在1142处测试是否采用了一检查点。如果是,就在1144处执行挂起例程的大部分内容,以便将计算机系统10的状态存储到硬盘驱动器31。本实施例中,在计算机系统进行待机时采用检查点。另外,可按与图17有关的内容中所讨论的注意事项来周期性地采用检查点并用该检查点使计算机系统继续。然后,在1146处执行足够的继续例程以便从1144处产生的局部挂起中退出。此后,在1148处设置检查点采用位以表示采用了有效的检查点。在本实施例中,仅在处于待机状态152时系统出现故障的情况下才使用检查点数据。在这种情况下,系统在引导时会从所保存的检查点处继续。
理想地,上述检查点应对计算机系统是完全透明的。因此,如果产生硬件中断以防数据丢失,则应使检查点失效。另外,同正常挂起一样,可以忽略任何硬件中断。
此后并且如果未采用检查点,则CPU 40在1150处命令微控制器做下列工作:(i)令视频控制器56停止生成视频信号;(ii)使时钟合成器906将系统时钟从其高频(25MHz或33MHz)减慢至8MHz;以及(iii)使LED 23闪亮。然后,CPU 40在1152处将适当8MHz;以及(iii)使LED 23闪亮。然后,CPU 40在1152处将适当的值写至固定盘控制器86以使硬盘驱动器31内的硬盘停转。随后,在1154处使APM CPU空调用生效,因此,来自APM驱动程序的CPU空调用会使CPU 40停机。最后,在1156处设置待机标志,这表示计算机系统处于待机状态152,并且,所说的例程在1158处返回调用程序。
尽管通过本发明的最佳实施例说明了本发明,并且是较详细地说明这些实施例,但是,本申请人并不想以任何方式把后附的权利要求范围局限于上述细节。本技术的专家将非常清楚其它的优点和改进很容易实现。例如,由电源管理电路106所执行的多种任务,如对一个或多个中断的硬件监控等,可内装在系统芯片内。所以,从更广泛的方面来说,本发明并不局限于所显示和说明的特定细节、代表性的设备与方法以及示意性的实例。因此,在不脱离本申请人之发明的总体概念的精神和范围的情况下,可以与以上细节不一致。