我想在我的OS/161代碼中添加一個新的系統調用,但我很難找出添加原型的位置。我相信你應該將它添加到內核空間和用戶空間,但我不確定哪些文件將原型放入其中。是否有指導說明如何在OS/161中添加示例系統調用?如何在OS/161中添加新的系統調用?
作爲一個測試,我試圖添加一個函數printone()
,當用戶運行該程序時,它只會打印一個「1」。
我想在我的OS/161代碼中添加一個新的系統調用,但我很難找出添加原型的位置。我相信你應該將它添加到內核空間和用戶空間,但我不確定哪些文件將原型放入其中。是否有指導說明如何在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
以及read()
等中聲明。
看起來像read()
的用戶模式實現可能在程序集文件中。這是合理的,因爲它最終應該執行MIPS指令syscall
,不能直接在C中使用。您應該以類似的方式執行print1()
(將SYS_print1
加載到相應的寄存器中並執行syscall
)。
這是什麼[這個OS/161](http://www.eecs.harvard.edu/~syrah/os161/)? – 2013-03-18 00:05:09
'printone()'系統調用將寫入哪裏?你打算提供一個文件描述符,還是將它寫入控制檯?或者是什麼? – 2013-03-18 02:34:22
看起來至少有兩所大學使用OS/161作爲教學操作系統的單元。 – 2013-03-18 02:35:34