0

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

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

4

1 回答 1

1

添加另一个系统调用号,例如SYS_print1在定义callno.h这些常量的位置或SYS_fork位置SYS_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与 withread()等一起声明。

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

于 2013-03-18T02:28:42.500 回答