PG
分页(CR0的31位)
置1启用分页,置0不启用分页。当禁用分页时,所有的线性地址都可以当作物理地址对待。如果PE标志(CR0中位0)没有置1,PG标志将不起作用,实际上,如果在PE标志为0的情况下,将PG标志置1会产生一个一般保护异常(#GP)。见3.6节“分页(虚拟内存)概况”对处理器分页机制的详细说明。
CD
禁用高速缓存(CR0的位30)当CD和NW标志为0时,处理器中内部(和外部)内存位置的高速缓存将启用。当CD标志置1时,高速缓存将会被禁用,如表10-5所示。为阻止处理器访问和修改它的高速缓存,必须将CD标志置1并且使缓存失效,这样就不会命中高速缓存了(见10.5.3节“阻止高速缓存”)见10.5节“高速缓存控制”对于选中的页或者内存位置的高速缓存限制的详细描述
NW
不直写(CR0位29)当NW和CD标志都置0时,回写(即write-back,主要是对 Pentium 4、Intel Xeon、P6系列、和Pentium处理器而言)或直写(即write-through,对Intel486处理器而言)被用来写命中缓存时的数据,并且启用失效循环。表10-5详细介绍了NW标志在高速缓存方面对CD和NW设置的影响。
AM
对齐屏蔽(CR0的位18)置1时启用自动对齐检查,置0时禁用对齐检查。对齐检查只有在AM标志、EFLAGES中的AC标志置1时并且CPL是3、处理器运行在保护模式下或者虚拟8086方式下才进行,
WP
写保护(CR0的位16)置1时禁止管理级的过程往用户级只读页中写,置0时允许管理级的过程往用户级只读页中写。这个标志是用来在创建(forking)一个新进程时实现写拷贝(COW-copy on write),在UNIX操作系统中就是如此。
NE
数值错误(CR0中的位5)置1时启用原生的(内部的)x87FPU错误报告机制,置0时启用类PC的x87FPU错误报告机制。当NE标志置0且检查(ASSERT)IGNNE#输入时,一个未屏蔽处理的x87FPU错误,会引起处理器检查FERR#针来产生一个外部中断,并且在执行下一条等待浮点指令或WAIT/FWAIT指令之前,立即停止指令的执行。FERR#针是用来驱动输入到外部中断控制器的(FERR#模拟intel 287和intel387DX数学处理器的ERROR#针的)。NE标志、IGNNE#针和FERR#针和外部逻辑一起被用来实现类PC的错误报告机制的(参见第8章“软件异常处理”和卷1中的附录D中关于x87 FPU错误报告机制,以及当FERR#针在被检查(ASSERT)时,具体实现所依赖的东西)。
ET
扩展类型(CR0的位4)在Pentium 4、Intel Xeon、P6系列、和Pentium 处理器中为保留位,被硬编码为1。在intel 386和intel486处理器中,这个标志置1表示对intel 387DX数学协处理器指令的支持。
TS 任务切换(CR0的位3)允许当一个任务切换延迟至x87 FPU、MMX、SSE或SSE指令被新任务执行时,保存x87 FPU,MMX,SSE和SSE2的上下文。处理器在每次任务切换时设置该位,并且当执行x87 FPU,MMX,SSE和SSE2指令时测试该位。 z 如果TS标志置1并且EM标志(CR0的位2)置0时,那么在x87 FPU、MMX、SSE和
SSE2指令执行前, “设备不可使用”异常(#NM)会产生,但是这些指令并不包括PAUSE、PREFETCHh、SFENCE、LFENCE、MFENCE、MOVNTI和CLFLUSH指令。(参见WAIT/FWAIT指令下的相关叙述)
如果TS标志置1并且MP标志(CR0的位1)和EM标志都置0时,那么在执行x87 FPU WAIT/FWAIT指令之前#NM异常并不会产生。
如果EM标志置1,TS标志的值对x87 FPU、MMX、SSE和SSE2指令的执行就没有什么影响。
表2-1列出了处理器遇到x87 FPU指令时,根据TS、EM、MP标志的值所作出的不同反应。表11-1和12-1列出了处理器分别遇到MMX和/或SSE或SSE2指令时,所作出的反应。
处理器在进行任务切换时并不会自动保存x87 FPU、XMM、和MXCSR寄存器的内容。相反地处理器将TS标志置为1,这样在新任务的指令流中,无论处理器何时遇到x87 FPU、MMX、SSE或SSE2 指令(前面列出的指令除外),就会引起#NM异常。 #NM异常处理程序可以用来清除TS标志(用CLTS指令)并且保存x87 FPU、XMM的上下文和MXCSR寄存器。如果任务从未遇到x87 FPU、MMX、SSE或者SSE2指令,那么x87 FPU、MMX、SSE和SSE2的上下文就从不保存。
EM 仿真(CR0的位2)置1时表明处理器没有内部或者外部的x87 FPU,置0时表明有x87 FPU。这个标志也影响MMX、SSE和SSE2指令的执行。当EM为1时x87指令的执行会产生一个“设备不可使用”的异常(#NM)。当处理器没有x87 FPU或者没有连接到外部数学协处理器时,必须将该位置为1。设置该位将强制所有的浮点指令由软件仿真。表9-2根据IA-32处理器和x87 FPU或者系统中有的数学协处理器,列出了该标志的推荐值。表2-1列出了EM、MP和TS标志的相互影响。另外当EM标志为1时,执行MMX指令将会产生个非法操作码的异常(#ND)(见表11-1)。所以如果IA-32处理器要想利用MMX技术,EM标志必须设置为0以便于MMX指令的执行。对于SSE和SSE2扩展也是一样,当EM为1时,大多数SSE和SSE2指令的执行都会产生一个非法操作码异常(#UD)(见表12-1)。所以如果IA-32处理器要想利用SSE和SSE2扩展,EM就必须置为0以便于运行这些指令。不受EM的值影响的SSE和SSE2指令有PAUSE、REFETCHh、SFENCE、LFENCE、MFENCE、MOVNTI和CLFLUSH指令。
MP 监测协处理器(CR0的位1)控制WAIT(或者FWAIT)指令与TS标志(CR0的位3)的相互作用。如果MP标志是1,WAIT指令将会“设备不可使用”的异常(#NM)如果TS标志是1。如果MP标志是0,WAIT指令就会忽略TS标志的值。表9-2列出了这个标志的推荐设置,这些设置是根据IA-32处理器和系统中是否有x87 FPU或协处理器而进行的。表2-1列出了MP、EM和TS标志的相互作用。
PE 启用保护模式(CR0的位0)置1时启用保护模式,置0时启用实模式。这个标志并不直接启用分页机制。它只是启用了段级保护。要是启用分页机制,必须将PE和PG标志都设为1。参见9.9节“模式切换”中利用PE标志在实模式与保护模式之间进行切换。
PCD 禁用页级缓存(CR3的位4)控制当前页目录是否缓存。置1时禁止页目录缓存,置0启用页目录缓存。这个标志只影响处理器内部缓存(L1和L2都存在的情况下)。如果没有启用分页机制 (CR0中的PG标志置0)或者CR0中的CD(禁用缓存)标志置0,处理器将忽略这个标志。第10章内存缓存控制 中有关于这个标志的详细说明。参见3.7.6节“页目录和页表项”对PCD标志在页目录和页表项协作的详细信息。
PWT 页级透明写(CR3中的位3)控制着当页目录的直写或回写的缓存机制。如果PWT标志置1,则用直写,置0启用回写缓存。这个标志只影响内部缓存(在L1和L2都存在的情况下),如果没有启用分页机制(CR0中的PG标志为0)或者CR0中的CD(禁用缓存)标志为1,处理器将忽略这个标志。参见10.5节“缓存控制”中对这个标志的详细介绍。参见3.7.6节“页目录页表项” 对PCD标志在页目录和页表项协作的详细信息。
VME
虚拟8086模式扩展(CR4中的位0)置1时则在虚拟8086模式下,启用中断和异常处理扩展。置0时禁用扩展功能。虚拟模式扩展的应用是通过减少虚拟8086监控程序对8086程序执行过程中出现的中断和异常的处理,并且重定向中断和异常到8086程序的处理程序,从而改进虚拟8086模式下应用程序的性能。对于虚拟中断标志(VIF)它也提供了硬件支持来改进在多任务及多处理器环境下执行8086程序的可靠性。参见16.3“虚拟8086模式下的中断和异常处理”中对这一特征使用方法的详细论述。
PVI
保护模式下的虚拟中断(CR4中的位1)置1时对于虚拟中断标志(VIF)在保护模式下启用硬件支持,置0时在保护模式下禁用VIF标志。参见16.4“保护模式下虚拟中断“中对这一特征用法的详细论述。
TSD
禁用时间戳(CR4中的位2)。置1时将限制运行在0级特权下的程序执行RDTSC指令。置0时则允许任何特权程序执行这一指令。
DE
调试扩展功能(CR4的位3)置1时,对调试寄存器DR4和DR5的引用会引起一个未定义的操作码(#UD)异常;置0时为了与运行在早期IA-32处理器上面的程序兼容,处理器会混淆对DR4和DR5的引用。参见15.2.2节“调试寄存器DR4和DR5”中对这一标志的详细说明。
PSE
页尺寸扩展(CR4中的位4 )置1时页大小为4M字节,置0时页大小为4K字节。参见3.6.1节“页选项”中对这个标志用法的介绍。
PAE
物理地址扩展(CR4中的位5)置1时启用分页机制来引用36位物理地址;置0时只可引用32位地址。参见3.8节“用PAE分页机制实现36位物理地址访问”中对物理地址扩展的详细说明。
MCE
启用机器检测(CR4中的位6)置1时启用机器检测(machine-check)异常,置0时禁用机器检测异常。参见第14章“机器检查架构”中对机器检查异常和机器检查架构的详细说明。
PGE
启用全局页(CR4中的位7)(在P6系列处理器中引入)置1时启用全局页,置0时禁用全局页。全局页这一特征能够使那些经常被使用或共享的页对所有的用户标志为全局的(通过页目录或者页表项中的第8位-全局标志来实现)。在任务切换或者往CR3寄存器写时,全局页并不从TLB中刷新。当启用全局页这一特征时,在设置PGE标志之前,必须先启用分页机制(通过设置CR0中的PG标志)。如果将这个顺序颠倒了,可能会影响程序的正确性以及处理器的性能会受损。参见3.11节“转换查找缓冲区TLB”中对这一位的详细使用。
PCE
启用性能监测计数器(CR4中的位8)置1时,允许RDPMC指令执行,不论程序运行哪个特权级别。置0时RDPMC指令只能运行在0级特权上。
OSFXSR 操作系统对FXSAVE和FXRSTOR指令的支持(CR4中的位9)置1时,这一标志具有下列
功能:(1)表明操作系统支持FXSAVE和FXRSTOR指令(2)启用FXSAVE和FXRSTOR指令来保存和恢复XMM和MXCSR寄存器连同x87 FPU和MMX寄存器的内容(3)允许处理器执行除了PAUSE、PREFETCHh、SFENCE、LFENCE,MFENCE、MOVNTI和CLFLUSH指令之外的任何SSE和SSE2指令。如果这一标志置0,则FXSAVE和FXRSTOR指令保存和恢复x87 FPU和MMX寄存器的内容,但可能不保存和恢复XMM和MXCSR寄存器的内容。另外,如果这一标志置0,当处理器企图执行除了PAUSE、PREFETCHh、SFENCE、LFENCE、MFENCE、 MOVNTI和CLFLUSH指令之外的任何SSE和SSE2指令时,都将会产生一个非法操作码异常(#UD),操作系统必须正确地设置这一标志。
注意:
CPUID特征标志FXSR、SSE和SSE2(位24、25、26)分别表示在特定的IA-32处理器上,是否具有FXSAVE/FXRESTOR指令,SSE扩展以及SSE2扩展。OSFXSR位则为操作系统启用这些特征提供了途径以及并指明了操作系统是否支持这些特征。
OSXMMEXCPT
操作系统支持未屏蔽的SIMD浮点异常(CR4中的位10),表明操作系统通过异常处理程序支持非屏蔽的SIMD浮点异常的处理,该异常处理程序在SIMD浮点异常产生时被调用。操作系统必须正确的设置这一标志,如果这一标志没有设置,当处理器检测到非屏蔽SIMD浮点异常时,将会产生一个非法操作码异常(#UD)
分页(CR0的31位)
置1启用分页,置0不启用分页。当禁用分页时,所有的线性地址都可以当作物理地址对待。如果PE标志(CR0中位0)没有置1,PG标志将不起作用,实际上,如果在PE标志为0的情况下,将PG标志置1会产生一个一般保护异常(#GP)。见3.6节“分页(虚拟内存)概况”对处理器分页机制的详细说明。
CD
禁用高速缓存(CR0的位30)当CD和NW标志为0时,处理器中内部(和外部)内存位置的高速缓存将启用。当CD标志置1时,高速缓存将会被禁用,如表10-5所示。为阻止处理器访问和修改它的高速缓存,必须将CD标志置1并且使缓存失效,这样就不会命中高速缓存了(见10.5.3节“阻止高速缓存”)见10.5节“高速缓存控制”对于选中的页或者内存位置的高速缓存限制的详细描述
NW
不直写(CR0位29)当NW和CD标志都置0时,回写(即write-back,主要是对 Pentium 4、Intel Xeon、P6系列、和Pentium处理器而言)或直写(即write-through,对Intel486处理器而言)被用来写命中缓存时的数据,并且启用失效循环。表10-5详细介绍了NW标志在高速缓存方面对CD和NW设置的影响。
AM
对齐屏蔽(CR0的位18)置1时启用自动对齐检查,置0时禁用对齐检查。对齐检查只有在AM标志、EFLAGES中的AC标志置1时并且CPL是3、处理器运行在保护模式下或者虚拟8086方式下才进行,
WP
写保护(CR0的位16)置1时禁止管理级的过程往用户级只读页中写,置0时允许管理级的过程往用户级只读页中写。这个标志是用来在创建(forking)一个新进程时实现写拷贝(COW-copy on write),在UNIX操作系统中就是如此。
NE
数值错误(CR0中的位5)置1时启用原生的(内部的)x87FPU错误报告机制,置0时启用类PC的x87FPU错误报告机制。当NE标志置0且检查(ASSERT)IGNNE#输入时,一个未屏蔽处理的x87FPU错误,会引起处理器检查FERR#针来产生一个外部中断,并且在执行下一条等待浮点指令或WAIT/FWAIT指令之前,立即停止指令的执行。FERR#针是用来驱动输入到外部中断控制器的(FERR#模拟intel 287和intel387DX数学处理器的ERROR#针的)。NE标志、IGNNE#针和FERR#针和外部逻辑一起被用来实现类PC的错误报告机制的(参见第8章“软件异常处理”和卷1中的附录D中关于x87 FPU错误报告机制,以及当FERR#针在被检查(ASSERT)时,具体实现所依赖的东西)。
ET
扩展类型(CR0的位4)在Pentium 4、Intel Xeon、P6系列、和Pentium 处理器中为保留位,被硬编码为1。在intel 386和intel486处理器中,这个标志置1表示对intel 387DX数学协处理器指令的支持。
TS 任务切换(CR0的位3)允许当一个任务切换延迟至x87 FPU、MMX、SSE或SSE指令被新任务执行时,保存x87 FPU,MMX,SSE和SSE2的上下文。处理器在每次任务切换时设置该位,并且当执行x87 FPU,MMX,SSE和SSE2指令时测试该位。 z 如果TS标志置1并且EM标志(CR0的位2)置0时,那么在x87 FPU、MMX、SSE和
SSE2指令执行前, “设备不可使用”异常(#NM)会产生,但是这些指令并不包括PAUSE、PREFETCHh、SFENCE、LFENCE、MFENCE、MOVNTI和CLFLUSH指令。(参见WAIT/FWAIT指令下的相关叙述)
如果TS标志置1并且MP标志(CR0的位1)和EM标志都置0时,那么在执行x87 FPU WAIT/FWAIT指令之前#NM异常并不会产生。
如果EM标志置1,TS标志的值对x87 FPU、MMX、SSE和SSE2指令的执行就没有什么影响。
表2-1列出了处理器遇到x87 FPU指令时,根据TS、EM、MP标志的值所作出的不同反应。表11-1和12-1列出了处理器分别遇到MMX和/或SSE或SSE2指令时,所作出的反应。
处理器在进行任务切换时并不会自动保存x87 FPU、XMM、和MXCSR寄存器的内容。相反地处理器将TS标志置为1,这样在新任务的指令流中,无论处理器何时遇到x87 FPU、MMX、SSE或SSE2 指令(前面列出的指令除外),就会引起#NM异常。 #NM异常处理程序可以用来清除TS标志(用CLTS指令)并且保存x87 FPU、XMM的上下文和MXCSR寄存器。如果任务从未遇到x87 FPU、MMX、SSE或者SSE2指令,那么x87 FPU、MMX、SSE和SSE2的上下文就从不保存。
EM 仿真(CR0的位2)置1时表明处理器没有内部或者外部的x87 FPU,置0时表明有x87 FPU。这个标志也影响MMX、SSE和SSE2指令的执行。当EM为1时x87指令的执行会产生一个“设备不可使用”的异常(#NM)。当处理器没有x87 FPU或者没有连接到外部数学协处理器时,必须将该位置为1。设置该位将强制所有的浮点指令由软件仿真。表9-2根据IA-32处理器和x87 FPU或者系统中有的数学协处理器,列出了该标志的推荐值。表2-1列出了EM、MP和TS标志的相互影响。另外当EM标志为1时,执行MMX指令将会产生个非法操作码的异常(#ND)(见表11-1)。所以如果IA-32处理器要想利用MMX技术,EM标志必须设置为0以便于MMX指令的执行。对于SSE和SSE2扩展也是一样,当EM为1时,大多数SSE和SSE2指令的执行都会产生一个非法操作码异常(#UD)(见表12-1)。所以如果IA-32处理器要想利用SSE和SSE2扩展,EM就必须置为0以便于运行这些指令。不受EM的值影响的SSE和SSE2指令有PAUSE、REFETCHh、SFENCE、LFENCE、MFENCE、MOVNTI和CLFLUSH指令。
MP 监测协处理器(CR0的位1)控制WAIT(或者FWAIT)指令与TS标志(CR0的位3)的相互作用。如果MP标志是1,WAIT指令将会“设备不可使用”的异常(#NM)如果TS标志是1。如果MP标志是0,WAIT指令就会忽略TS标志的值。表9-2列出了这个标志的推荐设置,这些设置是根据IA-32处理器和系统中是否有x87 FPU或协处理器而进行的。表2-1列出了MP、EM和TS标志的相互作用。
PE 启用保护模式(CR0的位0)置1时启用保护模式,置0时启用实模式。这个标志并不直接启用分页机制。它只是启用了段级保护。要是启用分页机制,必须将PE和PG标志都设为1。参见9.9节“模式切换”中利用PE标志在实模式与保护模式之间进行切换。
PCD 禁用页级缓存(CR3的位4)控制当前页目录是否缓存。置1时禁止页目录缓存,置0启用页目录缓存。这个标志只影响处理器内部缓存(L1和L2都存在的情况下)。如果没有启用分页机制 (CR0中的PG标志置0)或者CR0中的CD(禁用缓存)标志置0,处理器将忽略这个标志。第10章内存缓存控制 中有关于这个标志的详细说明。参见3.7.6节“页目录和页表项”对PCD标志在页目录和页表项协作的详细信息。
PWT 页级透明写(CR3中的位3)控制着当页目录的直写或回写的缓存机制。如果PWT标志置1,则用直写,置0启用回写缓存。这个标志只影响内部缓存(在L1和L2都存在的情况下),如果没有启用分页机制(CR0中的PG标志为0)或者CR0中的CD(禁用缓存)标志为1,处理器将忽略这个标志。参见10.5节“缓存控制”中对这个标志的详细介绍。参见3.7.6节“页目录页表项” 对PCD标志在页目录和页表项协作的详细信息。
VME
虚拟8086模式扩展(CR4中的位0)置1时则在虚拟8086模式下,启用中断和异常处理扩展。置0时禁用扩展功能。虚拟模式扩展的应用是通过减少虚拟8086监控程序对8086程序执行过程中出现的中断和异常的处理,并且重定向中断和异常到8086程序的处理程序,从而改进虚拟8086模式下应用程序的性能。对于虚拟中断标志(VIF)它也提供了硬件支持来改进在多任务及多处理器环境下执行8086程序的可靠性。参见16.3“虚拟8086模式下的中断和异常处理”中对这一特征使用方法的详细论述。
PVI
保护模式下的虚拟中断(CR4中的位1)置1时对于虚拟中断标志(VIF)在保护模式下启用硬件支持,置0时在保护模式下禁用VIF标志。参见16.4“保护模式下虚拟中断“中对这一特征用法的详细论述。
TSD
禁用时间戳(CR4中的位2)。置1时将限制运行在0级特权下的程序执行RDTSC指令。置0时则允许任何特权程序执行这一指令。
DE
调试扩展功能(CR4的位3)置1时,对调试寄存器DR4和DR5的引用会引起一个未定义的操作码(#UD)异常;置0时为了与运行在早期IA-32处理器上面的程序兼容,处理器会混淆对DR4和DR5的引用。参见15.2.2节“调试寄存器DR4和DR5”中对这一标志的详细说明。
PSE
页尺寸扩展(CR4中的位4 )置1时页大小为4M字节,置0时页大小为4K字节。参见3.6.1节“页选项”中对这个标志用法的介绍。
PAE
物理地址扩展(CR4中的位5)置1时启用分页机制来引用36位物理地址;置0时只可引用32位地址。参见3.8节“用PAE分页机制实现36位物理地址访问”中对物理地址扩展的详细说明。
MCE
启用机器检测(CR4中的位6)置1时启用机器检测(machine-check)异常,置0时禁用机器检测异常。参见第14章“机器检查架构”中对机器检查异常和机器检查架构的详细说明。
PGE
启用全局页(CR4中的位7)(在P6系列处理器中引入)置1时启用全局页,置0时禁用全局页。全局页这一特征能够使那些经常被使用或共享的页对所有的用户标志为全局的(通过页目录或者页表项中的第8位-全局标志来实现)。在任务切换或者往CR3寄存器写时,全局页并不从TLB中刷新。当启用全局页这一特征时,在设置PGE标志之前,必须先启用分页机制(通过设置CR0中的PG标志)。如果将这个顺序颠倒了,可能会影响程序的正确性以及处理器的性能会受损。参见3.11节“转换查找缓冲区TLB”中对这一位的详细使用。
PCE
启用性能监测计数器(CR4中的位8)置1时,允许RDPMC指令执行,不论程序运行哪个特权级别。置0时RDPMC指令只能运行在0级特权上。
OSFXSR 操作系统对FXSAVE和FXRSTOR指令的支持(CR4中的位9)置1时,这一标志具有下列
功能:(1)表明操作系统支持FXSAVE和FXRSTOR指令(2)启用FXSAVE和FXRSTOR指令来保存和恢复XMM和MXCSR寄存器连同x87 FPU和MMX寄存器的内容(3)允许处理器执行除了PAUSE、PREFETCHh、SFENCE、LFENCE,MFENCE、MOVNTI和CLFLUSH指令之外的任何SSE和SSE2指令。如果这一标志置0,则FXSAVE和FXRSTOR指令保存和恢复x87 FPU和MMX寄存器的内容,但可能不保存和恢复XMM和MXCSR寄存器的内容。另外,如果这一标志置0,当处理器企图执行除了PAUSE、PREFETCHh、SFENCE、LFENCE、MFENCE、 MOVNTI和CLFLUSH指令之外的任何SSE和SSE2指令时,都将会产生一个非法操作码异常(#UD),操作系统必须正确地设置这一标志。
注意:
CPUID特征标志FXSR、SSE和SSE2(位24、25、26)分别表示在特定的IA-32处理器上,是否具有FXSAVE/FXRESTOR指令,SSE扩展以及SSE2扩展。OSFXSR位则为操作系统启用这些特征提供了途径以及并指明了操作系统是否支持这些特征。
OSXMMEXCPT
操作系统支持未屏蔽的SIMD浮点异常(CR4中的位10),表明操作系统通过异常处理程序支持非屏蔽的SIMD浮点异常的处理,该异常处理程序在SIMD浮点异常产生时被调用。操作系统必须正确的设置这一标志,如果这一标志没有设置,当处理器检测到非屏蔽SIMD浮点异常时,将会产生一个非法操作码异常(#UD)