2012-03-05 13 views
2

オペレーティングシステムの割り当てを行っています。これは新しいシステムコールを追加しています。 "ダンボフ(dumbfork)"と呼ばれるシステムコールは、コピーオンライトポリシーを使用せずにプロセスをフォークする必要があります。基本的には、アドレス空間全体を子プロセスにコピーする必要があります。copy-on-writeを無効にしてdo_forkを呼び出す

私はシステムカーネルをセットアップして再コンパイルすることができました。私は私のカスタムシステムコールを呼び出すことができますが、COW機能を無効にするためにダンボールを実際に実装する方法はわかりません。ソースコードの1つでは、sys_vforkがdo_forkを呼び出す方法を示しています。ダンボフは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); 
} 
+0

'sys_vfork'は、あなたが望むものの正反対です! –

+0

はい、そうです。 vforkは、フラグCLONE_VM、CLONE_VFORK、およびSIGCHLDをdo_forkに渡し、アドレス空間を共有します。とにかくvforkの子はexecやexitを行いますので意味があります。 – NeoJi

答えて

0

do_forkforkvfork及びclone呼び出しで使用される非常に一般的な機能です。あなたが達成したいものと最も似ているのは明らかにforkです(cloneは主にスレッド用です)、vforkはアドレス空間をまったくコピーしません。

あなたの場合、最良の解決策は、CLONE_COPY_EVERYTHING_RIGHT_NOWのようなものであることを、do_forkが新しい旗を受け入れるようにしているようです。このフラグがdo_forkに渡されたかどうかによって、copy-on-writeの責任を負うコードが見つかるはずです:アドレス空間全体をコピーするか、フラグが渡されなかった場合は元のシステムコールの1つからdo_forkが呼び出されたことを示します)既存のコピーオンライトポリシーを使用する。 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); 
} 

Thisページは、古くなったが、書き込みで特にセクションフォークICAコピー、非常に有用であろう。 forkの間に呼び出された関数copy_page_rangeは、ページを読み取り専用にマークします。これは、メモリコピーコードを追加する際に考慮すべき場所のようです。さらに、関数do_wp_pageは、ページフォールト中に呼び出され、誰かが書きたいと思っていた以前に共有されたページをコピーします。そのようなコピーがどのように見えるかは良い例かもしれません。

+0

答えをありがとうが、私はまだ詳細にこれを取得しません。 do_forkを変更して新しいフラグを使用できるようにする必要がありますか?オリジナルの代わりに変更されたdo_forkを使用しますか?変更されたdo_forkを使用するには、新しいシステムコール用にfork.c全体をコピーする必要があります。 – NeoJi

+0

do_forkを修正すると、元のシステムコール(以前と同じように動作しなければならない新しいフラグなし)と新しいシステムコール(フラグが渡されたときにアドレス空間全体をコピーする必要があります) 。私はそれをより明確にするために私の答えを更新しました。 –

関連する問題