【问题标题】:How to add a new system call in OS/161?如何在 OS/161 中添加新的系统调用?
【发布时间】:2013-03-17 23:15:01
【问题描述】:

我正在尝试在我的 OS/161 代码中添加一个新的系统调用,但我无法确定在何处添加原型。我相信您应该将其添加到内核空间和用户空间,但我不确定将原型放入哪些文件。是否有指南解释如何在 OS/161 中添加示例系统调用?

作为测试,我正在尝试添加一个函数 printone(),当用户运行该程序时,它只会打印一个“1”。

【问题讨论】:

  • 那是什么this OS/161
  • printone() 系统调用将写入哪里?您是要提供文件描述符,还是将其写入控制台,还是什么?
  • 看起来至少有两所大学使用 OS/161 作为教学 O/S 的绰号。

标签: c linux operating-system unix os161


【解决方案1】:

添加另一个系统调用号,例如SYS_print1callno.h 中或任何定义了SYS_forkSYS_read 等常量的地方。

找到它们用来选择函数调用的地方,看起来应该是mips_syscall()。虽然,我不确定为什么在这个版本的源代码中只有SYS_reboot 用来调用sys_reboot()。此源代码参考可能不完整。该评论表明:

00049 mips_syscall(struct trapframe *tf)
00050 {
...
00070         switch (callno) {
00071             case SYS_reboot:
00072                 err = sys_reboot(tf->tf_a0);
00073                 break;
00074 
00075             /* Add stuff here */
00076  
00077             default:
00078                 kprintf("Unknown syscall %d\n", callno);
00079                 err = ENOSYS;
00080                 break;
00081         }
...
00108 }

类似地添加您的case SYS_print1: 并在专用函数中实现该功能,例如sys_print1()

这应该是内核方面的。

print1() 的用户模式原型可以在 unistd.h 以及 read() 等中声明。

看起来read() 的用户模式实现可能在程序集文件中。这是合理的,因为最终它应该执行 C 中直接不可用的 MIPS syscall 指令。您应该以类似的方式实现 print1()(将 SYS_print1 加载到适当的寄存器中并执行 syscall)。

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 2015-12-07
    • 2016-06-02
    • 2014-12-20
    • 2016-05-31
    • 2020-06-14
    • 2012-04-16
    • 2014-12-30
    • 2012-04-01
    相关资源
    最近更新 更多