RISC-V 32/64 位兼容性问题
RISC-V 32/64-bit compatibility issues
假设您使用 RV32 程序并在 64 位系统上尝试 运行,可能会出现哪些兼容性问题?
据我所知,指令编码是相同的,并且在 RISC-V 上(与其他现代 RISC 架构一样,尽管与 x86 不同),ALU 运算会自动对任何字长进行运算,因此如果您添加一对寄存器的内容,您将根据需要获得 32 位或 64 位加法。加载和存储当然在明确指定的大小上工作,因为它们取决于内存中分配了多少字节。
如果代码依赖于超过 32 的位被丢弃,那么理论上可能会出现兼容性问题,例如将 2^31 添加到自身并将结果与零进行比较。
如果操作系统提供前 4 GB 以外的内存地址,则会出现另一个更实际的问题,当代码将地址存储在 32 位变量中时,这些地址会出现乱码。
我还遗漏了其他问题吗?
关于这两个可能的兼容性问题,您是正确的。
此外,一些控制和状态寄存器(即 cycleh、instreth、timeh)在 RV64I 中不需要,因此不存在。任何试图访问它们的代码都应该出错。
但是,有指令只使用 ALU 运算的低 32 位。这可能会通过替换二进制文件中的操作码和 funct3 来改变。
因此,对于 returns 只有 32 位地址的操作系统模式,只要不使用 cycleh 和朋友,就可以用工作的 64 位版本替换二进制文件。
参考文献 RISC-V Specification v2.2:
- RISC-V 规范第 4 章。 v2.2 概述了从 RV32I 到 RV64I 的差异。
- 第 2.8 章介绍了控制和状态寄存器
- Table 19.3 列出了标准中的所有 CSR。
假设您使用 RV32 程序并在 64 位系统上尝试 运行,可能会出现哪些兼容性问题?
据我所知,指令编码是相同的,并且在 RISC-V 上(与其他现代 RISC 架构一样,尽管与 x86 不同),ALU 运算会自动对任何字长进行运算,因此如果您添加一对寄存器的内容,您将根据需要获得 32 位或 64 位加法。加载和存储当然在明确指定的大小上工作,因为它们取决于内存中分配了多少字节。
如果代码依赖于超过 32 的位被丢弃,那么理论上可能会出现兼容性问题,例如将 2^31 添加到自身并将结果与零进行比较。
如果操作系统提供前 4 GB 以外的内存地址,则会出现另一个更实际的问题,当代码将地址存储在 32 位变量中时,这些地址会出现乱码。
我还遗漏了其他问题吗?
关于这两个可能的兼容性问题,您是正确的。
此外,一些控制和状态寄存器(即 cycleh、instreth、timeh)在 RV64I 中不需要,因此不存在。任何试图访问它们的代码都应该出错。
但是,有指令只使用 ALU 运算的低 32 位。这可能会通过替换二进制文件中的操作码和 funct3 来改变。
因此,对于 returns 只有 32 位地址的操作系统模式,只要不使用 cycleh 和朋友,就可以用工作的 64 位版本替换二进制文件。
参考文献 RISC-V Specification v2.2:
- RISC-V 规范第 4 章。 v2.2 概述了从 RV32I 到 RV64I 的差异。
- 第 2.8 章介绍了控制和状态寄存器
- Table 19.3 列出了标准中的所有 CSR。