假设您采用RV32程序并尝试在64位系统上运行它,可能会出现哪些兼容性问题?
据我所知,指令编码是相同的,在RISC-V上(和其他现代RISC架构一样,虽然与x86不同),ALU操作可以自动操作任何字大小,所以如果你添加一对内容寄存器,您将获得适用的32位或64位加法。加载和存储当然是在明确指定的大小上工作,因为它们取决于在内存中分配了多少字节。
如果代码依赖于过去32的比特被丢弃,则会出现一个理论上可能的兼容性问题。将2 ^ 31添加到自身并将结果与零进行比较。
如果操作系统提供超出前4千兆字节的内存地址,则会出现另一个更实际的问题,当代码将地址存储在32位变量中时,这将是乱码。
我还缺少其他问题吗?
您对这两种可能的兼容性问题都是正确的。
此外,RV64I中不需要某些控制和状态寄存器(即cycleh,instreth,timeh),因此不存在。尝试访问它们的任何代码都应该出错。
但是,有指令仅使用低32位进行ALU操作。通过替换二进制文件中的操作码和功能3可能会改变这种情况。
因此,对于仅返回32位地址的操作系统模式,只要不使用cycleh和friends,就可以用工作的64位版本替换二进制文件。
参考文献RISC-V Specification v2.2: