我正尝试在我的 OS/161 代码中添加一个新的系统调用,但我无法确定在何处添加原型(prototype)。我相信你应该将它添加到内核空间和用户空间,但我不确定将原型(prototype)放入哪些文件中。是否有某个地方的指南解释了如何在 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()
的用户模式原型(prototype)可以在 unistd.h
中声明连同 read()
等。
看起来 read()
的用户模式实现可能在汇编文件中。这是合理的,因为最后它应该执行 MIPS syscall
直接在 C 中不可用的指令。您应该以类似的方式实现 print1()
(加载 SYS_print1
到适当的寄存器并执行 syscall
).
关于c - 如何在 OS/161 中添加新的系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15468300/