如何在OS / 161中添加新的系统调用?

时间:2013-03-17 23:15:01

标签: c linux operating-system unix os161

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

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

1 个答案:

答案 0 :(得分:1)

添加另一个系统电话号码,例如callno.h中的SYS_print1SYS_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.hread()之类的声明中声明。

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

相关问题