链接
目录
用户态和内核态(3种级别)
简单的嵌入式系统(Machine)
安全的嵌入式系统(Machine,User)
类Unix操作系统(Machine,supervisor ,User)
MPP寄存器保存的是上一次状态(M,S,U),MPIE寄存器保存是上一次MIE(也就是中断)
当执行mret 时,将根据这些寄存器恢复中断前的状态。(这是mret干的,不是我们)
当第一次启动时,我们可以通过赋值给这些寄存器到达让系统恢复到我们想要的状态。
备注:中断也无需手动开启,最新代码里也注释了。因为M模式中断比U模式中断优先级高,所以无论全局 MIE 位如何设置,始终全局启用中断。
mhartid寄存器
该寄存器只能在Machine模式下访问,不能在User模式下访问。
启动时User模式
模式的切换
ecall和eret
ecall是主动触发异常
except code:
8:User模式下触发异常
9:S模式下触发异常
11:M模式下触发异常
ecall产生的异常时,epc保存的是ecall指令本身的地址(主要不要死循环)
系统调用的处理流程
ecall 记得要手动 pc+4,因为异常默认返回的是触发异常的指令的地址。(小心死循环)
用户任务调用gethid()的系统调用(初始为User模式)
gethid()中 ,ecall指令发出异常跳转trap_handler()中断处理函数(进入Machine模式)
根据中断码,执行相应的系统调用后返回(恢复tarp前的模式)
参数按规定的寄存器传入传出。
系统调用的传参
系统调用号在a7
a0~a5,其他参数
返回值a0
每一个系统调用都有一个系统调用号
系统调用的封装
我们的系统
syscall.h
usys.S
syscall.c
linux系统
c库
内核