【发布时间】:2015-05-28 10:00:42
【问题描述】:
我一直在浏览 OS/161 中关于如何执行系统调用的代码。据我所知,系统调用(例如reboot())实际上是由 OS/161 内核转换为对sys_reboot() 的调用。同样,对fork() 的调用将转换为对sys_fork() 的调用。
我的理解正确吗?
谢谢。
【问题讨论】:
标签: os161
我一直在浏览 OS/161 中关于如何执行系统调用的代码。据我所知,系统调用(例如reboot())实际上是由 OS/161 内核转换为对sys_reboot() 的调用。同样,对fork() 的调用将转换为对sys_fork() 的调用。
我的理解正确吗?
谢谢。
【问题讨论】:
标签: os161
每个系统调用都有一个唯一的标识号,在OS161中这些系统调用号定义在kern/include/kern/syscall.h中:
#define SYS_reboot 119
库过程 reboot() 将系统调用号放在寄存器 (v0) 中并向操作系统发出陷阱,系统调用处理程序从汇编语言异常处理程序接收称为陷阱帧的数据结构,其中包含除其他信息外,系统调用号。
这个数字在switch case语句中用于选择函数:
void syscall(struct trapframe *tf)
...
callno = tf->tf_v0;
...
switch (callno) {
case SYS_reboot:
err = sys_reboot(tf->tf_a0);
break;
【讨论】: