上一次介绍了AMD64位模式的基本概要,从现在开始,我每期详细介绍其中的一项。
系统资源(1)
系统控制寄存器
CR0
64位,低32位与IA32相同,高32位保留,必须是0,除ET位是只读位,其它都是可读可写。
位0,PE,PE=1启用保护模式,PE=0,禁止保护模式。当处理器启用保护模式时,启用段保护机制。
位1,MP,软件用MP位和任务切换控制位CR0.TS以控制WAIT/FWAIT指令的执行是否按如下方式进行:
如果CR0.MP=1,CR0.TS=1,执行WAIT/FWAIT指令,引起设备不可用异常#NM
如果CR0.MP=0或CR0.TS=0,执行WAIT/FWAIT指令,正常运行。
如果使用X87指令,软件一般会将CR0.MP=1,这样当X87指令上下文作为任务切换的结果保存时,TS位起完全控制作用。
位2,EM,EM=1,所有X87指令引起设备不可用异常#NM,执行任意64位或128位媒体指令将引起无效操作码异常#UD
目的在于当处理器不支持X87,64位,128位媒体指令时,可以用异常出来程序实现这些功能。
位3,TS,当发生硬件任务切换时,自动设置TS=1,用软件实现任务切换时仍然可以用TS位来控制X87和媒体指令单元的上下文保存,
这时,任务管理软件在任务切换期间用MOV CR0 设置TS=1.通过执行CLTS指令直接清除CR0.TS位。
64位模式不支持硬件任务切换。
位4,ET,只读位,早期X86处理器ET=1表示支持387DX数字协处理器,现在的处理器保留此位,必须是0.
位5,NE,NE=0,禁止X87浮点异常的内部控制,启用外部控制。此时IGNNE#输入信步控制浮点异常是否被忽略,由如下条件决定:
当IGNNE#=1,X87浮点异常被忽略
当IGNNE#=0,浮点异常通过就将FERR#输入信号设置为1报告,外部逻辑使用FERR#信号作为一个外部中断。
当NE=1时,X87浮点异常报告内部控制启用,外部报告机制被禁止。推荐软件将NE=1,这允许在处理X87浮点异常时优化性能。
位16,WP,WP=1,禁止管理级软件对用户级的只读页进行写操作,WP=0,管理级软件可以对用户级只读页进行写操作。
位18,AM,当AM=1,EFLAGS.AC=1,软件启用自动对齐检查
当AM或EFLAGS.AC=0时,禁止软件启用自动对齐检查,
当启用自动对齐检查并且CPL=3时,对未对齐的操作数的内存引用,引起未对齐异常保护#AC
位29,NW,NW=0,启用缓存回写,此时只在写丢失和写至共享行时,更新内存。NW=0允许缓存无效。
NW=1,缓存写通启用,此时所有的写操作包括在缓存中命中的操作都将更新内存,不允许缓存无效作为偷窃周期的结果,允许用WBINVD和INVD指令使缓存无效。当CD位=0,如果此时设在NW=1引起通用保护异常#GP
位30,CD,CD=0,内部缓存启用,CD=1,无新进的数据或指令进入内部缓存,但在以下情况下,仍然会访问缓存:
命中内部缓存的读操作将从内部缓存读取数据,并报告命中
命中内部缓存的写操作将引起报告命中的缓存行写回内存且在缓存无效。
当CD=1时,缓存丢失不影响内部缓存,软件可以在CD位设置为1之前能由写回和无效缓存阻止缓存访问。
当启用分页时,将CD位设置为1时,处理器忽略页缓存控制位PWT和PCD。
位31,PG位,PG=1,启用页转换,PG=0禁止页转换。只有在保护模式中才能启用页转换,所以进入64位模式之前,必须现进入保护模式。
当PE=0时,设置PG=1,引起通用异常保护#GP
位28-19,位17,位15-6,位63-32系统保留,必须是0,在64位模式中如果位63-32不是0,将引起通用异常保护#GP
以上说明各个位的作用 。有的措辞可能不准确,还请高手指教解释。