我正在尝试在我的 OS/161 代码中添加一个新的系统调用,但我无法确定在哪里添加原型。我相信您应该将其添加到内核空间和用户空间,但我不确定将原型放入哪些文件中。是否有指南解释如何在 OS/161 中添加示例系统调用?
作为测试,我试图添加一个函数,printone()
当用户运行该程序时,它只会打印一个“1”。
我正在尝试在我的 OS/161 代码中添加一个新的系统调用,但我无法确定在哪里添加原型。我相信您应该将其添加到内核空间和用户空间,但我不确定将原型放入哪些文件中。是否有指南解释如何在 OS/161 中添加示例系统调用?
作为测试,我试图添加一个函数,printone()
当用户运行该程序时,它只会打印一个“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
)。