EFI:Itanium 的 BIOS
Itanium 的 BIOS 并不是您通常熟悉的个人计算机的 BIOS。可扩展固件接口 (EFI) 是将操作系统从 BIOS 和硬件中分离出来的抽象层。EFI Shell 与 Windows 中的命令提示符很相似。在某些方面,EFI Shell 就像是一个内置的小型操作系统。从 EFI Shell,您可以访问驱动器(包括 CD-ROM)、运行可执行文件(例如 Windows 的安装程序),甚至可以执行简单的文本编辑。系统配置数据存储在非挥发性内存中,而不是存储在硬盘上,并且可以通过 EFI Shell 进行配置。
EPIC:Intel 的顺序处理器
Itanium 是一种顺序处理器,意味着它会以指令提供的顺序来执行这些指令。这与普通的 x86 处理器不同,x86 处理器在可能的情况下会在管线中重新排序指令,然后尝试并行执行指令。对于 Itanium 而言,编译器必须明确地排序指令,然后负责检查指令之间的相互依存关系。编译器还必须负责通知处理器可以并行执行的指令。Intel 有一个为此定义的新术语:EPIC。EPIC 表示明确并行指令集计算。它负责编译器执行所有优化。处理器将不会进行任何重新排序。这使得编译器责任更加重大,稍后将在本文中进行讨论。
执行单元
Itanium 由九个执行单元组成,如下所示:
• |
两个整数单元 |
• |
两个整数/负载存储单元 |
• |
两个浮点单元 |
• |
三个分支单元 |
Itanium 具有一个十阶管线,负责提取、解码和执行指令。Itanium 最多可以同时处理六条指令。
寄存器
Itanium 具有多达 328 个寄存器:128 个 64 位整数通用寄存器、128 个 82 位浮点寄存器、64 个 1 位谓词寄存器、8 个分支寄存器以及用于各种目的的其他寄存器的集合,例如 x86 后向兼容性(当运行在 x86 兼容模式中时,Itanium 会将一些 x86 寄存器映射到 64 位寄存器上,同时提供专门用于处理器的 x86 模式的其他寄存器)。
要协助管理如此大量的寄存器,Itanium 有能力同时设计和轮换寄存器。我们将通用寄存器分成两组:前 32 个寄存器是固定的、全局寄存器。后 96 个寄存器可以用于设计和轮换。
寄存器设计
ALLOC 指令用于建立寄存器框架。寄存器框架将物理寄存器(硬件)映射到逻辑寄存器(软件)上,这样当调用某个函数时,不再需要推出或弹出所有参数,编译器就可以为子例程分配一定范围的寄存器,其中的一些寄存器可能会映射到父例程的寄存器上。可以在两者之间重叠的寄存器用于传递参数。这样比将参数推出和弹出到堆栈上更为有效。当然,推出和弹出参数的传统方法仍然可以使用。
由于前 32 个寄存器是固定的,您无法设计它们。因此,可以设计的寄存器的最大数量为(其余的)96 个寄存器。另外,只有整数寄存器可以设计,浮点寄存器和谓词寄存器不能进行设计。
寄存器轮换
寄存器也可以轮换或转移到一个或多个位置。在解开循环时,这可能很有帮助,因此使用不同的物理寄存器,在不相互干预的情况下,那些周而复始地在相同的寄存器集中运行的循环可以同时运行。利用这个选项,编译器可以更进一步改进指令的并行处理。
指令集
IA-64 指令是 41 位长的指令。指定 128 个通用寄存器中之一需要使用七位,并且指定两个源寄存器和一个目标寄存器,一共是 21 位。每条指令可以指定 64 个谓词寄存器中的一个,再加上 6 位。这占用了 27 位,而我们尚未指定实际的操作代码。
指令封装到 128 位的“绑定”中。其中三条指令(123 位),再加上 5 位模板字段。然后,这些绑定会被汇编到“组”中。组是理论上可以同时执行的指令集合。组中的指令没有相互依存关系。在编译时,编译器必须对此进行计算并对绑定一起分组。处理器将不会再次检查编译器的工作,所以编译器必须保证其正确。组可以是任意的长度。模板字段中的一位表示组的结束。
绑定和组是不同的。绑定是指令分派到处理器的方式。Itanium 的总线和解码电路为 128 位宽,刚好用于 3 条指令(Itanium 实际上同时分派两个绑定)。组是指令进行交互的逻辑方式。