本文主要是介绍mit 6.s081 lab4 Traps,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
chapter 4
trap的类型
- syscall
- exception(除0,访问非法内存)
- interrupt(读/写磁盘操作结束)
trap流程
1.控制权转换给kernel
2.kernel保存寄存器以及状态,以便代码的执行的恢复
3.kernel执行对应的trap处理代码(syscall实现或者设备驱动)
4.kernel恢复之前保存的寄存器和状态,从trap返回执行之前的代码
RISC-V trap相关寄存器
- stvec 记录trap handler的地址
- sepc 用于保存pc,当使用sret指令后将sepc拷贝到pc
- scause 记录trap的yuanyin
- sscratch 方便trap handler启动时记录某些值
- sstatus sstatus中的SIE位控制设备interrupt是否被启用,如果SIE未被启动设备中断会延迟到SIE位被设置。SPP位记录trap时是user mode还是supervisor mode,以及控制sret时返回到哪种模式
trap时RISC-V硬件执行的动作:
1.如果是设备interrupt并且SIE位被清0,不进行以下操作
2.通过对SIE清零关闭中断
3.拷贝pc到sepc
4.保存现在的模式(user或者supervisor)到sstatus的SPP位
5.根据trap的原因设置scause
6.设置为supervisor mode
7.拷贝stvec到pc
8.执行pc中的指向的指令
系统调用过程:
- gdb tips
tui enable #打开多窗口
layout asm #打开汇编窗口
layout reg #打开寄存器窗口
layout src #打开源码窗口
b file:func #对某个文件的某个函数设置断点
print/x $ra #打印寄存器ra
RISC-V assembly
- Which registers contain arguments to functions? For example, which register holds 13 in main’s call to printf?
ai寄存器负责记录函数的传入参数,a2寄存器保存13
- Where is the call to function f in the assemb
这篇关于mit 6.s081 lab4 Traps的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!