用户空间下的调用syscall,如read(), write(),fork(),都会被编译成汇编指令
即把系统调用号传入a7,紧跟一条ecall指令。所有的用户空间的系统调用都只完成这些工作。
而ecall指令会将user mode换为supervisor mode,保存当前pc寄存器的值(因为系统调用结束后我们会回来继续执行),并把trampoline page的首地址送pc寄存器。接下来就是执行trampoline的代码。
trampoline的代码是用汇编写的,在kernel/trampoline.S中。这些代码主要完成三个工作,1.保存通用寄存器的值。2.切换到内核页表,栈指针指向内核栈,准备好执行usertrap代码 3.跳转到usertrap