1

关于如何执行系统调用,我一直在浏览 OS/161 中的代码。据我所知,系统调用(例如reboot())实际上由 OS/161 内核转换为对sys_reboot(). 类似地,调用 tofork()将被转换为调用sys_fork().

我的理解正确吗?

谢谢。

4

1 回答 1

1

每个系统调用都有一个唯一的标识号,在 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;
于 2015-03-25T14:12:15.187 回答