【问题标题】:RISC-V 32/64-bit compatibility issuesRISC-V 32/64 位兼容性问题
【发布时间】:2019-08-19 13:45:34
【问题描述】:

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

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

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

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

还有其他我遗漏的问题吗?

【问题讨论】:

    标签: 32bit-64bit riscv


    【解决方案1】:

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

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

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

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

    参考RISC-V Specification v2.2:

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

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 2010-10-21
      • 2023-03-30
      • 1970-01-01
      • 2011-07-20
      • 2013-10-21
      • 1970-01-01
      • 2015-01-06
      相关资源
      最近更新 更多