Lab2: system calls,
https://pdos.csail.mit.edu/6.S081/2020/labs/syscall.html
这个lab主要为xv6添加新的系统调用
xv6中的系统调用的实现
对于initcode.S,最后需要执行exec系统调用
用来装载可执行程序,可以看到用户代码将exec系统调用
的参数int exec(char *path, char **argv)
分别放入a0与a1寄存器,把系统调用号放入a7寄存器,系统调用号用来匹配系统调用函数表,如果系统调用号是合法的,那么执行对应的系统调用,如果不合法,那就将代表错误的返回值-1放到a0寄存器中,如果系统调用号合法,那么就会去执行对应实现系统调用的内核函数,并将实现系统调用的内核函数的返回值放入a0中,寄存器内容设置好之后,调用ecall指令(ecall是一个硬件指令),这个指令会
- 将user mode改为supervisor mode
- ecall将程序计数器的值保存在了SEPC寄存器。
- STVEC是一个内核寄存器,其中存有
trampoline page
的最开始的地址,但是内核寄存器只有在supervisor mode下才能读写,由于ecall将代码从user mode改为了supervisr mode,ecall便可以使pc指向trampoline page
的最开始,
trampoline page
中的
接下来会执行uservec函数