当在下文中通过参照表示本发明最佳实施例的附图,本发明将得到更全面的描述时,在下述说明的开端处就应该理解到,只要仍可达到本发明的有利结果,熟悉有关技术的人可以修改这里所描述的发明。相应地,下述的说明认为是对熟悉有关技术的人是一种概括性的、教学性的公开,而不是对本发明的限制。本发明涉及到对计算机系统的完整的设计、包括但不限于计算机体系结构设计、数字设计、BIOS设计。保护方式80486代码设计、应用程序代码设计、操作系统代码设计和先进功率管理预先编程接口应用等方面。本应用是写给非常熟悉计算机系统设计的各个方面的人的。
现在更具体地参考附图,在那里显示包括本发明的微机系统,其笼统地用10指示(图1)。如上文中提到过的,计算机10可以包括相关的监视器11、键盘12、鼠标器13和打印机或绘图机14。计算机10有一个罩15,罩由装璜外表面构件16(图2)和内屏蔽构件18组成,内屏蔽构件18和机箱19确定一个封闭的和屏蔽的体积,用来安装用于处理和存储数字数据的以电为动力的数据处理和存储部件。至少某些这些部件安装在一块多层平面20或母板上,其安装在机箱19上并提供一种装置把计算机的部件在电气上连接起来,这些部件包括上面确定的部件还包括其它有关的部件如软盘驱动器、不同形式的直接存取存储设备、辅助卡或板和类似物。如下文中更充分地指出那样,在平面上采取措施以提供来往于微机操作部件的输入/输出信号的通道。
计算机系统具有电源17和电源按钮21,即下文中的开关21。和普通系统里的常用电源开关不同,电源按钮不切换进出于电源17的非稳压线功率,这将在下面得到解释。机箱具有在22处标明的底座、在24处标明的前面板和在25处标明的后面板(图2)。前面板至少划定一个开槽(在图示的形状里,有四个开槽),用以安装数据存储设备,诸如用于磁盘或光盘的磁盘驱动器、磁带后备机或类似物。在图示的形状里,准备了一对上槽26、28和一对下槽29、30。一个上槽26适用于安装首要尺寸(如所知的3.5英寸驱动器)的外围设备驱动器,另一个上槽28适用于安装从两种尺寸(如3.5或5.25英寸)中选出的一种尺寸的驱动器,两个下槽适用于容纳一种尺寸(3.5英寸)的驱动器。在图1的27处标明的软盘机是一种可移动媒体直接存取存储设备,如众所周知,它可容纳插到其中的软盘片并利用软盘片接收、存贮和发送数据。硬盘机标明在31处,它是固定媒体直接存取存储设备,如众所周知,可以存储和发送数据。
在涉及到本发明的上述结构之前,可能值得一般性概括地回顾个人计算机系统的操作。参照图3,它表示一个个人计算机系统的方块图,说明比如按照本发明的系统10的计算机系统的各种部件,包括安装在平面20上的部件、该平面和I/O槽的连接和个人计算机系统的其它硬件。和平面相连的是由微处理机构成的系统处理机40,即CPU40,它通过高速CPU本地总线42和存储器控制器46连接,其进而连接到易失随机存取存储器(RAM)53。存储器控制器46由存储控制器48、地址多路转换器50和数据缓冲器52组成。存储器控制器46进而和由4个RAM模块54代表的随机存取存储器53连接。存储器控制器48包括把来往于微处理机40的地址变换到RAM53的特定区域的逻辑。这个逻辑被用来回收以前由BIOS占用的RAM。由存储器控制器48产生的还有ROM选择信号(ROM-SEL),它被用来允许或禁止ROM88。尽管任何合适的微处理机都可用作系统处理机40,一种适当的微处理机是INTEL出售的80486。Intel 80486具有一个内部高速缓存,这样,任何是Intel 80486的CPU40将具有CPU高速缓存41。
尽管下文中本发明是特别参照图3的系统方块图说明的,在下面说明的开端应该理解到,这点是可预料的,即按照本发明的装置和方法可以用于其它平面插件的硬件配置。例如,系统处理机40可以是Intel 80286或80386微处理机。如在本文中所采用的,提及80286、80386或80486,一般意味着从Intel得到的微处理机。但是,近来其它厂家已研制出能够执行Intel X86体系结构指令集的微处理机,所提到的这些术语的使用意味着包括能够执行该指令集的任何微处理机。如适当领域中熟悉技术的人所知晓的那样,早期的个人计算机在当时一般使用流行的Intel 8088或8086微处理机作为系统处理机。这些处理机具有1兆字节存储地址的能力。近年来,个人计算机通常采用高速的Intel 80286、80386和80486微处理机,它们可运行在虚拟方式和实址方式下来仿真较慢速的8086微处理机,或者运行在保护方式下,这种保护方式把某些型号的寻址范围从1兆字节扩充到4吉(GB)字节。本质上,80286、80386和80486处理机的实址方式特性提供对写入到8086和8088微处理机的软件的硬件兼容性。在Intel家族里所叙述的处理机经常由三位数字辨别,即只用全类型标号的后三位数字来注明,如“486”。
现回到图3,CPU本地总线42(包括数据、地址和控制部件)保证微处理机40,数字协处理器44、视频控制器56、系统高速缓冲存储器60和高速缓存控制器62的连接。视频控制器56具有和它联结的监视器(或视频显示终端)57和视频存储器58。和CPU本地总线连接的还有缓冲器64。缓冲器64本身和速度较慢(和CPU本地总线42相比)的系统总线66连接,系统总线也包括地址、数据和控制部件。系统总线66在缓中器64和一个更远的缓冲器68之间延伸。系统总线66进一步和总线控制及定时装置70和DMA单元71连接。DMA单元71由中央仲裁器82和DMA控制器72组成。辅助缓冲器74提供系统总线66和一个任选功能总线如工业标准体系结构(ISA)总线76之间的接口。多个I/O槽78和总线76连接,以容纳ISA适配器卡(图中未示)。ISA适配器卡可插入地和I/O槽78连接,并可为系统10提供附加的I/O设备和存储器。
仲裁控制总线80把DMA控制器72和中央仲裁器82与I/O槽78、软盘适配器84和综合驱动电子(IDE)固定磁盘控制器86连接起来。
尽管微计算机系统10表明带有基本的4兆字节RAM模块53,但可以理解,即如图3所示通过增加任选的更高密度存储模块54可以互连更多的存储器。仅出于说明的缘故,本发明是参照基本的四兆字节存储模块描述的。
在系统总线66和平面I/O总线90之间连接着锁存缓冲器68。平面I/O总线分别包括地址、数据和控制部件。沿平面I/O总线90连接不同的I/O适配器和其它部件,如软盘适配器84、IDE磁盘适配器86、中断控制器92、RS-232适配器94、非易失性CMOSRAM96,在本文中也称为NVRAM、CMOS实时时钟98、并行适配器100、多个定时器102、只读存储器(ROM)88、8042 104和功率管理电路106。在104处表示的8042是从属处理机,它和键盘12和鼠标器13接口。功率管理电路106示于图6中,并在和图6及图7相应的文字段落中得到更详细的说明。只读存储器88包括BIOS,它用作为I/O设备和微处理机40操作系统之间的接口。存储在ROM88里的BIOS可复制到RAM53里以减少BIOS的执行时间。ROM88还进而对存储器控制器48作出响应(通过ROMSEL信号)。如果存储器控制器48允许ROM88工作,BIOS的执行出自ROM。如果存储器控制器48禁止ROM88工作,则ROM不对来自微处理机40的地址请求作出响应(即BIOS的执行出自RAM)。
实时时钟98用于计算时刻,而NVRAM96用来存储系统配置数据。也就是说,NVRAM96将含有描述系统现在配置状况的值。例如,NVRAM96含有说明固定磁盘或软盘片的容量、显示器的类型、存储器的总量、时间、日期等信息。特别重要的是,NVRAM将含有一种数据(可以是一位),它被存储器控制器48用来确定BIOS是来自ROM还是来自RAM,并确定是否收回指定给BIOSRAM使用的RAM。而且,只要特定的配置程序,如SET配置程序,在执行时,这些数据都存储到NVRAM里。SET配置程序的目的是把说明系统配置的值存入NVRAM。
几乎所有上述设备都含有易失寄存器。为避免附图不必要的混乱,特定设备的寄存器将用该设备来参照。例如,CPU寄存器参照为CPU40寄存器,而视频控制器寄存器将参照为视频控制器56寄存器。
如上文中所提及的那样,计算机具有一般标明在15处的罩,罩和机箱19一起确定一个封闭的和屏蔽的体积,用来容纳上面确定的微机部件。罩最好由一个用可塑合成材料制成的整体模塑外表面装璜罩构件16和一个与装璜罩构件外形相配合的金属薄层内衬18所组成。当然,罩可用其它周知的方式制成,而本发明的实现并不限制于所述的类型。
运行状态
现参照图4,其中表示本发明计算机系统的状态图。本发明的计算机系统10具有四个状态:常规运行状态150、备用状态152、暂停状态154和断电状态156。图4中所示各状态间的转换意味着对最佳实施例是描述性的而不是限制性的。因此,可替代地使用其它可导致状态转换的附加事件。
本发明的计算机系统10的常规运行状态150实际上和任何普通的台式计算机的常规运行状态完全相同。用户可以使用应用程序,基本上像对待其它计算机那样来对待本计算机。一种对用户透明的差异是存在操作系统上的功率管理驱动程序(“APM OS驱动程序”),其在后台上运行,以及存在不同的APM BIOS程序。APMBIOS程序将在后面的文章中讨论,它们包括暂停程序、恢复程序、导引程序、监督程序、保留CPU状态程序和复原CPU状态程序。在所有的图中都没有显示的一个APM BIOS程序是APMBIOS路由程序。APM BIOS路由程序本质上接收APM OS驱动程序的命令并调用适当的APM BIOS程序。例如,当APMOS驱动程序发出暂停命令时,APM BIOS路由程序调用暂停程序。作为另一个例子,只要APM OS驱动程序发出取得事件命令,APM BIOS路由程序调用监督程序。这些程序位于BIOS上,当BIOS被遮蔽时它们也被遮蔽。在OS上的功率管理驱动程序和APM BIOS程序控制计算机在这四个状态间的转换。字“APM”本身一般含意为APM OS驱动程序,尽管其内容可另外确定。
第二个状态,备用状态152,使用比常规运行状态150少的电功率,并且仍然许可任何应用程序处于在其它情况下它会执行的执行状态下。通常在备用状态152下通过用代码把设备置于各自的低功率方式来节省功率。在最佳实施例中,在备用状态152下电能的节约是通过停止固定磁盘存储设备31的固定磁盘(图中未示)的旋转和停止产生视频信号来达到的,在下面将对此作出更全面的解释。但是,这些是不受限制的,还可采取其它节约能源的方法,如减慢或停止CPU时钟。
在最佳实施例中,电能是按两种分开的方式节省的。首先,在常规运行状态150下,固定磁盘存储设备31里的固定磁盘通常按3600转/分(PRM)的恒速旋转。在备用状态152下,IDE磁盘控制器86发出命令,使得固定磁盘存储设备31进入低功率方式(固定磁盘存储设备31内的固定磁盘停止旋转),这样节约固定磁盘存储设备31内的马达(图中未示)带动固定磁盘时所消耗的能量。
其次,在常规运行状态150下,计算机系统的视频控制器56不停地产生视频信号(如技术上熟知的HSYNC、VSYNC、R、G、B等),这些信号和在视频显示终端57上所看到的图象相对应。在备用状态152下,视频控制器56停止产生视频信号,这样节约由视频控制器56通常所消耗的电能。HSYNC、VSYNC、R、G和B信号都被驱动到约为直流0.00伏。使用VESA(视频电子标准协会)类型监视器允许进一步节约能源,因为当HSYNC和VSYNC大约为0.00伏时VESA类型监视器自己会关闭。
注意某些系统具有“屏幕节省器”,它使得屏幕57变暗以防止视频显示终端前表面荧光物质的烧毁。在大多数这种系统中,视频控制器56仍旧产生视频信号;它只产生对应于暗色屏幕或动态显示的视频信号。这样,运行屏幕节省器的计算机系统仍旧消耗产生视频信号所需的电能。
第三种状态是暂停状态154。在暂停状态154下,计算机系统消耗非常小量的电能。在最佳实施例中暂停状态计算机消耗来自墙上插座小于5瓦的电能。仅需消耗的功率来自电源17的AUX5输出或者来自计算机系统内部的电池171,它是用来监视开关21的微弱功率,对此将在下面伴随图5的文字段落中得到更完整的说明。
把计算机系统的状态在电源关闭以前保留到固定磁盘存储设备(硬驱动机)31里,就可以只使用少量电能。为进入暂停状态154,CPU中断任何应用程序并把CPU的程序执行控制转交给功率管理驱动程序。功率管理驱动程序确定计算机系统10的状态,并把计算机系统的整个状态写入固定磁盘存储设备31。CPU40寄存器、CPU高速缓存41、系统RAM53、系统高速缓存器60、视频控制器56寄存器、视频存储器58和其它易失寄存器的所有状态都被写入固定磁盘机31。系统10的整个状态是按这种方式保留的,即不需付出明显的使用代价即可得到复原。也就是说,用户不需要如在常规下等待系统装入操作系统和装入图形用户接口。
然后计算机把数据写进非易失的CMOS存储器96指明系统处于暂停状态。最后,CPU使得电源17停止提供稳压电源。现在计算机系统10在把系统的整个状态安全地保留在固定磁盘存储设备31里情况下功率被降低。
在整个本文件中词“状态”用于两种类似的,但可能会混淆的情况。设备可以“处于”一种特定的状态。而四种系统状态一常规150、备用152、暂停154和断电156-指的是本发明的计算机系统10的概括性的状态。这些“状态”一般性地描述计算机系统10。例如,在常规运行状态150的情况下,CPU仍然执行代码并不断改变系统10里的许多寄存器。同样、类似的活动出现在备用状态152下。即,当系统10处于常规运行状态150和暂停状态152下时,计算机系统10的存储器和寄存器的配置是动态的。
其它的设备也可以“处于”一定的状态。可编程逻辑阵列U2可处于几种状态中,这将在和图7相对应的文字段落中得到说明。
将上述的和一个设备“的状态”加以对比,例如,“计算机系统10的状态”或“CPU40的状态”。一个设备“的状态”指的是在某特定计算机周期时该设备的情况。所有存储器单元和寄存器都将具有特定的二进制值。一个设备“的状态”是对该设备内容的静态二进制写照。
计算机系统10“的状态”指的是操作上的等效而不必是准确的复制。例如,在状态A下的计算机系统可能在CPU高速缓存41或系统高速缓存60中的一个中具有一定的存储。有可能把各个高速缓存的内容“冲泻”回系统RAM53,并把计算机系统推进状态B。纯粹地讲,在状态A下的计算机系统的状态不同于在状态B下的计算机系统的状态,因为高速缓存和系统RAM的内容是不同的。但是,从软件操作的观点出发,状态A和状态B是相同的,因为,除了在系统速度的轻微下降(由于程序不具有在高速缓存上执行所能得到的优点而造成)外,该正在执行的程序是不受到影响的。这样,在状态A下的计算机和状态B下的计算机在软件操作上是等效的,即使在高速缓存区域重新装入有用的代码之前那个高速缓存被冲泻掉的计算机将在性能上遭受轻微的下降。
单词“Power(功率)”也用于两种类似的,但可能混淆的方法。“Power(功率)”在大多数下指的是电功率。但是,偶而“Power(功能)”还指计算能力。上下文应该使得预定的应用是清楚的。
“电路”一般指的是一个物理电子设备或者多个在电上互连的设备。但是,术语“电路”还意味着包含等效于物理电子设备的CPU代码。例如,一方面,可以通过74LS00,或等效地,在可编程设备里实现二输入的NAND(“与非”)门。这两种设备都是物理电子设备。另一方面,还可以通过使CPU40从两个CPU可读输入端口读得两个输入,利用CPU命令产生NAND结果并且通过CPU可写输出端口输出结果来实现NAND门。这些可和CPU接口的端口可以是简单的,如译码锁存,或者是等效的可编程设备,或者是复杂的,如技术中周知的PIA(外围接口适配器)。“电路”意味着包括所有三种实现NAND门的例子。在某些情况下,“电路”可能仅仅指的是电气通路。电气通路的种类包括导线、追踪器或通过印刷电路板,或者各种电气通路种类的组合以形成单个电气上连通的通路。
“信号”可以指的是一个单个的电气波形或者多个波形。例如,视频控制器产生视频信号。视频信号实际上是多个电气导体上的多个信号:如技术上周知的HSYNC、VSYNC、R、G、B等信号。
现回到图4,第四个和最后的状态是断电状态156。断电状态156实际上等同于在普通意义下被断电的任何一般的计算机系统。在这个状态下,电源17的初级/稳压单元172停止向计算机系统10提供稳压电源(除了通过AUX5的微弱稳压电源之外,这将在对应图5的文字段落中得到更完整的说明),但是计算机系统10的状态不保留在固定磁盘31里。暂停状态154和断电状态156在下列意义上是相同的:即电源17不再产生稳压功率。它们的不同点在于,在断电状态156下计算机系统10的状态不保留在硬磁盘机31里,而在暂停状态下计算机的状态是保留的。而且,当脱离断电状态156时,计算机10“引导”就好象它被接通。也就是说,任何执行代码的启动必须通过用户或者自动地通过如AUTOEXEC.BAT文件的方法。但是,当脱离暂停状态154时、计算机10在已中断时所处在的位置处恢复执行。
图4还对使四个状态转换的事件进行一般性的概述。这些事件将在对应图6到图8的文字段落中得到进一步的说明;但是,一个粗略的说明可能是有用的。电源按钮21,两个定时器(不活动备用定时器和不活动暂停定时器,参见图9及相应的文字段落)和一个进入暂停标志(见图6和图7和相应的文字段落)一起影响计算机应进入的状态。一般地说,这两个定时器可以是硬件或者是作为程序在CPU上执行的CPU代码定时器。在最佳实施例中,它们两个都是CPU代码定时器,从BIOS数据段上执行。但是,这两个定时器可设想成硬件定时器,这可以是一种更好的解决办法,因为它可减少系统的开销。在和图9对应的文字段落里定时器得到更完全的说明。当计算机系统处于常规运行状态150或备用状态152中的一种状态下时,两个定时器都是活动的。定时器和其它程序通信,这样两个定时器中的一个的期满引起如下面概述的转换。各个或两个定时器可以设置为在一定的时间周期后达到期满,这个时间周期取决于用户的特定需要。在最佳实施例中,不活动备用定时器和不活动暂停定时器可被设置为在15到90分钟之后期满。各个或两个定时器可被停住,也就是设置为永不期满。“停住”定时器可以采取实际上停止定时器递增计数动作的方式,或者只要采取忽略它们到期的方式。在最佳实施例中,把定时器的期满值设为零值使得定时器的期满不会受到检测。例如,连网计算机的用户可能不希望计算机进入暂停状态154,因为这样做可以导致LAN对这个计算机失效。
在理论上,定时器可递增计数或递减计数,可复位到固定的预先确定的状态,并且当定时器起动(或再起动)时,或者现在值可被使用时,以及可把一个差值或和值计算为终点期满触发冲量时,可以期待定时器对另一个固定的预先确定的状态计数。在本最佳实施例中,当定时器复位时,来自实时时钟98的分钟变量的现有值被存储起来。通过从保留的分钟值减去现在分钟值并和用户所选择的差值相比较,来检查定时器是否期满。
两个定时器都受到某些系统活动的影响。例如,在最佳实施例中,以键盘12的键被按下、鼠标器13被移动、鼠标器13的按钮被按下为形式的用户活动,或者硬磁盘机的活动会使各个定时器重新启动,这些会在和图9有关的文字段落中得到更充分的说明;这样,当用户按键盘12的键或使用鼠标器13时,两个定时器都不会期满。另外其它的系统事件可用来复位定时器。任何硬件中断可能替代地被监视为活动。这样,可能最好在打印时阻止系统进入暂停状态154。
进入暂停标志是可编程逻辑阵列U2里的CPU可操纵的和可读的锁存器,U2将在和图7相应的文字段落里得到更充分的说明。简言之,如把可编程逻辑阵列U2置为一种方式时会导致按下开关21时系统10进入断电状态156,如果可编程逻辑阵列U2置为另一种方式,按下开关21时系统10进入暂停状态154。如果计算机系统10处于常规运行状态150,而写入到可编程逻辑阵列U2的进入暂停标志为002,当按下功率按钮21时,则计算机系统10进入断电状态156,如在158处所示。如果计算机系统为断电状态156而功率按钮21被按下,然后计算机系统进入常规运行状态。
如果计算机系统10处于常规运行状态150,一种事件可以使得计算机进入备用状态152:如果不活动备用定时器期满,计算机系统10将改变到备用状态152,如在162处所示。当处于备用状态152时,任何上面描述类型的系统活动将使得计算机10脱离备用状态152,回到常规运行系统150,如在164处所示。
如果计算机10处于常规运行状态150,两种事件可以使它进入暂停状态154。首先,如果不活动暂停定时器期满,计算机系统10将改变到暂停状态154,如在166处所示。其次,当写入到可编程逻辑阵列U2的进入暂停标志为012时,通过按功率按扭21,用户可以使得计算机10立即进入暂停状态154,同样如在166处所示。当处于暂停状态154下时,通过按下功率按钮21,用户把它改变到常规运行状态150,如在168处所示。
此处,在168处,可以代替地使用若干外部事件把系统10从暂停状态154改变到常规运行状态150。如,电话铃声检测电路可以附加到图6的电路上,并且设置为附属电话线呼叫时可使系统10脱离暂停状态154和进入常规运行状态。这种修改对于接收远程传真数据或数字数据的系统可能是有用的。这种系统只在接收输入信息时才消耗功率。类似地,实时时钟和图6间的接口可以代替地允许报警型事件使得系统10脱离暂停状态154并进入常规运行运行150。这种系统可能在下述情况是有益的,即在每天的一定时间发送运程传真式数字数据来得到较低电话费用的优点。
最后,如果计算机系统10处于备用状态152并且不活动暂停定时器期满,则计算机10改变到暂停状态154,如在170处所示。计算机系统不能够从暂停状态154回到备用状态152,而只能转换到常规运行状态150,如在对应于转换168的文字段落里所叙述的那样。
很明显,计算机系统10不能够瞬时地改变状态。每次从四种状态的一种状态下转换出来时,将需要一定时间间隔以完成必要的系统改变。各个转换时间的细节将在和图6至图15相对应的文字段落里给予说明。系统硬件
在讨论CPU40上代码执行的细节之前,首先讨论实现四个状态所需的硬件可能是有益的。图5中表示电源17的方块图。电源17具有两个单元:控制器174和初级/稳压单元172。电源17有几个输入:Line-In,其从普通的墙上插座接收115伏交流电;ON,其控制电源17的稳压操作。电源17有几个输出:AC Line-Out,±12VDC,AUX5,GND和POWERGOOD。AC Line-Out是不稳压的115VCA,它一般输送给视频显示终端57的电源输入(图中未示)。控制器174接收ON输入并产生POWERGOOD输出。初级/稳压单元172分别把来自Line-In输入的115VAC调节为±5VDC,±12VDC。初级/稳压单元是否调节电能取决于控制器174接口的ON值。在最佳实施例中,控制器174应该提供对产生ON信号的电路隔离,例如,一个适当的光隔离器。
在技术上已熟知Line-In输入和AC Line-out,±5VDC、±12VDC、GND和POWERGOOD输出。当电源17“关掉”时,即不再从Line-In提供稳压电压,POWERGOOD信号为逻辑ZERO。当电源17“接通”时,电源17从115VAC Line-In产生±5VDC和±12VDC稳压电压。这四个稳压电压和它们相应的GND(接地)是“系统功率”,这在技术上是普遍熟知的。当稳压电压保持在可接受的容差范围内时,POWERGOOD信号改变为逻辑ONE。
AUX5输出对平面提供备用+5VDVC。当电源17插入到普通的提供额定115VAC的墙上插座时,不论电源“接通”或“关掉”,初级/稳压单元172在AUX5处提供额定的+5VDC。这样,只要插上电,电源17总是在AUX5处提供额定的+5VDC。AUX5输出和+5输出的不同在于,只有当电源17处于“接通”时,初级/稳压单元才通过+5输出端产生稳压的+5VDC。AUX5输出和+5输出的另一个不同点在于,在最佳实施例中,初级/稳压单元172通过该+5输出端提供几安培电流的+5VDC,而同时初级/稳压单元172通过AUX5输出端提供少于一安培电源的+5VDC。
普通的现有电源使用高电流双臂开关,以对Line-In输入和电源的稳定部分进行连接和切断。本发明的电源17不使用高电流双臂开关。反而,开关21控制着产生ON信号的电路。在最佳实施例中,开关21是一个瞬时单极、单臂按钮或开关;但是熟悉技术的人可以修改图6的电路以利用其它类型的开关如单极、双臂开关。ACLine-In永远和从墙上插座相连的初级/稳压单元172连接。当ON处于逻辑ONE时(AUX5近似地为额定+5VDC),初级/稳压单元172并不通过±5或者±12输出端把15VAC Line-In调节到±5VDC或±12VDC。初级/稳压单元只提供AUX5输出端的低电流额定+5VDC。另一方面,当ON为逻辑ZERO时(近似于GND),初级/稳压单元172通过四个±5和±12输出端分别把115VAC Line-In调节到±5VDC和±12VDC。这样,当ON为ONE时,电源17是“关掉”的,而当ON为ZERO时,电源17是“接通”的。
如果加以规定,具有AUX5输出和ON输入的电源,就象上面所描述的电源17那样,可以从许多一般电源供应商处得到。
现参照图6,它表示本发明的计算机系统10的电子电路的示意图。图6中的电路负责在开关21、电源17、视频显示终端和CPU40上执行的代码之间的接口。
该电路由三块集成电路组成:U1,第一预编程PAL16L8;U2,第二预编程PAL16L8;和U3,在技术上周知的74HC132。一般来讲,PAL(可编程阵列逻辑)U1和U2在图3的平面I/O总线90和图6的其它电路之间接口。该电路还包括开关21、十个电阻器R1-R10、五个电容器C1-C5、四个N型MOSFET(金属氧半导体场效应晶体管)Q1-Q4,它们是标准低电流金属氧半导体场效应晶体管,在本最佳实施例中适合作为逻辑开关和一个双二极管组CR1,它是一个标准低电流二极管组,在图6中显示了全部的配置和连接。电阻器R1-R10是瓦电阻器,它们的阻值显示在图6中,范围为±5%。电容器C1-C2是电解质电容器,电容值如图6所示,范围为±10%。电容器C3-C5是0.1μF(±10%)的陶瓷电容器。
第一PAL U1与地址线SA(1)至SA(15)和AEN(地址允许)线连接。SA(1)至SA(15)和AEN是图3所示的平面I/O总线90中的一部分。第一PAL U1被编程为只是一个地址译码器,当预先确定的地址出现在地址线SA(1)至SA(15)上并且AEN(地址允许)线有效时,产生一个低电平有效信号PM PORT DCD#。
第二PAL U2被编程为可提供一个可读的字节和在上面提到的I/O端口的较低三位中提供三个可写位,I/O端口还被称为“功率管理端口”。第二PAL U2具有来自平面I/O总线90的八个输入:SD(0)、SD(1)、SD(2)、SA(0)、IOW#、IOR#、RESETDRV和IRQ(1)。通过由存储器控制器46产生的,在技术上周知的、高电平有效信号RESETDRV输入,第二PAL U2复位到已知的初始条件。在和图7相应的文字段落里和表Ⅰ和表Ⅱ中,第二PAL U2得到更充分的描述。
第三个设备具有二个部分,这里标识为U3A和U3B,它们组成SR锁存器,也被称为NAND锁存器,它在技术上是周知的。SR锁存器把U3的引脚1和5作为输入(引脚1为SET输入而引脚5为RESET输入)和把U3A的引脚3作为输出。当两个输入都是逻辑ONE时,该输出保持它的锁存输出值。如果SET置为逻辑ZERO,输出变成逻辑ONE。如果SET输入值返回到逻辑ONE,输出锁存在逻辑ONE上。如果RESET输入置为逻辑ZERO,输出变为逻辑ZERO。如果RESET输入值回到逻辑ONE,输出锁存在逻辑ZERO上。
如果POWERGOOR信号为逻辑ONE,其表明稳压电压处于适当的范围,则第三个设备的第三部分,在这里标识为U3C,充当为第二PAL U2引脚12输出的反相器。如果POWERGOOD信号为逻辑ZERO,共表示VCC或者在接地电位附近摇摆或者从+5VDC向上或向下陡变,则第三个设备的第三部分引脚8的输出保持为逻辑ONE,防止来自第二PAL U2管脚2的任何噪声影响由第三个设备的第一和第二部分U3A和U3B建立的SR锁存器。
开关21在JP1处和图6的电路连接。电阻器/电容器子电路R2和C1将开关21的闭合事件加以消跳。第三个设备的第四部分U3D在引脚12通过R6被拉向VBAT(大约为+4.3VDC,而AUX5的额定值为+5VDC)时被设置为反相器,它倒置被消跳的开关闭合。限流电阻器R10防止从第三个设备的第四部分U3D的引脚11通过任何电流,当该设备加电或断电时,该电流可能从第二PALU2的引脚8流入。
SR锁存器应该永不断电。但是,如果出现这种情况,R7和C3设计为把SR锁存器置为通电状态,这样当SR锁存器重新供电时电源17将处于“断电”状态。
电阻器R1、R3、R4、R5、R6、R8和R9是上拉电阻器,把它们各自的线路拉到VCC、VBAT或AUX5中的一种。晶体管Q1、Q2、Q3和Q4是反相器。R4和C2组成RC对,使G2电位达到VCC前对C2充电。当第二PAL U2的引脚19输出为逻辑ONE时,晶体管Q5使电容器C2放电。当贮存在C2里电压大约低于+2.7VDC时,Q1不导电而R3把第二PAL U2的引引11的输入拉到VCC,使它为逻辑ONE。如果C2充电到约为+2.7VDC或更高,则Q1导电,把引脚11的输入拉到GND,使它为逻辑ZERO。
当第二PAL U2的引脚18的输出为逻辑ZERO时,R8和R9分别把BLNK#和ESYNC线路拉到VCC。由于ESYNC和BLNK#线路处于VCC,视频控制器56产生视频信号。当第二PAL U2的引脚18的输出为逻辑ONE时,晶体管Q2和Q3通电,分别把BLNK#和ESYNC拉向GND,使得视频控制器56停止产生视频信号。
图6所示的电子电路具有三个电源:VCC、AUX5和VBAT。VCC和AUX5是由电源17供电的、额定为+5.0VDC。如技术上周知的那样,VCC和它的相关GND返回线路穿过平面20上的主功率连接器(图中未示)。AUX5在JP2的引脚1处和该电路连接。AUX5的回线进入并在JP2的引脚3处和GND线路连接。VBAT是电池171的功率输出,额定为3.5VDC。电池171是一个锂电池,它在技术上是周知的。
PAL U1和U2在和VCC相连的引脚20处具有它们的VCC输入。另外,几个电阻器R3、R4、R8和R9也和VCC连接。如在技术上周知的那样,当电源“接通”并插在普通的提供额定115VAC的墙上的插座时,电源17只提供稳压+5VDC。这样,当电源处于“关掉”或没有插上电两者中的一种情况时,PAL U1的U2以及R3、R4、R8和R9不接收+5VDC。
另一方面,只要电源17插进提供额定115VAC的普通墙上插座时,不论“接通”或“断电”,电源17都在AUX5处提供稳压+5VDC。这样,只要电源17被插上,那些和AUX5连接的设备接受+5VDC。
另外,U3和电阻器R1、R2和R6永远接受电能,因为CR1的二极管以这种方式和VBAT的AUX5接口,即和VBAT连接的设备永远接受功率。当插进普通的墙上插座时,电源17在AUX5处提供+5VDC而和VBAT连接的设备(U3和电阻器R1、R2及R6)接受约+4.3VDC(AUX5的+5VDC减去AUX5和VBAT之间CR1内二极管的二极管压降)。在不插进时,电源17停止对AUX5线路提供调节功率,U3和电阻器R1、R2及R6从VBAT接受功率。典型的74HC132需要+2.0VDC的最低DC电压。这样,只要VBAT保持足够的可提供+2.0VDC的电荷,U3会得到有效供电。
图6的电路可以具有一些代替的修改,而仍包括在本发明的范围之内。例如,实时时钟98可在电气上和图6电路连接,并配置为对ON#信号二极管式的“或”操作,这样在一天的特定时间,计算机系统10从暂停状态154改变到常规运行状态150。类似地,电话铃声检测电路可替代地附加在图6的电路上并配置为对ON#信号二极管式“或”操作,这样相连的电话线路的呼叫可使系统10脱离暂停状态154并进入常规运行状态150。
回到参照图6,第二PAL U2具有两个状态机。在图7中显示第二PAL U2的一个状态机的状态图。表Ⅰ和表Ⅱ说明另一个状态机及第二PAL U2的某些其它情况。
图7表示第二PAL U2的一个状态机。TE1和TE0一起许可四种状态:开关状态002176、开关状态012178、开关状态112180和开关状态102182。
TE1和TE0不是对第二PAL U2直接可写的,相反,相应于开关21的闭合事件以及诸如复位计算机系统的其它事件,状态会发生变化。在系统功率不由电源17提供的情况下,第二PAL U2不被供电,因此,它的状态是无意义的,处于174。按下开关21和其它事件(如电话铃声检测器使电源17提供系统功率)引起电源17开始提供系统功率,如在对应于图6的文字段落里所描述的那样。当开关21被按下或者RESETDRV信号有效时,第二PAL U2进入开关状态002176。在释放开关21或开关21不被按下的情况下RE-SETDRV变为无效时,将使第二PAL U2进入开关状态012178。再次按下开关21时,将使第二PAL U2进入开关状态112180。再次释放开关21时,将使第二PAL U2进入开关状态102182。开关21的连续闭合使得第二PAL U2循环通过这四个状态,如图7中所示。当计算机系统处于常规运行状态150时,第二PAL U2处于开关状态012178。
状态012178是对应于TE1、TE0状态机常规通电状态的开关状态。在这个状态下,应用程序将执行。在这个状态下,系统10可以进入或脱离备用状态152。开关状态012178还对应于用户生成的暂停异常结束请求。开关状态102是对应于用户暂停请求的开关状态。也就是说,从系统处于断电状态156开始,按下开关一次把计算机系统置于常规运行状态150。再次按下开关产生暂停请求(在功率管理端口处为OFFH),它将由监督程序读出,监督程序在和图9对应文字段落里得到更充分的说明。在系统处于暂停状态154之前,第三次按下开关21产生暂停异常结束请求(在功率管理端口处为OFEH),它将由监督程序读出。
表Ⅰ增加对图7四个状态的一些注解。在处于开关状态002176、012178和112180情况下,功率管理端口响应读(操作)输出OFFH。
表ⅠTE1 TE0 注解0 0 清除显示器消隐位
功率管理端口的读出=OFFH0 1 显示器消隐位由SD(2)控制
功率管理端口的读出=OFFH1 1 显示器消隐位由SD(2)控制
功率管理端口的读出=OFFH1 0 置位显示器消隐位
功率管理端口的读出=OFEH另一方面,当处于开关状态182时,功率管理端口响应一次读操作,输出OFEH。按下并释放开关21时,第二PAL U2脱离开关状态012并进入开关状态102182,其标志硬件暂停请求。监督程序通过读功率管理端口察觉硬件暂停请求。对读所作响应OFEH表示一次硬件暂停请求。
TE1、TE0状态机还影响视频消隐电路。在处于开关状态002176情况下,显示器消隐位被清除,使得视频控制器产生视频信号。在处于开关102182情况下,显示器消隐位被置位,使得视频控制器56停止产生视频信号。当处于开关状态012178和112180情况下,显示器消隐位由对SD2的写所控制,这将在下面解释。
表Ⅱ打表示第二PAL U2的另一个状态机并且表示对SD2的写如何影响视频信号。
表ⅡS2 S1 S0 注解X 0 0 当处于开关状态102时,立
即“关掉”电源X 0 1 当处于开关状态102时,启
动故障保险定时器(C2充电)X 1 0 立即“关掉”电源X 1 1 复位故障保险定时器(C2放电)0 X X 接通视频信号1 X X 关掉视频信号
PAL里的U2电路在功率管理端口提供三个位:SD(0)、SD(1)、SD(2)。这三个位在表Ⅱ中标记为S0、S1和S2。通过控制第二PAL U2的DISPAY OFF输出的引脚18,SD(2)位会关掉视频信号,它使得引脚18DISPLAY OFF输出明确为逻辑ONE,使得晶体管Q2和Q3导电,把BLNK#和ESYNC拉至GND,而使视频控制器56停止产生视频信号。类似地,把ZERO写进功率管理端口的SD(2)使得引脚18DISPLAY OFF输出明确为逻辑ZERO,造成晶体管Q2和Q3停止导电,允许电阻器R8和R9把BLNK#和ESYNC拉至VCC,这样许可视频控制器56产生视频信号。
IRQ(1)输入也控制视频消隐。IRQ(1)是键盘硬件中断;按下键盘12的一个键使IRQ(1)产生脉冲。当视频信号切掉时IRQ(1)上的脉冲立即把视频信号接通回来,它使引脚18DISPLAY OFF输出明确为逻辑ZERO,使晶体管Q2和Q3停止导电,允许电阻器R8和R9把BLNK#和ESYNC拉至VCC,这样许可视频控制器56产生视频信号。当从备用状态152返回到常规运行状态154时,以这种方式使用IRQ(1)赋于用户恢复视频显示器的迅速反馈。如果没有它,直到若干秒后在APM检验用户活动之前用户可能无法接收反馈,这在和图9对应的文字段落中予以说明。
SD(1)和SD(0)协力工作以提供四种操作状态:002、012、102和112。第二PAL U2通过RESETDRV输入002状态初始化。另外,在四个状态的任一状态下,把XXXXXX002写进功率管理端口可把第二PAL U2置入002状态。在002状态下,开关21的作用就象普通电源的功率开关一样,这已在对应于图5的文字段落中得到描述。当处于002状态下时,按下开关21,会使第二PAL U2引脚12的输出明确为逻辑ONE,使SR锁存器的输出引脚3锁存为逻辑ZERO状态,允许通过R6把ON拉至HIGH,使得电源17的初级/稳压单元172停止沿±5和±12线路稳压电压,而把电源17“关掉”。在这个状态下,APM是不连接的,如在下面对系统软件的讨论中所说明的那样。在002状态情况下,读功率管理端口使得电路回送OFEH。在最佳实施例中,这个字节被读和被检验以保证该硬件是存在的。
在四个状态的任一状态下,对功率管理端口写入XXXXXX012使得第二PAL U2进入012状态,012状态是常规APM状态。在进入012状态之后和在开关21被按下之前,立即读功率管理端口会使电路回送OFFH。在012状态下按下和释放开并会导致两个事件:(1)读功率管理端口而发生的回送值在OFEH和OFFH之间跳动;(2)引引8处明确的值跳动,使得视频控制器56随着每次按下按钮跳动地接通和关闭视频信号。另外,在第一次按下开关21时,通过使得引脚18TRIGGER输出明确为逻辑ZERO、使Q5停止导电、允许电容器C2开始充电,来启动故障保险定时器。当存贮在C2里的电压约低至+2.7VDC时,Q1不导电而R3把第二PAL U2的引脚11输入值拉于VCC,使它成为逻辑ONE。如果C2充电到约为+2.7VDC或者更高,则Q1导电,把引脚11输入值拉至GND,使它成为逻辑ZERO。每当引脚11DELAY-IN#为逻辑ZERO,则第二PAL U2总是通过下列操作把电源17“关掉”:使第二PAL U2的引脚12输出明确为逻辑ONE、使SR锁存器的输出引脚3锁存到逻辑ZERO状态、经R6允许把ON拉至HIGH、使电源17的初级/稳压单元172停止沿±5和±12线路提供稳压电压,反复的开关闭合使得故障保险定时器跳动式地接通或关闭。
这样,在处于012状态下,在开关按下之前,一次读回送的值是OFFH并且视频信号被生成;第一次把开关21按下时,一次读操作所回送的值改变为OFEH,而且停止产生视频信号,使得视频显示终端57消隐。第二次按下开关时,读操作所回送的值变回OFFH,并且视频控制器56开始重新产生视频信号。这种跳动式的性质使得重复按下开关21表现如下:奇数次按下开关结果是OFEH值和消隐的视频信号而偶数次按下开关结果为OFFH值和生成的视频信号。
在四个状态的任一状态下,对功率管理端口写入XXXXXX102时,第二PAL U2进入102状态。进入102状态后,通过下列操作把电源17立即“关掉”:使第二RAL U2的引脚12输出明确为逻辑ONE、使SR锁存器的输出引脚3锁存为逻辑ZERO状态、经R6允许ON被拉至HIGH、使电源17的初级/稳压单元172停止沿±5和±12线路提供稳压电坟。这个状态使得系统10能控制电源17。
在四个状态的任一状态下,对功率管理端口写入XXXXXX112使得第二PAL U2进入112状态。如果使引脚19TRIGGER#输出明确为逻辑ONE、使Q5导电、把电容器C2对GND放电,则进入112状态能使故障保险定时器复位。脱离这个状态并进入012状态时,通过下列操作能重新启动故障保险定时器:使引脚19TRIGGER#输出断言逻辑ZERO、防止晶体管Q5导电、允许电容器C2重新充电。
对图6电路功能的下述讨论的假设条件是:电源17插进到普通的墙上插座,并且在AUX5处产生+5VDC,因此,许多设备,特别是U3,得到有效供电。
相信,如果首先确定何时电源17是“关掉”的,对图6电路的讨论更容易得到理解。为把电源17“关掉”,JP2引脚2处的信号ON必须为逻辑ONE。因此,Q4必须不导电,故此U3的引脚3必须是逻辑ZERO。也就是说,U3A和U3B的SR锁存器用逻辑ZERO输出锁存。POWERGOOD为逻辑ZERO并且第二PAL U2不供电,因此,U3C的引脚8输出为逻辑ONE,这样,SR锁存器的RE-SET输入为ONE。同样,SR锁存器SET输入即U3A的引脚1经R1拉至逻辑ONE。在这个状态下,SR锁存器用逻辑ZERO输出加以锁存。
当开关21被按下时,该闭合被R2和C1消跳,而且SR锁存器SET输入即U3的引脚1被拉至GND(逻辑ZERO)。这把SR锁存器输出即U3A的引脚3改变到逻辑ONE,使得Q4导电,它把ON拉至GND,使得电源17开始对±5和±12线路提供稳压功率。释放开关允许SR锁存器SET输入、U3A的引脚1改变到逻辑ONE,使得SR锁存器在U3A引脚3输出处锁存逻辑ONE,这样把电源锁定在“接通”状态里。
在POWERGOOD信号变为逻辑ONE后,所有的电压处于容差范围内。当POWERGOOD为逻辑ZERO时,第二PAL U2初始化,使得:(1)引脚12OFF输出明确为逻辑ZERO,它使SR锁存器脱离它当前的锁存状态,(2)引脚18DISPLAY OFF输出明确为逻辑ZERO,它允许视频控制器产生视频信号,和(3)引脚10TRIGGER#输出明确为逻辑ONE,使得Q5把C2放电到GND,这样经R3保持引脚11DELAY IN#拉至逻辑ONE。
如上面提及那样,图7的第二PAL U2电路在功率管理端口提供三个位-SD(0)、SD(1)、SD(2)。SD(2)控制第二PAL U2的引脚18DISPLAY OFF输出。对功率管理端口的SD(2)写入ONE时,视频控制器56停止产生视频信号。同样,对功率管理端口的SD(2)写入ZERO将允许视频控制器56产生视频信号。
上面还提到,SD(1)和SD(0)协力工作以提供四个操作状态:002、012、102和112。RESETDRV输入值将第二PAL U2初始化为002状态。在这个状态下,按下开关21只使电源17被“关掉”。在执行代码的某一点上,如果用户要求这样做,软件可对功率管理端口写入XXXXXX012,使得第二PAL U2进入012状态。012状态是常规APM状态。在每次APM进行“取得事件”操作期间,监督程序检验以查看是否不活动备用定时器期满或者不活动暂停定时器期满。如果不活动备用定时器期满,则监督程序将把XXXXX1XX2写到I/O端口,它将消隐视频信号。如果计算机一旦脱离备用状态并且重新进入常规运行状态,则监督程序将把XXXXXOXX2写到I/O端口,它将使视频控制器56产生视频信号。如果不活动暂停定时器期满,则监督控制调用暂停程序,这将在和图10对应的文字段落里得到更充分的说明。
另外,在每次APM“取得事件”的操作期间,监督程序读功率管理端口。如果OFFH被回送,则开关21末被按下过。另一方面,如果OFEH被回送,则开关21被按下过并且计算机系统启动暂停程序,其在和图10对应的文字段落会得到更充分的说明。如果开关21曾被按下过,或者不活动暂停定时器期满,则故障保险定时器已被启动而且C2进行充电;因此,为防止故障保险定时器把电源17关掉,暂停程序将把XXXXXX112写到I/O端口以对该定时器复位,并且立即把XXXXXX012写到I/O端口以恢复到012方式。当系统暂停时,暂停程序寄把XXXXXX112写到I/O端口以便立即把电源17“关掉”。系统软件
在对本发明计算机系统10的硬件方面完成说明之后,代码方面仍然有待说明。
现参照图8,图中表示对加电程序的一般性概述。程序开始于200,此时CPU转移并执行由复位向量指向的代码。这种情况出现于:每一次CPU被加电和当CPU被一个复位硬件信号复位或者当CPU通过执行RESET指令而复位,该RESET指令是通过向由复位向量指向的代码转移而执行的。这种复位过程在技术上是周知的。
一般而言,加电程序的流程取决于系统是否处于断电状态156或暂停状态154。也就是说,在CMOS NVRAM96里暂停标志是否相应地清除的还是置位的。如在202处所示,通过从非易失的CMOS存储器96里读出暂停标志,系统10判别它是否处于断电状态156或者处于暂停状态154。当系统脱离常规运行状态150进入断电状态156或暂停状态154中的一种时,各个程序或者SET(置位)或者CLEAR(清除)NVRAM里的暂停标志。如果在NVRAM96里暂停标志设置,则计算机系统10处于暂停状态154并且计算机系统10的状态已存在固定磁盘存储设备31里。另一方面,如果NVRAM96里的暂停标志清除,则计算机系统10处于断电状态156而计算机系统10的状态不存储在固定磁盘存储设备31里。这样,如果暂停标志在NVRAM96中设置,则计算机执行“常规”引导程序,如所示的任务204-210。第一个任务是加电自检(POST),如在204处所示,它将在和图11对应的文字段落里给予更充分的说明;在从POST返回后,CPU40调用PBOOT程序以装入操作系统,如206处所示。
PBOOT程序是一个运行在IBM PS/2计算机上的标准程序,但有细微的不同,这将在下面解释。PBOOT判别从那儿引导(从硬磁盘机31或从软盘机里的磁盘中的一种),装入操作系统,在CON-FIG.SYS文件的指示下分析和完成系统更改,而在把控制交回到操作系统之前最后执行AUTOEXEC.BAT批处理文件。在技术上PBOOT程序是周知的。但是,只有本发明计算机系统10才独有的是,该引导程序和装入在操作系统里的先进功率管理(APM)预编程接口(API)通信。APM API是由Intel和Microsoft研制的,而且许多操作系统现都实现APM API:如IBM的OS/2,IBM的PC-DOS,Microsoft的MS-DOS和Microsoft的Windows。APMBIOS引导程序通知APM OS存在监督程序。在用户的指示下,操作系统无限期地执地指令,如210处所示。但是,将监督程序的情况通知API的结果是,APM BIOS和APM OS使监督程序的执行“并行于”程序的执行,如212处所示。也就是说,系统10是一个分时多任务系统,并且APM取得事件操作(Get Event)以及跟着的监督程序周期性地执行。最终结果是监督程序大约每秒执行一次。监视程序将在和图9对应的文字段落中得到充分地解释。在常规引导程序204-210结束之后,计算机系统10处于常规运行状态150,如在和图4对应的文字段落里所讨论的那样。
再参看任务202,如果NVRAM96里的暂停标志设置,则系统状态已保留在硬磁盘机31里面系统进行恢复引导程序,其在任务214-220中表示。首先,系统执行简化的POST,如在214处所示。简化的POST将在和图11对应的文字段落中得到说明。在简化的POST之后,系统调用恢复程序,如在216处所示。在和图12对应的文字段落里将详细介绍恢复程序。只要恢复程序把计算机系统的状态复原到系统10在被暂停起来之前的配置就够了。和标示在任务204和210处的常规引导程序不同,恢复引导程序不需要通知APMAPI监督程序是否存在,因为APM程序必定已经运行过才能暂停系统,而当系统状态被复原时,APM被装回到存储器里。这样,当恢复程序完成复原系统10的状态时,APM已在适当位置,并且和被复原的代码“并行地”运行,如在212和220处所示。在恢复引导程序214-220结束后,计算机系统10处于常规运行状态150,如在和图4对应的文字段落里所讨论的那样。这样,在常规引导程序204-210或恢复引导程序214-220被执行之后,计算机系统10处于常规运行状态150。
图9是一个流程图,表示监督程序的细节,该程序大约每一秒在“Get Event(取得事件)”操作期间被APM调用。不同的操作系统以不同的频率执行取得事件操作。
监督程序在图9的222处启动。下面的文字段落里假定计算机系统10启动时处于常规运行状态150。在224处,第一个任务是检验用户是否按过开关21。通过读功率管理端口来检验开关21,如已在和图6和图7对应的文字段落里所叙述的那样。在第二PAL U2处于开关状态012情况下进行读操作时,如果开关21未被按下则功率管理端口回送FFH,如果开关21被按下则回送FEH。
如果在任务224处的检验表示用户按过开关21,则监督程序在226处设置“暂停请求”APM回送代码,然后在228处返回到APM。对设置“暂停请求”APM回送代码作出响应,APM执行任何必要的系统任务(如使硬磁盘同步),然后发出“暂停命令”,它使APM BIOS路由程序调用暂停程序。暂停程序在和图10对应的文字段落里描述。暂停程序本质上使系统脱离常规运行状态150和进入暂停状态154,并且可能在几条指令后(如果系统没有准备好进入暂停)或者几分钟,几小时,几天,几周或几年后把控制交回给监督程序。暂停程序总是设置“常规暂停”APM回送代码,不管暂停程序是从未暂停情况返回还是从完整的暂停及恢复操作后返回都是如此。
更经常的情况是,开关21未被按下,则监督程序移动到任务230来检验查看是否系统刚刚恢复。如果暂停程序被调用,则系统认为它刚刚得到恢复,不管暂停程序是从未暂停过情况下返回还是从完整的暂停和恢复操作后返回都是如此。恢复在230处检验,如果系统刚被恢复(或者由于文件活动的直接存储存取未执行暂停操作),在232处设置“常规恢复”APM回送代码,并在234处返回APM。对此作出响应、APM OS驱动程序更新系统时钟和其它值,它们在间歇期间可能变为过时。
更经常的情况是,系统10不是刚被恢复,则监督程序移动到任务236,来检验任何用户活动。在任务236处检验三种类型的用户活动:硬盘机31活动,键盘12活动和鼠标器13活动。每次APM“取得事件”操作时,监督程序读硬盘机的磁头值、柱面值和扇面值,读鼠标器13发送的最后字节的字节值(它是垂直位置),读键盘端口的字节值(它是最后按下的键),并从实时时钟读分钟值,分钟值范围从0发到59分并在每小时的开端绕回0分。这五个活动变量(磁头、柱面、扇面、鼠标器字节、键盘字节)和分钟值被临时地存储起来。然后这五个活动变量和上一次取得事件保留下来的五个活动变量进行比较。如果这五个当前值和上一次取得事件的五个值相同,则不存在用户活动。如果值不相同,则存在用户活动,并且当前活动值被保存起来,用于和下次取得事件期间读出值的比较。
上述活动检测方式是在CPU上执行程序。代替地,活动可在硬件方式下得到监视。例如,16条硬件中断线路可用来监视活动。
如果已有活动,在238处监督程序接着通过检验备用标志判别计算机系统10是否处于备用状态152。如果备用标志设置,指示系统10处于备用状态152,则在240处,监督程序退出备用状态152并且进入常规运行状态150。监督程序通过对一些设备增加供电的方式退出备用状态,这些设备在进入备用状态152时曾降低供电。在最佳实施例中这包括:(1)把01H写入功率管理端口,它使视频控制器56开始产生视频信号,并同时使第二PAL U2处于012状态;(2)把一个适当的值写进固定磁盘控制器86以使硬磁盘机31内的硬盘开始旋转;(3)清除备用标示,以指明系统10处于常规运行状态150。
另外,如果有过活动,则来自实时时钟98的分钟值也被保留,以供和接着发生的取得事件的分钟值进行比较。在241处,保留当前分钟值的操作有效地复位不活动备用定时器和不活动暂停定时器。在常规使用期间,将会有用户活动,在242处监督程序设置“无事件”APM回送代码,并返回243处的APM调用代码。APM不调用任何程序以对“无事件”回送代码作出响应。
如果任务236的检验表明未有过用户活动,则监督程序接着分别在245处和247处检验是否不活动备用定时器和不活动暂停定时器期满。如果系统10处于备用状态152,则不活动备用定时器不对期满进行检验;相反地,检验在任务244处跳跃。
通过从存储分钟值中减去当前分钟值,可以得到相应的自从用户活动之后的分钟数值,来实现对期满的检验。这个值在245处和不活动备用超时值比较,在247处和不活动暂停超时值比较。这两个超时值可供用户选择,并且可以这样设置,即系统永远不会进入备用用152,或永远不会进入暂停状态154,或永远不会因为两个定时器中的一个的期满而进入备用状态152或暂停状态154中的一种状态。把两个超时值中的一个置为0表示该定时器永远不会期满。
如果自从最后用户活动以来的分钟数等于或大于不活动备用定时器的超时值,则监督程序在246处使系统10进入备用状态152。如果不活动备用定时器没有期满,在247处监督程序接着检验不活动暂停定时器的期满。另一方面,如果不活动备用定时器期满,则监督程序通过把某些部件设置到它们各自的低功率方式使得系统10进入备用状态152。在最佳实施例中,这包括:(1)把05H写进功率管理端口,这使得在让第二PAL U2处于011状态的同时视频控制器56停止产生视频信号,(2)对固定磁盘控制器86写进一个适当值,使得硬磁盘机进入低功率方式(硬磁盘机里的硬盘停止旋转),和(3)设置备用标志,表明系统10处于备用状态152。简言之,在最佳实施例中,监督程序消隐视频信号,停止硬磁盘机31里硬盘的旋转,并设置标志以表明系统10处于备用状态152。在使系统10进入备用状态152后,在247处,监督程序检验不活动暂停定时器是否期满。
在247处,监督程序检验不活动暂停定时器是否期满。如果自从最后用户活动以来的分钟数等于或大于不活动暂停超时值,则监督程序在248处设置“暂停请求”APM回送代码,并且返回243处的APM。如在上面和任务226对应的文字段落里所描述的那样,对设置“暂停请求”APM回送代码的响应,APM执行任何必要的系统任务然后调用暂停程序。暂停程序将在和图10对应的文字段落里充分地讨论,简言之,它使系统10脱离常规运行状态150并进入暂停状态154。如在和任务226对应的文字段落里所讨论的那样,暂停程序可以在对或不对系统10实行暂停操作的情况下把控制返回给监督程序。另一方面,如果不活动暂停定时器不期满,则监督程序在242处设置“无事件”APM回送代码并返回到243处的APM调用代码。
尽管最经常“无事件”APM回送代码将返回到APM,不同的其它事件可以返回到APM。但是,对于每次APM取得事件只能规定一种APM回送代码。例如,在进入备用状态152之后,“无事件”被回送给APM,在脱离暂停状态154之后,“常规暂停”APM回送代码被回送给APM。排队给APM的特定信息取决于计算机系统的准确状态。监督程序也回送“常规恢复”APM回送代码或“暂停请求”APM回送代码。
在对暂停程序的了解后可以最好地理解加电和恢复程序。因此,相信按下述次序可得到对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回送代码作出响应暂停程序被调用。首先,保留CPU状态程序被调用,如252处所示。保留CPU状态程序将在和图13对应的文字段落里细化。现在只要这一点就够了,即,不论当暂停程序最初被调用时CPU40处于何种方式,暂停程序的剩余部分将随CPU40按实址方式执行,因此,它可以得到执行并且无须担心会因为试图在允许的地址空间之外执行指令或因为试图执行一条特权指令而产生任何错误。
保留CPU状态程序在253处,以唯一的方式,把程序控制返回给暂停程序。从保留CPU状态程序到暂停程序的返回涉及到对CPU的复位,在和下面图13任务630和632相对应的文字段落将对此详细解释。关于暂停程序的重要细节在于,CPU寄存器被写进段地址为E000H的数据结构而且CPU40现在处于实址方式。
暂停程序接着在254处确定是否开关21曾被按过。按和图6和图7对应的文字段落中所描述的那样检验开关21是否闭合。简言之,如果开关21曾被按过,则在读功率管理端口时它将回送FEH。如果没有,在被读时它将回送FFH。如果开关未被按过,则正在进行的暂停是软件暂停并在CMOS NVRAM96里设置软件暂停标志。这保证软件暂停不会同由开关闭合而引起的硬件暂停相混淆。如果暂停是软件暂停,下一次开关闭合使得该暂停变成硬件暂停。在把软件暂停转变为硬件暂停之后的下一次开关闭合将把该暂停异常结束掉。
接着,如260处所示,BIOS ROM88不被遮蔽。通过首先关闭ISA访问段C000H和D000H BIOS ROM不被遮蔽。接着,BIOS向量从指向段C000H和D000H改变到指回ROM88。下一个任务是在段C000H里建立一个栈,如262处所示。
在栈建立之后,在264处暂停程序判别DMA控制器72,软盘适配器84和IDE磁盘控制器86以查看是否有任何DMA传送、软盘机传送或硬盘机传送当前各自地在进行中。如果是,暂停不能够完成,因为这三种类型传送的特有特征阻止执行良好的暂停。例如,如果从硬磁盘机31上的硬文件传送正在进行,数据已经被IDE控制器读过,但是尚未传送给系统存储器53。这些数据不能充分地由CPU访问,因此,如果在硬文件读(操作)的中间系统被暂停,数据会被丢掉。这样,如果这三种类型传送的任一种在进行之中,暂停被搁置至到下一次APM取得事件,那时再次检验DMA和软盘控制器的活动状况。
接着,在252、260和262执行过的任务必须被倒回来,这样控制才能传回给APM。首先,BIOS从读/写改变到只读,如265处所示。它是通过关闭仍然含有遮蔽信号的段C000H和D000H来完成的。然后,对两个段的ISA访问被接通回来。在任务262处建立的栈被弹出和复原。最后,在266处通过复原CPU状态程序CPU的状态被复原,这发生在把控制于267处传回给APM之前。大约下一秒钟在下一个取得事件期间暂停程序会再次被APM轮询。这一次,阻止暂停进程的传送操作可能结束,允许暂停延续。
现回到任务264,如果当前不进行DMA传送、软盘机传送或硬文件传送,则暂停可被执行。暂停程序在268处继续。请回想当功率按钮被按下时故障保险定时器被允许工作。因此,第一个任务是如图6对应文字段落所述的对故障保险定时器复位,如268处所示。通过把0X112写到功率管理端口故障保险定时器被复位,如曾在图6和图7对应的文字段落中充分说明的那样。这使得第二PAL U2的引脚9(图6中)放掉经R4充给C2的任何电荷,这样防止C2约为2.7VDC的集累电压使Q1导电。请回想如果Q1导电,会把第二PAL U2的引脚11拉至逻辑ZERO,第二PAL U2内的电路将使第二PAL U2的引脚12输出逻辑ONE,使电源17停止向计算机系统10提供稳压功率,如已在和图6和图7对应的文字段落里更充分地说明那样。这样,C2必须至少约每10秒通过暂停程序放电以防止电源在暂停中间被断掉。
下一步,在270处,8042协同处理器104的状态被保留。8042协同处理器104寄存器在技术上是周知的。寄存器是可由CPU40直接读的,它们的值被直接写进D000H里的数据结构里。
接着,在272处,8259中断控制器92的状态被保留。暂停程序调用8259保留状态程序,它将在和图15对应的文字段落里细化。现在只要说这一点就够了,即8259保留状态程序查明两个8259中断控制器92的未知寄存器的内容,即使其中某些寄存器是只写的。寄存器值被直接写到D000H的数据结构里。
在中断控制器92的状态被保留之后,中断控制器92的配置必须被改变到一个已知的状态,以许可由暂停程序执行的不同的中断驱动任务发挥适当功能。因此,在274处,BIOS数据区和向量表被交换。暂停程序把在段0000H里的现行状态BIOS数据区和向量表的内容复制到段D000H里的一个单元。接着,已知状态BIOS数据区和向量表的内容从段D000H的数据结构复制到D000H里的单元。在图11所示的引导程序的任务414里已知状态BIOS数据区和向量表被复制到段D000H,引导程序将在下面讨论。最后现行状态BIOS数据区和向量表从段000H复制到段D0000H里的数据结构。当该程序在274处结束时,所有的中断,如中断13H(磁盘读/写)和中断10H(视频访问)将如预想的那样发挥功能。
接着,在276处定时器102的状态被保留。定时器的寄存器在技术上是周知的。所有这些寄存器可由CPU40直接读,它们的值被直接写进D000H里的数据结构。在276处IDE磁盘控制器86的状态也被保留。IDE磁盘控制器86寄存器在技术上是周知的。所有这些寄存器可直接由CPU40读,它们的值被直接写进D000H里的数据结构。
下一个步骤是准备系统存储器,使它可被写到硬磁盘机31上的暂停文件。系统存储器包括系统RAM53(它既包括主存储器又包括任何扩充存储器)和视频存储器58。在这个时候,部分RAM53可能在外部高速缓存60里。CPU高速缓存在任务628里被冲洗,这将在下面和图13对应的文字段落里讨论。这样,必须在RAM53可写到硬磁盘机31前冲洗外部高速缓存。这样,系统高速缓存60在286处被冲洗。在冲洗完成之后,RAM53是完整的,没有存储数据保留在CPU高速缓存41或者系统高速缓存60中。
在系统10上执行的代码可能已把IDE控制器86置为未知状态。接着,在292处,下个步骤把IDE控制器86初始化到已知状态。这是通过把值直接写进IDE控制器86里的寄存器中来实现的。
接着,在294处,暂停文件必须被定位到硬磁盘机31里的固定磁盘上。暂停文件的磁头、扇面和柱面存储在CMOS存储器96里。一旦暂停文件被定位,文件长度和特性表被读出。在最佳实施例中,特性表是一个任意长度的ASCII代码,它指明暂停文件的存在。特性表的其它代替实现是可能的,如使用具有在硬文件系统里被随机发现的非常低概率的二进制字符串。
在读出暂停文件的文件长度和特性表之后,在296处的下个步骤是保证该文件长度和特性表是正确的。如果特性表不正确,表示另一个程序可能修改过暂停文件,而如果文件长度不正确,表示暂停文件的长度被修改过,在其中任一种情况下则在298处暂停程序调用致命暂停错误程序,其启动图13的652任务。如果用户按下开关17,以退出致命暂停错误程序,程序控制从任务299转移到任务506。
另一方面,如果致命是正确的并且暂停文件足够长,则暂停程序可能着手把计算机系统的状态写进存储器。
在把计算机系统10的状态写到硬磁盘机31之前,在297处,故障保险定时器C2被复位并且开关被检验以探测开关21是否又被按下。如在和图6和图7对应的文字段落里所说明过的那样,如果对功率管理端口的读回送FEH,则开关21未被重新按过,暂停应该继续。另一方面,如果对功率管理端口的读回送FFH,则开关21被重新按过,暂停应该异常结束。在暂停程序的好几处C2放电、开关21被检验。任务297只是示意性的;在应用技术中具有一般技能的电路设计者能够确定C2放电的次数和放电间的时间间隔。暂停程序应该保证C2是放电的,因此,在C2把电源17“关掉”之前进行故障保险定时器复位。同样,开关21应该不时地受到检验。如果开关21被重新按过,这表明用户希望异常结束暂停,则代码应该转移到恢复程序的适当点,以继续已被暂停程序所暂停的操作。
类似,在350处,控制-更换-删除异常结束暂停。按下控制-更换-删除(同时按下控制键、更换键和删除键)是对基于IBMBIOS和Intel80×86 CPU家族的典型计算机系统进行复位的一种广为知晓的方法。计算机系统10和BIOS中断1处理程序一起处理控制-更换-删除,这在技术上是周知的。在350处,计算机系统10稍微修改了中断1处理程序,在352处它清除CMOS存储器96里的暂停标志,在354处转移到复位的引导程序。
在本发明的计算机系统10里,当暂停程序执行时按下控制-更换-删除使得计算机系统进入断电状态156。出现这种情况是因为,在开关21闭合后第二PAL U2处于开关状态102,按下控制-更换-删除时调用引导程序,而引导程序对功率管理端口写入00H来把第二PAL U2置到已知的状态。但是,当第二PAL U2位于开关状态102时,如把00H写进第二PAL U2,将使第二PALU2导致电源17停止提供系统功率,如已在图6和图7对应的文字段落里所说明的那样。这样,在处于暂停程序时按下控制-更换-删除将使计算机系统10进入断电状态156。
现参照任务300,在300处暂停文件重新放置在硬磁盘机31上;特性表短语写在暂停文件的第一个字节。接着,在302处,段D000H上的全部64K字节数据被写进暂停文件。这个64KD000H的复制品实际上只是位置支持物,在暂停程序的末尾它要被写回到同样的单元里。
接着,系统存储器被写进暂停文件。这是通过一个双缓冲器系统实现的:从系统存储器读出数据,把它压缩并写入段C000H,最后把压缩后数据从段C000H写入暂停文件。两种程序以一种分时的安排进行工作:一个将数据压缩并写入到段C000H,另一个写入到暂停文件。前者运行在前台,后者是由中断驱动的程序,它运行在后台。很明显,因为只有一个CPU40,在给定时间只能执行一个程序;但是,因为后一个程序是中断驱动的,它可以按需要将前一个程序的执行中断,以优化向暂停文件传送数据的速度。两个缓冲器中,每个为8K字节长,这被认为是对硬磁盘机31的传送时间的优化。
这个进程开始于304处,读出、压缩、并向段C000H写入足够的数据,以填充第一个8K缓冲器。利用运行长度编码法对数据进行压缩;当然,任何适用的压缩方法都可以采用。那时,在306处,启动在307处概括标明的从缓冲器写程序。从缓冲器写程序307是一个中断驱动程序,它运行在后台并包括任务308-310。概括标明在311处的压缩程序包括任务312-318,并是一个前台程序。首先,从缓冲器写程序307,在308处,把刚由任务304填充的缓冲器写入到暂停文件,在从缓冲器写程序307把缓冲器的内容写进暂停文件的同时,压缩程序311,在312处,继续从系统存储器读出下一批字节,压缩它们并把压缩后的数据写进两个8K缓冲器中的另一个缓冲器里。在314处,一旦压缩程序311用压缩数据填充缓冲器后,下个步骤为判别是否整个系统存储器已被压缩。
IDL控制器不能非常快地把数据写进硬磁盘机31。作为结果,压缩程序311总是在从缓冲器写程序307完成把缓冲器写入硬磁盘机之前把未被写入到硬磁盘机31的数据都填充到8K缓冲器。这样,压缩程序311必须等待,使从缓冲器写程序307完成把缓冲器写入硬磁盘机31。如果压缩程序311还没有结束对全部系统存储器的压缩和写,则在316处,压缩程序311等待从缓冲器写程序307。压缩程序311和从缓冲器写程序307通过一组标志通信。当从缓冲器写程序307完成把当前的缓冲器写入到暂停文件时,程序307接着切换缓冲器标志,对压缩程序311指出它可以开始用已压缩数据填充已写入到暂停文件的缓冲器。接着,在309处,故障保险定时器C2被复位并对开关21检验闭合事件,如已在任务297对应的文字段落里说明的方式。
在310处,从缓冲器写程序307接着判定刚向暂停文件写入的缓中器是否是要写的最后一个缓冲器。如果不是,从缓冲器写程序向暂停文件写入刚被压缩程序311填充的缓冲器。在其间,通过检查缓冲器标志,压缩程序311确定一个缓冲器已准备好可用于更多的已压缩系统存储器。也就是说,压缩程序在316处等待直到从缓冲器写程序完成当前的缓冲器,在这个时间,压缩循环在312处继续。请注意,视频存储器58是不压缩的。相反,视频存储器58利用VESA调用通过视频控制器56读,并利用上面详细解释的双缓冲区系统不经压缩地写。
一旦压缩程序311完成压缩所有的系统存储器,它在318处等待从缓冲器程序307从最后的缓冲器对暂停文件的写。一旦从缓冲器写程序307结束,它从310处转移到318并且不再存在。在这时,没有后台程序在执行而且主程序在320处继续。
接着,在320处,视频控制器56的状态被保留。视频控制器56寄存器在技术上是周知的。所有这些寄存器是直接可由CPU40读的,它们的值直接写入D000H里的数据结构。同时在任务320里,DMA单元71(DMA控制器72和中央仲裁器82)、8277软盘控制器84和RS-232UART(通用异步收发器)14的状态被保留。这些设备具有在技术上周知的寄存器。软盘控制器84和UART的所有寄存器是直接可由CPU40读的,它们的值被直接写进D000H里的数据结构。DMA单元不具有可读寄存器。相反,在每次DMA传送前只写寄存器常规地被设置。由于这个原因,如果DMA传送在进行之中,则暂停程序停止暂停操作。
希望一旦计算机系统10进入暂停状态150,能够检测对暂停文件的窜改行为。例如,有可能某人生成一个修改过的暂停文件,把这个暂停文件移入硬磁盘机31,并试图把计算机系统10恢复到与它被保留时的不同状态。为此,一个伪随机值被置入到段D000H的数据结构里。如在328处所示,从高速定时器102中的一个读出16位时间标记。该时间标记然后被写进段D000H数据结构。
接着,在不考虑进位位的情况下通过把各个16位字加起来的办法计算整个D000H段的16位检验和。在330处,该检验和被写到段D000H数据结构,在332,它被写到CMOS NVRAM96。在这之后,在334处所有的工作变量从CPU40写入到段D000H数据结构,而在336处,整个段D000H重写到暂停文件上,从暂停文件的特性表短语之后开始(直接在特性表之后)。接着,在338,暂停标志设置进CMOS NVRAM96,来通过系统10计算机系统的状态已被保留到暂停文件。
最后,CPU40通过把X102状态写到功率管理端口,使第二PAL U2进入102状态、把电源“关掉”。进入第二PAL U2102状态时,通过以下措施立即将电源17“关掉”:使第二PAL U2引脚12输出明确为逻辑ONE,使SR锁存器的输出引脚3锁存到逻辑ZE-RO状态,允许ON经R6拉至HIGH,使电源17的初级/稳压单元172停止沿±5和±12线路提供稳压电压。电压降到大约为零需要几秒钟,这给CPU一段时间去执行许多命令。因此,当CPU等待由电源17产生的系统能源电压衰落,直至CPU停止工作之前,在342处,CPU40执行无限循环。
现参照图11,其表示引导程序的细节。引导进程已在和图8对应的文字段落中简要地概括过。引导程序开始于380处,在那里CPU40转移到并执行由复位向量指向的代码。每当CPU40被加电和无论何时CPU40通过转移到由复位向量指向的代码而被复位时这都要发生。这种复位进程在技术上是周知的。
在382处,第一项任务是检验CPU40并将存储器控制器46初始化。CPU由POST程序加以检验。存储器控制器46由POST程序初始化。
接着,阴影存储器被检验而且BIOS从ROM88复制到RAM53的阴影存储器部分。被执行代码的流程取决于暂停标志在CMOSNVRAM96里是否设置。如果暂停标志设置,则计算机系统10处于暂停状态150,并且计算机系统10应该复原到当它被暂停时的状态。段E000H和F000H里的系统RAM被简略地检验。为减少恢复计算机所需时间,只对适当长度的存储器进行检查并清零(000H被写到各个单元)。
另一方面,如果CMOS NVRAM96里的暂停标志清除,则段E000H和F000H里的RAM53被给予标准的和彻底的检验,包括:(1)粘性位(sticky-bit)检验,(2)双位存储检验和(3)交叉地址线检验。这些检验在技术上是周知的。
在段E000H和F000H被检验之后,BIOS可被遮蔽,这包括把ROM BIOS88的内容复制到系统RAM53和把存储器控制器配置为可执行来自RAM的BIOS。进行BIOS的遮蔽是为了增加系统的速度;因为BIOS运行在较快的系统RAM53(典型的存取时间为80毫微秒)上而不是在较慢的ROM88(典型的存取时间250毫微秒)上系统性能得到提高。对BIOS的遮蔽包括把BIOS复制器装入到较低速存储器里的一个地址上,把BIOS从ROM88复制到系统RAM53的段E000H和F000H上,和允许阴影RAM。
接着,都在384处,视频控制器56被检验和初始化并且视频存储器58被检验。这些检验和初始化在技术上是周知的。
在386处,被执行代码的流程取决于CMOS NVRAM96里的暂停标志是否设置。如果暂停标志设置,则和任务383一样,剩余的系统RAM只被仅仅检验长度然后清零。但是,如果CMOSNVRAM53里的暂停标志清除,则在任务398处采用在任务383对应文字段落里已描述的三步彻底的存储器检验来检验剩余的系统RAM53。
在存储器被检验之后,在400处,辅助设备-包括8259,UARI,8042和任何其它设备-被检验和初始化。在任务408,固定磁盘控制器被初始化。
在409处,被执行代码的流程取决于CMOS NVRAM96里的暂停标志是否设置。如果暂停标志设置,表明电源上次被关掉时系统状态已成功地保留,则引导程序跳过对硬磁盘机控制器86和硬磁盘机31的检验。另一方面,如果CMOS NVRAM96里的暂停标志清除,表明上次电源被关掉时系统的状态没有保留,则在任务410,引导程序对固定磁盘控制器86和硬磁盘31进行全面的校验,如技术上周知的那样。
接着,在412处软盘控制器84被检验和初始化。
此时,所有的设备都已初始化而且向量指向已知的地址,所有中断程序将如期待那样工作。这样,在414处,引导程序快读BIOS数据区和向量表,它把BIOS数据区和向量表的复制品写入段D000H里的数据结构。在任务274该BIOS数据区和向量表被暂停程序用来把计算机系统10置为已知状态,使所有中断可按预想地工作。
接着,在416处按技术上周知的那样,任何BIOS扩充被“扫描进”和初始化。BIOS扩展是通过外围设备适配器,如网络适配器,增加到系统上的BIOS代码块。典型的BIOS扩充位于ISA总线76上的段C000H和D000H里而且具有相应的“特性表”以标明作为BIOS扩充。如果BIOS扩充被检测出,它的长度被检查而且检验和被计算和被检查。如果特性表、长度和检验和都表明存在有效BIOS扩充,程序控制传给位于特性表三字节之后位置上的指令,并且BIOS扩充可以执行任何所需任务如对外围设备适配器的初始化。一旦该扩充结束执行,控制传送回引导程序,它搜索更多的BIOS扩充。任何更多的BIOS扩充象上面的BIOS扩充一样地得到处理。如果没有检测出更多的BIOS扩充,则引导程序转移到任务417、
在417处导引程序寻找硬磁盘机31上的一个分区,它看来象是专门分配给暂停文件的分区。如果在分区表上发现一个带有PS/1标识符(“FE”)的分区并且这个分区是足够大可以容纳该特定系统的暂停文件,则这个分区被确定为用于暂停文件。结果,暂停文件被分配在文件分配表(FAT)里,如技术上周知的那样,暂停文件特性表被写到文件的第一个字节,而且文件的起始磁头、扇面和柱面被写进CMOS NVRAM96里。
然后被执行的代码在418处分支,这取决于CMOSMVRAM96里的暂停标志是否为设置。如果暂停标志被清除,则在420处引导程序把控制传送给PBOOT程序。PBOOT在技术上是周知的并且负责装入操作系统(OS)和来自软盘机或硬磁盘机31的命令解释程序。对本发明的常规引导程序作了轻微地修改,使得当OS被装入时,如果在任务417未发现用于暂停文件的分区,则OS执行一个OS专用驱动程序,它在FAT里分配一个相连区段(如果需要连接一个区域)文件,对暂停文件的第一个字节写进特性表,并把暂停文件的开始磁头、扇面和柱面写入CMOS NVRAM96。
不论何时暂停文件被分配,FAT里的区域应该是相连的区段,以允许分别在暂停和恢复期间可对磁盘快速写和从磁盘快速读。
PBOOT接着根据在CONFIG.SYS文件里找到的指令配置系统。最后,PBOOT把执行控制传送给AUTOEXEC.BAT文件,该文件最终把执行控制传送给操作系统。如果在CMOS NVRAM96里暂停标志是清降的,表明当上次功率被关掉时系统状态未被保留,则在与任务421对应的文字段落里被更充分解释的RESUME.EXE被忽略。
回到顶部任务418,如果CMOS NVRAM96里的暂停标志为设置,指明上次电源被关掉时系统的状态被保留,则在419处,被执行的代码的流程分支,这取决于CMOS NVRAM96里的再初始化适配器标志是否为设置。如果再初始化适配器标志被设置,则在421处引导程序把控制传送给PBOOT程序。和一般的PBOOT程序一样,本发明的PBOOT按照在CONFIG.SYS文件和AUTOEXEC.BAT文件里找到的命令配置系统,它们特别装入驱动程序和按技术上周知的方法配置系统。
CONFIG.SYS和AUTOEXEC.BAT里命令可用于初始化系统里的适配器插件板。这种应用假设存在三种类型的适配器插件板:类型Ⅰ适配器不需要初始化;类型Ⅱ适配器需要初始化,但是由BIOS扩充或由经CONFIG.SYS或者AUTOEXEC.BAT装入的驱动程序设置到已知的工作状态;而类型Ⅲ适配器被在系统上执行的代码修改。包括类型Ⅰ和类型Ⅱ适配器的系统可被暂停和复原;但是包括类型Ⅲ适配器的系统,包括许多连网适配器,可能不能够复原,除非这些插件板具有从误差中恢复的程序。系统可以暂停可从误差中恢复的类型Ⅲ插件板。
在最佳实施例中文件RESUME.EXE被加到AUTOEXEC.BAT文件上,文件RESUME.EXE负责把程序控制从PBOOT传送给恢复程序。任务420里的PBOOT忽视RESUME.EXE的存在;但是任务421的PBOOT执行RESUME.EXE,它在类型Ⅱ适配器通过设备驱动程序完成初始化之后把控制传送给恢复程序,这些设备驱动程序是通过PBOOT从CONFIG.SYS和AUTOEX-EC.BAT装入的。
再参照任务419,如果CMOS96里的再初始化适配器标志是清除的,引导程序在422处把执行控制直接传送给恢复程序,不处理CONFIG.SYS或AUTOEXEC.BAT。恢复程序从硬磁盘机上的暂停文件恢复状态,这将在和图12对应的文字段落里详细说明。
现参照图12,其中表示恢复程序,任务450到530,的细节。在配置过程期间,BIOS数据区和向量表可能被修改到未知的状态;这样BIOS程序可能或者不可能按所期望的那样作用。因此,在454处,恢复程序把段D000H允许为读/写,并在456处调用交换BIOS数据区和向量表程序。该程序把在任务414里被复制到段D000H的已知的好BIOS数据区和向量表与在段0000H里当前有效的、被修改过的BIOS数据区和向量表交换。当该程序结束时,已知BIOS数据区和向量表有效存在段D000H里,而修改过的BIOS数据区和向量表在段D000H,并且BIOS程序可按期望地作用。
接着,在458处,恢复程序禁止所有的除了支持键盘和硬磁盘机之外的中断。然后,在460处,恢复程序定位硬磁盘机上的暂停文件,并读文件长度和特性表,特性表,如上面说明的那样,是暂停文件的多字节标识符。在462处,被执行代码的流程分支,这取决于暂停程序是否具有正确的长度和特性表。如果暂停文件不具有正确长度和特性表,则在464处恢复程序把CMOS存储器96里的暂停标志置为CLEAR,并在466处把程序控制传送给由复位向量指向的位置上的代码,因此使得系统按照好象系统从未暂停过那样引导。另一方面,如果暂停文件具有正确长度和特性表,则在468处恢复程序通过把暂停文件上位于特性表之后的64K数据块(暂停文件的这部分对应于段D000H信息)读到段C000H继续系统恢复的操作。
接着,在470处,C000H里块的检验和被计算,在472处从CMOS非易失存储器96上读出预先存储的检验和,在474处被执行代码的流程分支,这取决于任务470计算的检验和是否等于任务330计算的检验和。如果任务470计算的检验和和任务330计算机的检验和不同,则暂停文件出现疵漏(例如,它可能被窜改)而控制仍送给任务464,该任务把暂停标志置为清除并复位系统,如已在和任务464和466对应的文字段落里说明过的那样。如果任务470计算的检验和等于任务330的检验和,则暂停文件被假设为与由暂停程序写入的那个暂停文件相同,在476处段C000H里的数据复制到段D000H里。请注意,当C000H数据被复制到时,修改过的BIOS数据区和向量表被重写,因此是不可恢复的。
现在,恢复程序在478处对屏幕写出一个专门的信号屏幕来通知用户系统已被恢复,并且用户应该按下控制-更换-删除以异常结未恢复。正如暂停程序一样,在562处按下控制-更换-删降会清除暂停标志,并在528处使得系统再引导。但是,在再引导过程中,第二PAL U2处于开关状态012,因此,把X00H写给功率管理端口不会导致电源17停止提供系统功率。这样,当控制-更换-删除被按下时,系统常规地再引导而且恢复程序在执行着。
接着在480处、482处和484处,通过把来自段D000H数据结构的值写到对应的寄存器时,8277软盘控制器84、DMA单元71和UART94分别得到恢复。
然后,从任务486到500,利用类似暂停程序里任务304到308对应的文字段落里所说明的双缓冲器程序,从暂停文件恢复系统存储器。该双缓冲器系统从暂停文件读出被压缩的数据,写到段C000H,扩展它并写进系统存储器。两个程序工作在分时方式下:一个从暂停文件读出数据并把它写入段C000H,而另一个扩展数据并把扩展过的数据写进系统存储器。后者运行在前后,而前者是中断驱动的程序,运行在后台。很明显,因为只有一个CPU40,在一给定时刻只有一个程序可以运行;但是,因为前一个程序是中断驱动的,它可以根据来自暂停文件的数据的传送速度的优化要求,来中断后一个程序的执行。两个缓冲器的每一个都是8K字节长,这被相信为可优化传送时间。
这个进程开始于486处,即读暂停文件并对段C000H写入足够的数据以填充第一个8K缓冲器。此时,在306处开始从缓冲器读程序,该程序一般表示在489处。从缓冲器读程序489是一个中断驱动程序,它运行在后台,并由任务490-492组成。一般标明在493处的扩展程序由任务494-498组成而且是前台程序。首先,在490处,从缓冲器读程序开始读暂停文件的下一个8K并把它写进另一个缓冲器即现在的当前缓冲器里。在从缓冲器读程序从暂停文件读下一个8K并把它写进当前缓冲器的同时,在494处,扩展程序读由任务486填充的缓冲器,扩展被压缩数据,并把扩展后的数据写进系统存储器。一旦扩展程序493扩展该缓冲器里的所有数据,在496处,下一个步骤是判别是否全部系统存储器已经被扩展。
IDE控制器86不能从硬磁盘机31里非常快地读数据。作为后果,扩展程序493决是在从缓冲器读程序489完成把数据从硬磁盘机31读进当前缓冲器之前,完成对尚未写入到硬磁盘机31的8K缓冲器的扩展处理。因此,扩展程序493必须等待从缓冲器读程序489完成从硬磁盘机31读数据。如果扩展程序493尚没有完成全部扩展处理和把数据全部写进系统存储器,则在498处扩展程序493等待从缓冲器读程序489。扩展程序493和从缓冲器读程序通过一组标志通信。当从缓冲器读程序489结束从暂停文件向当前缓冲器写数据的时候,在490处,该程序489接着切换缓冲器标志,指示扩展程序493可以开始对刚从暂停文件读到缓冲器的数据进行扩展。在492处,从缓冲器读程序接着判别是否还有8K数据块仍然要从暂停文件中读出。如果不,在502处从缓冲器读程序从暂停文件读出剩余数据并写到当前缓冲器里。然后从缓冲器读程序停止在后台运行,实际上在500处等待扩展程序完成对最后存储器的扩展。
在其间,通过确定该冲器标志,扩展程序493确定一个缓冲器已准备好以对系统存储器进行扩展。也就是说,扩展程序在498处等待直到从缓冲器读程序完成当对前缓冲处的操作,在这个时候在494处继续扩展循环。
一旦扩展程序完成扩展所有的系统存储器,没有后台程序在进行中,在504处主程序继续。
接着,在504处和506处,通过把来自D000H数据结构的值写到视频控制器56和IDE控制器86各自的寄存器里,这两个设备被恢复。接着,在508处,通过分别地把适当值写入CPU40和高速缓存控制器62,CPU高速缓存41和系统高速缓存被允许工作。接着,在510处到514处,通过把来自段D000H数据结构的值写到定时器控制器102、8042键盘接口微处理机104和8259中断控制器92各自的寄存器里,恢复程序恢复这些设备的状态。
接着,在516处,恢复程序调用交换BIOS数据区和向量表程序。在该程序被调用之前,段0000H里的已知BIOS数据区和向量表是有效的,而从暂停文件上读出在段D000H数据结构里的BIOS数据区和向量表是无效的。在交换之后,已知的BIOS数据区和向量表在段D000H里是无效的,而由暂停程序保留的BIOS数据区和向量表在段0000H里是有效的。
终于,在518处,恢复程序转移到复原CPU程序,它把CPU复原到暂停之前的状态。复原CPU程序将在和图14对应的文字段落里更充分地说明。复原CPU程序最终把执行控制传送回给APM。
最后,CPU40执行RETURN指令,使得系统返回到APM。系统现在继续执行指令仿佛系统从未暂停过。出于全部实用目的,系统不受暂停/恢复进程的影响。
现参照图13,它表示保留CPU状态程序流程图。在600处暂停程序转移到保留CPU状态程序。请注意APM允许段E000H和F000H,程序可按读/写对它们执行。另外,如在602所标明的,E-FLAGS和八个通用寄存器被APM保留。保留CD0状态程序首先在604处等待任何DMA(操作)的结束,并和鼠标器数据包同步,以保证该程序在鼠标器包传输之间执行。下述步骤允许结束DMA和与鼠标器包同步:(1)允许中断,(2)等待7毫秒使任何DMA结束,(3)禁止中断,(4)为鼠标器包边界等待5毫秒,(5)允许中断,(6)为鼠标器包的到达等待长于五毫秒和(7)禁止中断。在这些步骤之后,代码可安全地执行于鼠标器包之间。
接着,在606处,地址线20(I/O端口92H)的状态被推进栈,在608处算术协同处理器44的状态被推进栈。然后在610处,标志被设置或被清除以分别表明CPU是在32位还是在16位方式下执行。
在612处,被执行代码的流程分支,这取决于CPU40是否执行在保护方式下。如果CPU40不是执行在保护方式下,则它必然执行在实址方式下,因而寄存器可以以非常直接的方式保留。首先,在614处,计算机状态字和CR3里的值被写进段E000H数据结构。同时在614处,零被写进到段E000H数据结构里对应于TR和LDTR的区域里,因为在实址方式下TR和LDTR为零。
代码在616处和共同的代码路径会合,在那里存储在GDTR和LDTR里的值被写入段E000H数据结构。接着在618处被执行代码的流程分支,这取决于CPU40是否执行在虚拟8086方式下。如果CPU40不是执行在虚拟8086方式下。则代码继续沿共同路径进入任务620,在那里查错寄存器DR7、DR6、DR3、DR2、DR1和DR0被推进栈。这些寄存器由查错程序和其它程序使用。接着在622,DS、ES、FS和GS被推进栈。接着CS、S和ESP的值被写进段E000H数据结构。
在这时,所有的要写入段E000H的值已都被写入,这样在626处阴影RAM段E000H和F000H可以被变回只读方式。接着,在628处,CPU高速缓冲41经写回和无效高速缓存指令被冲洗。
最后,在630处,唯一的关机标志在CMOS非易失存储器96里置为设置。最后在632处,保留CPU状态程序实际上“返回”至暂停程序。该“返回”实际上是继之以代码分支的RESET(复位)。CPU40通过转移至复位向量指向的代码来复位。把CPU40复位迫使CPU进入实址方式,在这种方式下所有的设备和存储器单元都可被访问而无须担心产生保护故障。在这以后,CPU的状态已被保留,暂停程序应该保留系统其它部分的状态。
在由复位向量指向的代码之内,程序控制分支,取决于CMOS96里的关机标志是否为设置。如果关机标志为清除,则系统如常规那样进行引导。另一方面,如果关机标志为设置,则代码转移到暂停程序的剩余部分,也就是说,执行控制转移到暂停程序图10里的任务253,暂停程序完成暂停系统10。这样,保留CPU状态程序有效地在632处“返回”暂停程序。
回过来参照任务612,如果CPU处于保护方式,则在任务634代码分支,这取决于CPU是否处于虚拟8086方式。如果CPU不处于虚拟8086方式,则在任务636处代码再次分支,取决于当前特权级是否为零。如果当前特权是除零之外的任何值,则一个不具有适当特权的程序来执行保留CPU状态程序并且调用致命暂停错误程序(开始于任务652)。致命暂停错误程序将在下面讨论。如果程序控制从致命暂停错误程序返回,则CPU必须回到保留CPU状态程序被调用前的条件,这样执行转移到图14的任务794,它执行CPU的部分复原。因为非常少的CPU被修改过,只需要部分复原。
回过来参照任务636,如果调用的代码具有合适的特权级,则在642处继续保留操作,CP0,CR3,TR和LDTR的值被保留到段E000H数据结构。然后该代码路径在616处和共同代码路径会合,在那里,如已说明过的,GDTR和IDTR的值被保留到E000H数据结构里。从这里,代码经过上面说明过的从618到632的路径,结果是“返回”(RESET加上转移)到剩余的暂停程序代码。
回过来参照任务634,如果CPU40处于虚拟8086方式,则在644处继续执行,在那里计算机状态字(CR0的低16位)的值被保留在E000H数据结构里,并且段E000H里的一个标志被设置,以指明CPU处于虚拟8086方式。然后该代码通过646和648的传送在616处和共同的代码会合。在任务618,如果CPU处于虚拟8086方式,则控制转移到650,在那里DS、ES、FS和GS里的值被保留到段E000H数据结构里。该代码在624处再次会合共同的代码。从这里,代码经过前面已说明过的从624到632的路径,结果“返回”到剩余暂停程序代码(RESET加上转移)。
在任务652到664可以找到致命暂停错误程序,如果具有不正确特权级的代码试图保留CPU的状态,该程序在638处被调用。首先,在654,通过把07H再把05H写进功率管理端口,故障保险定时器被设置,如在和图7对应的文字段落里已说明过的那样。然后在任务656,扬声机以886赫0.25秒的长度蜂呜三次,蜂鸣的间隔为1/6秒。三次蜂鸣提醒用户试图的暂停未能产生。在蜂鸣之后,在658处故障保险定时器再次被重置,以在故障保险定时器期满把电源17关闭之前给用户15到20秒的期待时间。
接着,在任务660和662,致命暂停错误程序反复地检验,查看是否开关21被用户按下,其表明用户希望异常结束暂停。对开关闭合的检验是通过在对功率管理端口进行读后等待出现FFH来实现的,如在和图7对应的文字段落里已说明过的那样。如果用户按下按钮21,则执行控制返回到上面的任务640。如果在15到18秒中用户未按下按钮21,则故障保险定时器将期满,电源17将被“关掉”,而且,很明显,对代码的所有执行将停止。
现参照图14,其中表示开始于700处的复原CPU程序的流程图。这个程序被恢复程序在其它的硬件和存储器复原到它们暂停之前的状态后调用。首先,如果段E000H和F000H尚未处于读/写,在702处它们应成为读/写。
接着在704处,被执行代码的流程分支,取决于在暂停的时候CPU40是否执行在虚拟8086方式下。如果当系统10被暂停的时候CPU40执行在虚拟8086方式下,则代码从任务706进行到任务728,它们等同于虚拟8086CPU复原。然后代码和从任务730到738的共同的路径会合。
如果当状态被保留时CPU处于虚拟8086方式,则CR3、LDTR和TR不能被保留CPU状态程序访问,因而也就无法把它们的值保留在E000H数据结构里。因此,CR3、LDTR和TR必须分别在706处、708处和710处被估算。一般而言,它们的估算是通过对RAM53等找由CR3、LDTR和TR指向的结构来进行的。例如,找出在GDT(图示显示终端)里的LDT(逻辑设备表)入口,即允许确定LDTR。
CR3在任务706估算。CR3保持页面目录基址寄存器,该寄存器保持页面目录的页框地址、页面级高速缓存禁止(PCD)位和页面级写通过(PWT)位。知道页面目录必须开始于系统RAM53的4K边界上,知道由保留CPU状态程序保留在段E000H数据结构里的IDTR和GDTR的值并假设BIOS代码从地址空间0E0000-0F0000上执行,可以完成对PDBR的估算。上述假设是合理的,因为BIOS代码出于速度的原因已经遮蔽到阴影RAM中。如果操作系统把BIOS代码复制到不同的区域,则对CR3的估算将失败。
借助上面的知识和假设,为鉴定对应于BIOS代码段的页面转换表的存在,对物理存储器的每4K页面进行检验。也就是说,在页面中0380的偏移将包含值000E0XXX、000E1XXX、000E2XXX、…000FFXXX。一旦页面被定位,对系统RAM53寻找一个页面目录,该页面目录的第一个入口对应于上面定位的页面表的物理位置。该页面目录的物理地址是对PDBR值的好的“猜测”。
然后通过确保假设PDBR正确地为GDTR和IDTR转换地址,该假设PDBR得到证实。也就是说,该PDBR被用来转换GDTR的线性地址并且GDT的第一个入口被校验并确认为空(在任何CPU方式下GDT的前八个字节总是为00H)。然后该回送的物理地址被检验并确认为在物理存储器的边界之内。为实现线性地址到物理地址的转换,使用了一个模仿CPU转换方法的子程序;被转换地址在ESI里回送,并且如果物理页面出现在物理存储器之中进位标志CF被清除,而如果物理页面不出现在存储器里CF置为设置。利用这个转换程序,从存储器53里读GDT的第一个字节。如果GDT的第一个入口为空,则该假设PDBR通过它的第一次检验,因而,被再次检验。然后利用该转换程序,该PDBR被用来转换IDTR以寻找TDT。然后被回送的物理地址被检验为在物理存储器的边界之内。如果IDT的第一个位置出现在物理存储器里,则PDBR通过它的第二次检验。
如果假设的PDBR正确地转换到GDTR和IDTR,则该值被假设为PDBR并被写到段E000H数据结构里的CR3区。如果,另一方面,该假设的CR3失败于二个检验中的一个,则程序重新开始,对系统存储器寻找另一个BIOS代码段页面转换表,它也许导致有效的CR3。
对常规的平面操作PCD和PWT总是假设为固定在00H处。这些值设定为零并和PDBR一起写入段E000H数据结构的CR3区里。
一旦CR3被估计,在708处LDTR被估计。知道LDT在GDT里的某个地方和知道LDT必须出现在存储器里,在CR3被估计出的条件下LDTR可被估计。为估计LDTR,对GDT寻找明显出现的LDT。出现在物理存储器里(利用任务706对应的文字段落里所说明过的转换程序来检验)和明显出现的第一个LDT被假设为由LDTR指向的表。该表的起始物理地址被保留在段E000H数据结构里的LDTR区里。
上面估计LDTR的方法被认为在应用上足够可靠,即使在OS/2情况下多于一个的LDT可能明显出现并可出现在物理存储器里,也是如此。EMM386是一个普通的虚拟8086方式程序,因而看上去可能引起问题;但是,EMM386的CR3和LDTR是容易估计的,因为EMM386只具有一个CR3和一个LDTR。
一旦CR3和LDTR被估计,在710处估计TR。本质上,在GDT和LDT里的各个任务选择程序入口中寻找带有忙位组的一个任务状态选择程序。对各个入口的类型字段进行检验,查看它是否是忙80286任务状态选择程序或者是忙80486任务状态选择程序。带有忙286TSS或者带有忙486TSS的第一个入口被假定为TR指向的位置。带有忙286或486TSS的入口的物理位置被保留在段E000H数据结构里的TR区中。如果没有具有忙286或486TSS的入口,则把零存到段E000H数据结构里的TR区中。
在估计CR3、LDTR和TR之后,代码在712处继续。在712处,如果TR指向有效的TSS,则在714处由TR指向的TSS里的忙位被清除。不管怎样,代码在716处继续,在那里对DS、ES、FS和GS装上对GDT有效的选择程序。然后在718对CR3和CR0装上来自段E000H数据结构的值。接着,在720,允许分页,这样线性地址和物理地址相同的唯一区域是段E000H和F000H里的区域。然后,在722处,对IDTR、GDTR、LDTR和TR装入存储在段E000H数据结构里的值。
最后,在724和726处,通过把对应于GS、FS、DS、ES、SS、ESP、EFLAGS(在设置VM位后)和CS来自段E000H数据结构的值推进栈,建立虚拟8086中断栈。同样,在726处对应于任务730处的代码的返回地址被推进栈。最终,IRETD指令被执行以把CPU40置回虚拟8086方式并把执行传送给任务730所对应的代码。
任务730开始共同的调度,它被图14里的各个不同的调度所使用。在任务730,协同处理器44从保留在段E000H数据结构里值复原。接着在732处,地址线20(I/O端口92H)的状态从栈弹出。然后在734处,阴影RAM段C000H重新被置为只读。在736处,通过把01H写到功率管理端口APM和硬件连接,如在和图7对应的文字段落里已说明的那样。然后在738处,阴影RAM段E000H和F000H重新被置为只读。最后,在740,复原CPU状态程序设定标志指明发生常规的复原。任务742、744和746不被复原CPU状态程序执行,而只是用来显示在返回到被暂停事件中断的代码之前的某时刻,八个通用寄存器被弹出栈,可屏蔽中断被允许(假定当以前代码被中断时它们曾被允许的),而且标志弹出栈。最后,复原CPU状态程序返回到监督程序,监督程序把控制返送给APM,APM更新任何过时的系统值并把控制返回给中断发生时的代码。
现再回到参照任务704,如果CPU过去被中断时不处于虚拟8086方式,则代码经过从750到792的路径,在792处代码和从730到748的共同调度相会合。在750,如果在段E000H数据结构里的TR值指明TR指向有效的TSS,则在752处该TSS的忙位被清除。不论发生什么情况,接着在754处,对GDTR和CR0装入来自段E000H数据结构的值。
然后,在任务756到764,伪页面目录表和伪页面转换表被装入段C000H。首先,在756处,阴影RAM段C000H被设为读/写。第二,在758处,一个新的页面目录表在位置0C000H上建立。第三,在760处,该新页面目录表里的第一个入口被修改为指向0C1000H。第四,在762处,在0C1000H处建立一个新的页面转换表,使得地址0E0000到0FFFFF是存在的并且在这个地址范围内线性地址等于物理地址。最后CR3里页面目录基址寄存器被装入0C0000H,这样完成在0C0000H里的新伪页面目录和页面转换表的地址转换。当在任务754里CR0被装入时分页是重新激活的(如果可应用的话)。
接着,在766处,阴影RAM段E000H和F000H被设为读/写。然后,如果CPU40当它以前被暂停时在执行16位代码,则在770处,它曾处于16位方式并且指向16位代码路径的偏移被保留到段E000H数据结构中。另一方面,如果CPU40过去不处在16位方式,则它曾是32位方式,在772处指向32位代码路径的偏移被保留到段E000H数据结构时,以代替16位偏移。无论发生什么情况,这些代码路径是并列的,唯一的不同点在于一个使用16位操作数而另一个使用32位操作数。任务770和772只把偏移设置进并列路径中的一条。在下面的任务782处进入这些路径中的一条(对应于该偏移的一条)。
接着,在774,来自段E000H数据结构的CR3值被装入EDX,来自段E000H数据结构的SS值被装入CX,来自段E000H数据结构的TR值被装入ESI的上半部而且来处段E000H数据结构的LDTR值被装入ESI(SI)的下半部。在下面这些值被移到它们的适当单元中。然后,在776处,GDTR、LDTR和CR0被装入来自段E000H数据结构的它们的值。在778处,把存储在SI里的LDTR值装入LDTR。然后代码远转移到置在任务770或772里的偏移上。通过直接把操作码放到源代码中和采用来自770或772中的一个偏移,该远转移被编码。在782,代码然后沿16位操作码路径或32位操作码路径中的一条继续执行。
接着在784处,把存储在EDX里的CR3值装入CR3,把存储在CX里的SS值装入SS,把存储在EBP里的ESP值装入ESP。在786处,则把GS、FS、ES和DS从栈内弹出。在788处,如果被中断的CPU40过去是保护方式下的执行代码,则在790处把存储在ESI上半部里的TR值装入TR。不论是那种情况,代码在任务792处继续,在792处查错寄存器DR0、DR1、R2、DR3、DR6和DR7从栈中弹出。
这里,代码路径和从任务730到748的共同的路径会合,该共同路径前面已作过说明。在794处,误差恢复程序也从保留CPU状态程序的任务640加入到共同的路径。
现在参照图15,其中表示开始于800处的保留8259状态程序的流程图。在802处,保留8259的状态的操作从保留被实时时钟使用的周期中断值开始,在804处把所有其它可读寄存器保留到段E000H数据结构。计算机系统10的体系结构要求某些8259只读寄存器具有固定值,如技术上所周知的那样。这些值是知道的并不需要被确定。难于得到的8259值是8259基地址、8259从地址以及这两个8259是否设置为是待决的还是被OS用于中断的。
利用图15的剩余代码这四个上述的项目被确定。在806处8259被屏蔽,只留下键盘12和鼠标器13中断不被屏蔽。
接着,在808处,通过把物理存储器的底层1K复制到段C000H数据结构,保留中断向量表。然后,在810处,一个新的“伪”中断向量表被装入物理存储器的底层1K中,这是通过装入256个相同的伪向量来实现的,这256个伪向量指向开始于段C800H的256个伪中断服务程序。在812处,这256个伪中断服务程序在段C800H里被生成。
然后在814处,键盘12和鼠标器13中断被禁止。在816处,任何未确认的键盘12和鼠标器13中断被确认。
在818处,然后产生一个键盘中断,而且在820处,该中断被检验,以查看基8259是否设置为是待决的或是服务中的。该值则被写进段E000H数据结构。在822处,代码等待该中断得到服务。在824处,通过调用一个伪处理程序,该中断得到服务。调用伪服务程序来确定8259基地址和确定8259过去是否处于待决或使用方式,基地址和方式被保留在段E000H数据结构里。
对从属8259在任务826、828、830和832中执行类型的过程。
在834处,通过把来自C000H数据结构的值复制回到物理存储器的底层1K,中断向量表被复原。然后,在836处段C000H重新成为只读,在838处所有中断被屏蔽,在840处准备返回到调用程序。
尽管本发明通过其实施例的描述得到说明,并且尽管该实施例得到相当详细的说明,但是把所附权利要求书的范围约束在和以任何方式限制在这些细节上决不是申请人的意图。对于熟悉技术的人附加的优点及修改是显而易见的。例如,如上面曾描述的,电话铃声检测电路在相连的电话线路呼叫时可把计算机系统10从暂停状态154改变到常规运行状态150。因此,本发明在它的更广阔的方面不受到特定细节,示意设备和方法以及所展示和所描述的示例的限制。因此,在不违反申请人的总发明概念的实质或范围的前提下可对这些细节作出更改。