0

私はOs/161execv(char *program, char **args)で call を書いています。

したがって、プログラムとカーネル空間の引数で提供されたデータ ユーザーのコピーを取得します。次に、引数を持つプログラムがロードされる新しいアドレス空間を作成します。

問題は、ユーザー空間に切り替える前にカーネル空間からユーザー空間にデータをコピーするために、ユーザー空間の仮想メモリへの適切なポインターを見つける方法です。

4

2 に答える 2

2

スタックを使用しますが、メモリが整列していることを確認してください

于 2009-10-27T05:03:19.190 に答える
2

私もOS161に取り組んでいます。これが私のやり方です。

現在のアドレス空間を破棄する前に、すべての引数をカーネル バッファーにコピーします。次に、新しいアドレス空間を作成してアクティブ化した後、as_define_stack を介してスタック ポインターを取得し、これらの引数をスタックにコピーします。それらを非常に慎重にパックする必要があります。そうしないと、新しいスタックが破損します。また、James が言ったように、すべてのポインター (各引数文字列の開始) は、stackptr と同様に 4 バイトで整列する必要があります。この後、それに応じて stackptr を調整して、これらの引数のためのスペースを確保する必要があります。

これはハーバードが提供するドキュメントです。詳細は9ページで確認できます。

[編集]

os161の execv システムコールについてブログを書きました。そこで質問を明確にしたことを願っています。

[/編集]

于 2012-03-07T08:37:23.960 に答える