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()
。
カーネル側はこれで終わりです。
のユーザー モード プロトタイプは、with などと一緒print1()
に宣言できます。unistd.h
read()
のユーザーモード実装がread()
アセンブリ ファイルにあるようです。最終的には、C では直接利用できないMIPSsyscall
命令を実行する必要があるため、これは合理的です。print1()
同様の方法で実装する必要があります (SYS_print1
適切なレジスタにロードして実行しますsyscall
)。