2013-03-17 77 views
0

我想在我的OS/161代碼中添加一個新的系統調用,但我很難找出添加原型的位置。我相信你應該將它添加到內核空間和用戶空間,但我不確定哪些文件將原型放入其中。是否有指導說明如何在OS/161中添加示例系統調用?如何在OS/161中添加新的系統調用?

作爲一個測試,我試圖添加一個函數printone(),當用戶運行該程序時,它只會打印一個「1」。

+1

這是什麼[這個OS/161](http://www.eecs.harvard.edu/~syrah/os161/)? – 2013-03-18 00:05:09

+0

'printone()'系統調用將寫入哪裏?你打算提供一個文件描述符,還是將它寫入控制檯?或者是什麼? – 2013-03-18 02:34:22

+0

看起來至少有兩所大學使用OS/161作爲教學操作系統的單元。 – 2013-03-18 02:35:34

回答

1

添加另一個系統呼叫號碼,例如, SYS_print1callno.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()的用戶模式原型可以在unistd.h以及read()等中聲明。

看起來像read()的用戶模式實現可能在程序集文件中。這是合理的,因爲它最終應該執行MIPS指令syscall,不能直接在C中使用。您應該以類似的方式執行print1()(將SYS_print1加載到相應的寄存器中並執行syscall)。

相關問題