3

假设您拿了一个 RV32 程序并尝试在 64 位系统上运行它,可能会出现哪些兼容性问题?

据我了解,指令编码是相同的,并且在 RISC-V 上(与其他现代 RISC 架构一样,尽管与 x86 不同),ALU 操作会自动对字长进行操作,所以如果你添加一对寄存器,您将获得适用的 32 位或 64 位添加。加载和存储当然以明确指定的大小工作,因为它们取决于在内存中分配了多少字节。

如果代码依赖于超过 32 位被丢弃,例如将 2^31 添加到自身并将结果与​​零进行比较,则会出现一个理论上可能的兼容性问题。

如果操作系统提供前 4 GB 之外的内存地址,则会出现另一个更实际的问题,当代码将地址存储在 32 位变量中时,就会出现乱码。

我还有其他问题吗?

4

1 回答 1

2

您对这两个可能的兼容性问题都是正确的。

此外,RV64I 不需要某些控制和状态寄存器(即cycleh、instreth、timeh),因此不存在。任何试图访问它们的代码都应该出错。

但是,有指令仅使用低 32 位进行 ALU 运算。通过替换二进制文件中的 opcode 和 funct3 可能会改变它。

因此,对于仅返回 32 位地址的操作系统模式,只要不使用 cycleh 和朋友,就可以用工作的 64 位版本替换二进制文件。

参考RISC-V 规范 v2.2

  • RISC-V 规范的第 4 章。v2.2 概述了从 RV32I 到 RV64I 的区别。
  • 第 2.8 章介绍了控制和状态寄存器
  • 表 19.3 列出了标​​准中的所有 CSR。
于 2019-03-29T09:40:37.053 回答