什么是计算机体系结构中的保护执行?
保护执行是一种至少部分消除条件分支的方法。其思想是在体系结构中引入条件操作指令,并使用它们来替换条件分支。条件操作指令称为保护指令。保护指令由两部分组成,一部分是称为保护的条件部分,另一部分是传统的指令操作部分。例如,它可以表示为:
(guard) instruction
保护指令的执行取决于以下条件:如果指定的保护为真,则执行关联的指令;如果保护结果为假,则指令的行为类似于 NOP。
例如,α 体系结构提供了条件移动指令,这些指令是保护指令,具有以下语法和语义 (DEC,1992):
cmovxx ra.rq, rb.rq, rc.wq cmovxx ra.rq, #b.ib, rc.wq
其中
xx 表示条件
ra.rq 是一个整数,存储在寄存器 ra 中的只读 64 位操作数
rb.rq 是一个整数,存储在寄存器 rb 中的只读 64 位操作数
rc.wq 是一个整数,存储在寄存器 rc 中的只写 64 位操作数
#b.ib 是一个整数 64 位字面量
此指令的操作如下。测试寄存器 ra。
指令助记符指定了保护执行的条件:
cmoveq // 如果寄存器 ra 的内容等于零,则 cmove
cmovge // 如果寄存器 ra 的内容大于或等于零,则 cmove
cmovgt // 如果寄存器 ra 的内容大于零,则 cmove
cmovlbc // 如果寄存器 ra 的低位为清零,则 cmove
cmovlbs // 如果寄存器 ra 的低位已设置,则 cmove
cmovle // 如果寄存器 ra 的内容小于或等于零,则 cmove
cmovlt // 如果寄存器 ra 的内容小于零,则 cmove
cmovne // 如果寄存器 ra 的内容不等于零,则 cmove
可以使用与相应条件分支中指定的条件相反的保护指令消除前向条件分支。例如,考虑以下代码序列
beq ra, label // if (ra)=0 branch to ‘label’ or rb, rb, rc // else move (rb) into rc
SPARC V9(1994)也提供了一些类似的条件移动指令。HP Precision Architecture(1985)以比 DEC α 更全面的方式引入了保护指令。在这里,所有整数操作指令都是以下形式的保护指令
opcode.cond operands
给定的条件 (cond) 与操作的结果相关。如果指定的条件为真,例如,结果为正,则以下指令将被取消。
有两种类型的保护执行,例如完全保护和受限保护。在完全保护中,所有指令都被假定为受保护的,而在受限保护中,只有操作指令(ALU 指令)具有受保护的形式。
这种受限形式的保护考虑了这样一个事实,即在现有的体系结构中,指令代码空间通常受到挤压,并且在大多数情况下,只有少数几个额外的位可用于指定保护条件。