私はOs/161execv(char *program, char **args)
で call を書いています。
したがって、プログラムとカーネル空間の引数で提供されたデータ ユーザーのコピーを取得します。次に、引数を持つプログラムがロードされる新しいアドレス空間を作成します。
問題は、ユーザー空間に切り替える前にカーネル空間からユーザー空間にデータをコピーするために、ユーザー空間の仮想メモリへの適切なポインターを見つける方法です。
スタックを使用しますが、メモリが整列していることを確認してください
私もOS161に取り組んでいます。これが私のやり方です。
現在のアドレス空間を破棄する前に、すべての引数をカーネル バッファーにコピーします。次に、新しいアドレス空間を作成してアクティブ化した後、as_define_stack を介してスタック ポインターを取得し、これらの引数をスタックにコピーします。それらを非常に慎重にパックする必要があります。そうしないと、新しいスタックが破損します。また、James が言ったように、すべてのポインター (各引数文字列の開始) は、stackptr と同様に 4 バイトで整列する必要があります。この後、それに応じて stackptr を調整して、これらの引数のためのスペースを確保する必要があります。
これはハーバードが提供するドキュメントです。詳細は9ページで確認できます。
[編集]
os161の execv システムコールについてブログを書きました。そこで質問を明確にしたことを願っています。
[/編集]