```c
void
syscall(void)
{
int num;
struct proc *p = myproc();
num = p->trapframe->a7; // 从 a7 寄存器获取系统调用号
if(num > 0 && num < NELEM(syscalls) && syscalls[num]) {
p->trapframe->a0 = syscalls[num](); // 执行系统调用并将返回值存在 a0
} else {
printf("%d %s: unknown sys call %d\n",
p->pid, p->name, num);
p->trapframe->a0 = -1;
}
}
```
## 为什么从 a7 寄存器获取系统调用号?
这是用户程序和操作系统内核交互的关键接口。当用户程序需要进行系统调用时:
- 设置系统调用号到 a7
- 触发陷阱(trap)进入内核
- 内核执行这个 syscall() 函数
- 从 a0 获取返回值