2

新しいシステム コールを追加するオペレーティング システムの割り当てを行っています。「ダムフォーク」と呼ばれるシステム コールは、コピー オン ライト ポリシーを使用せずにプロセスをフォークする必要があります。したがって、基本的にはアドレス空間全体を子プロセスにコピーする必要があります。

システムカーネルをセットアップして再コンパイルすることができました。カスタム システム コールを呼び出すことはできますが、実際にダムフォークを実装して COW 機能を無効にする方法がわかりません。ソース コードの 1 つは、sys_vfork がどのようにdo_forkを呼び出しているかを示しています。Dumbfork は sys_vfork に似ている必要があります。do_fork のパラメータを設定する方法がわかりません。sys_fork の実装方法を真似ようとしたところ、NULL ポインター逆参照エラーが発生しました。誰でもこの問題について教えてもらえますか。

asmlinkage long sys_dumbfork(struct pt_regs *regs)
{
  return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL);
}
4

1 に答える 1

0

do_forkで使用される非常に一般的な関数でありforkvforkclone呼び出します。あなたが達成したいものに最も似ているのは明らかにですforkclone主にスレッドを対象としており、vforkアドレス空間をまったくコピーしません)。

あなたの場合、最善の解決策は、のdo_forkような新しいフラグを受け入れるようにすることだと思われますCLONE_COPY_EVERYTHING_RIGHT_NOW。次に、コピーオンライトを担当するコードを見つけ、このフラグが渡されたかどうかに応じてdo_fork、アドレス空間全体をコピーするか、(フラグが渡されなかった場合do_forkは、元のシステムコールの1つから呼び出されたことを示す)既存のものを使用します。コピーオンライトポリシー。システムコールは、追加のフラグを除いて、コールdumbforkとほぼ同じように見えます。fork

asmlinkage int sys_dumbfork(struct pt_regs *regs)
{
     return do_fork(CLONE_COPY_EVERYTHING_RIGHT_NOW | SIGCHLD, regs->sp, regs, 0, NULL, NULL);
}

このページは古くなっていますが、特にForkICACopyonWriteのセクションで非常に役立つ場合があります。ページを読み取り専用としてマークするforksyscall中に呼び出される関数があります。copy_page_rangeこれは、メモリコピーコードを追加するために検討する必要がある場所のように見えます。さらに、誰かが書き込みたいと思っていた以前に共有されたページをコピーするために、ページフォールト中に関数do_wp_pageが呼び出されます。これは、そのようなコピーがどのように見えるかを示す良い例です。

于 2012-03-05T19:27:32.303 に答える