6

そのため、xv6 で現在実行中のプロセスのリストにアクセスする方法を考えています。私が考えたプロセスは、ptable にアクセスできるようにすることです。そのため、ptable をループして、実行中のすべてのカウンターをインクリメントできます。ただし、システムコールを作成している場合(sysproc.cに書き込む場合)、proc専用であるように見えるため(私にはまだ突っついています)、ptableにアクセスできません。 c

ループして実行中のプロセスを見つけるためにテーブルにアクセスできる方法はありますか、それとも検討すべき別のアプローチがありますか?

編集:ヘッダーファイル内にカウンター変数を作成し、プロセスが作成されるたびにインクリメントし、プロセスが終了するとデクリメントする方が簡単でしょうか?

4

1 に答える 1

10

ただし、システムコールを作成している場合(sysproc.cに書き込む場合)、proc専用であるように見えるため(私にはまだ突っついています)、ptableにアクセスできません。 c

あなたが正しい。sysproc.c 内ではアクセスできません。おそらく xv6 ソース全体にアクセスできます。つまり、proc.c (sysproc.c ではない) に関数を追加して、この ptable を反復処理し、何かを実行できます。

ループして実行中のプロセスを見つけるためにテーブルにアクセスできる方法はありますか、それとも検討すべき別のアプローチがありますか?

proc.c の外部から直接アクセスしても機能しません。幸いなことに、ptable にアクセスする proc.c 関数を呼び出すと機能します。sysproc.c を見ると、proc.c 内に記述された関数が呼び出され、ptable が使用されます。

たとえば、「exit」関数を見て、関連するコードが xv6 のどこにあるかを確認して、ptable を使用するシステムコールがどのように機能するかを理解できます。

proc.c: //Implementation of exit function
...
2353 void
2354 exit(void)
2355 {
...
2379 for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
...
2391 }

proc.c の exit 関数は、proc.c でインスタンス化されたプロセス テーブルをループできます。

defs.h:
...
0357 // proc.c
0358 struct proc* copyproc(struct proc*);
0359 void exit(void);
0360 int fork(void);
...

defs.h ファイルには、exit 関数の前方宣言が含まれています。

sysproc.c: //Implementation of a syscall 'exit' 
...
3414 int
3415 sys_exit(void)
3416 {
3417 exit();
3418 return 0; // not reached
3419 }

sys_exit 関数 sysproc.c には、ある時点で ptable を介して対話する proc.c から exit() を呼び出す exit syscall の完全な実装が含まれています。

ptable を反復処理することを計画している場合は、必要なことを実行するためにシステムコールが呼び出すことができる関数を作成することを検討する必要があります。これが、exit syscall を例として含めた理由です。

xv6 のソース コード

これがあなたの理解に役立つことを願っています!

于 2015-09-19T19:31:48.993 に答える