如何添加一个系统调用?
- 在
user/user.h
中添加系统调用的跳板函数
跳板函数可能和内核函数同名,但别搞混,跳板函数是为了跳到user/usys.S
文件下,陷入系统调用,也即让用户态切换到内核态,向内核传递需要调用的内核函数编号 user/usys.S
文件是通过脚本生成的,需要在user/usys.pl
脚本文件中添加一条语句,具体参考已有的语句- 在
kernel/syscall.h
文件中新增内核函数编号 - 在
kernel/syscall.c
文件中新增内核函数指针,以及内核函数声明 - 根据内核函数的作用,在相应的函数实现文件下实现该内核函数
用户进程和系统进程之间如何传递参数?
- 跳板函数的参数会被依次写入到
trapframe
a0 a1
……中,第一个参数对应a0
,第二个参数对应a1
- 参数的形式一般只有 int、指针、字符串等,可以通过
argint()
、argaddr()
、argstr()
函数获取 - 通过
copyout()
从内核拷贝到用户进程页表里