RV64系统ecall执行后a1寄存器的状态假设与编译器问询
RV64系统调用中
a1寄存器的安全假设与编译器处理 用户态调用约定不适用于内核态系统调用执行,执行ecall指令后,仅作为返回寄存器的a0和a1会被返回值覆盖,其余寄存器(包括调用者保存的t寄存器及其他a系列寄存器)均不会被破坏。在RV32系统中,a1用于存储64位返回值的高32位,a0存储低32位。针对RV64系统的相关问题,解答如下:
对a1寄存器的安全假设
- 目前RV64的所有系统调用返回值均不超过64位,可完全存入
a0寄存器;返回结构体的系统调用实际返回的是指向该结构体的64位指针,同样存入a0。从功能需求层面,a1不会被用来存储返回值的任何部分。 - 但必须将
a1视为已被破坏——即使当前系统调用不需要用它存储返回值,也不能假设ecall执行后a1的原值会被保留。
编译器的处理逻辑
编译器对系统调用的处理遵循统一规则,不会根据具体系统调用的返回类型来判断a1是否会被破坏。只要是执行ecall指令,编译器就会默认a1属于会被内核修改的寄存器范畴,不会依赖其原值执行后续代码。
内容的提问来源于stack exchange,提问作者SilenceDesigner
相关产品推荐
相关产品推荐

