关于如何执行系统调用,我一直在浏览OS / 161中的代码。从我所看到的,系统调用(例如reboot()
)实际上是由OS / 161内核转换为对sys_reboot()
的调用。同样,对fork()
的调用也会转换为对sys_fork()
的调用。
我的理解是否正确?
感谢。
答案 0 :(得分:1)
每个系统调用都有唯一的标识号,在OS161中,这些系统调用号在kern / include / kern / syscall.h中定义:
#define SYS_reboot 119
库过程reboot()将系统调用号放在寄存器(v0)中并向操作系统发出陷阱,系统调用处理程序从汇编语言异常处理程序接收一个名为trapframe的数据结构,其中包含其他信息,系统电话号码。
此数字用于switch case语句中以选择函数:
void syscall(struct trapframe *tf)
...
callno = tf->tf_v0;
...
switch (callno) {
case SYS_reboot:
err = sys_reboot(tf->tf_a0);
break;