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

标签 c linux operating-system unix os161

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

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

最佳答案

添加另一个系统调用号,例如SYS_print1 callno.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() 的用户模式原型(prototype)可以在 unistd.h 中声明连同 read() 等。

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

关于c - 如何在 OS/161 中添加新的系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15468300/

相关文章:

c - 管道化读取指令

linux - Ushare 重新扫描文件系统而不重新启动

c - 当我堆栈溢出时,操作系统如何避免崩溃?

memory - 32 与 64 位...或者, 'processing information' 到底是什么意思

linux - FreeBSD、GNU Linux 和 OpenSolaris 的主要优缺点是什么?

c - For 循环未被执行 C

类型转换有符号为 double 与类型转换为 float 然后 double 结果不同

c - 如何使用 C 中的指针将一个数组的内容复制到另一个数组?

linux - 如何同时运行不同版本的 node.js?

linux - BASH 错误, "source"附近的意外标记