Administrator
发布于 2023-09-12 / 8 阅读 / 0 评论 / 0 点赞

系统调用

链接

目录

用户态和内核态(3种级别)

  1. 简单的嵌入式系统(Machine)

  2. 安全的嵌入式系统(Machine,User)

  3. 类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,因为异常默认返回的是触发异常的指令的地址。(小心死循环)

  1. 用户任务调用gethid()的系统调用(初始为User模式)

  1. gethid()中 ,ecall指令发出异常跳转trap_handler()中断处理函数(进入Machine模式)

  2. 根据中断码,执行相应的系统调用后返回(恢复tarp前的模式)

  3. 参数按规定的寄存器传入传出。

系统调用的传参

  • 系统调用号在a7

  • a0~a5,其他参数

  • 返回值a0

每一个系统调用都有一个系统调用号

系统调用的封装

我们的系统

  • syscall.h

  • usys.S

  • syscall.c

linux系统

  • c库

  • 内核


评论