RISC-V中断例程:无需通用寄存器交换sp与sscratch可行吗?
RISC-V U模式转S模式中断:无通用寄存器交换sp与sscratch的实现
直接用RISC-V的csrrw指令就能完成,不需要额外通用寄存器,也完全不碰用户栈,完美匹配你的需求。
具体指令
csrrw sp, sscratch, sp
指令工作原理
csrrw是RISC-V专门的控制状态寄存器读写指令,执行过程是原子性的:
- 先把
sscratch里的当前值(即你预存的内核栈指针)读取到sp; - 再把当前
sp的值(用户栈指针)写入sscratch。
两步执行完成后,sp和sscratch的值就完成了交换:
- 此时
sp指向内核栈,你可以直接用它来压入所有32个通用寄存器; sscratch暂存了用户栈指针,后续恢复上下文时,再执行一次同样的指令即可换回。
适配场景的合理性
- 无需额外通用寄存器:整个交换过程仅用到
sp和sscratch,没有占用其他需要保存的通用寄存器,不会破坏用户上下文; - 不依赖用户栈:全程未对用户栈进行任何操作,完全不用考虑用户栈的可用空间问题。
内容的提问来源于stack exchange,提问作者mdjukan
相关产品推荐
相关产品推荐

