[实现上下文环境保存与恢复] · GitBook
https://rcore-os.github.io/rCore_tutorial_doc/chapter3/part4.html
(实际上就是一堆寄存器的值,具体内容在[part3 中描述的中断帧(TrapFrame)结构体][part3.md]中有详细定义)这个超链接跪了
@heheda12345 (实际上就是一堆寄存器的值,具体内容在[part3 中描述的中断帧(TrapFrame)结构体][part3.md]中有详细定义)这个超链接跪了
感谢勘误,已修改。
请问为何在save all里面保存了stval scause这些csr,而在restore all里面却不还原它们?那这样store的意义何在呢?
请问为何在save all里面保存了stval scause这些csr,而在restore all里面却不还原它们?那这样store的意义何在呢?
因为内核的 Rust 代码部分会需要读取这些 CSR。
@jiegec
请问为何在save all里面保存了stval scause这些csr,而在restore all里面却不还原它们?那这样store的意义何在呢?
因为内核的 Rust 代码部分会需要读取这些 CSR。
这点明白,但我的意思是为什么不在restore里面还原这几个寄存器?是不是因为还原了也没有意义?
因为这些寄存器在下次trap的时候会被硬件写入,所以还原了也没有意义。
@jiegec
请问为何在save all里面保存了stval scause这些csr,而在restore all里面却不还原它们?那这样store的意义何在呢?
因为内核的 Rust 代码部分会需要读取这些 CSR。
这点明白,但我的意思是为什么不在restore里面还原这几个寄存器?是不是因为还原了也没有意义?
代码片段里有两处小的语法问题,照抄会导致编译失败:第一个片段.section.text遗漏了空格,应为.section .text;第二个片段开头.equ XLENB 8遗漏了逗号,应为.equ XLENB, 8。
第一段代码"__trapret"处好像少了一个":"
另外还需要提一个点:__alltraps的地址应该是4字节对齐的。
在 https://docs.opentitan.org/doc/rm/asm_coding_style/ 中提及,不建议使用 .align,似乎因为这在不同架构下解释不同,我在 RISC-V 的手册中看到 .align 2 的意思是按 $2^2=4$ 字节对齐,所以实际上文中的写法是按 16 字节对齐的?
这种场景下建议使用 .balign 4
为什么保留TrapFrame开辟了36个8字节的占空间,存储最后一个寄存器时store s4, 35 而不是store s4, 36?