プログラムを GNU/Linux から VxWorks に移植しています。問題がfork()
あり、代替手段が見つかりません。VxWork の API は 2 つの便利な呼び出しtaskSpawn( )
とrtpSpawn( )
spwan RTP/Task を提供しますが、これらの API は呼び出しプロセスを複製しません (fork は複製します)。fork() を Vxworks に移植/回避する方法を知っている人はいますか?
2 に答える
VxWorks のメモリ モデルについては何も知りませんが、移植は不可能かもしれません。これは、プロセスが fork されると、元のプロセスのメモリが新しいプロセスにコピーされるためです。重要なのは、2 つのプロセスが同じ内部仮想アドレスを使用する必要があることです。そうしないと、ポインターなどの機能が壊れてしまいます。
明らかに、2 つのプロセスは異なる物理アドレスを持っている必要があります。つまり、フォークするには、メモリ管理ユニット (MMU) を備えたプラットフォームが必要であり、カーネルはプログラムが同じ仮想アドレスを共有できるメモリ モデルをサポートしている必要があります。これが、新しいスレッドを作成するための fork に相当するものがない理由です。
これに加えて、大規模なプロセスをコピーすると、非常にコストがかかる可能性があります。そのため、Linux はコピー オン ライトと呼ばれるものを使用します。これは、すべての fork が行うことは、すべてのメモリ ページを読み取り専用としてマークすることを意味します。書き込みが試行されると、割り込みが生成され、そのときだけメモリ ページがコピーされます。
リアルタイム オペレーティング システム RTOS がコピー オン ライトをサポートする可能性は低いです。これは、メモリ書き込み時間が制限されず、OS のリアルタイム保証に違反することを意味するためです。
したがって、fork をまったくサポートせずに、複製なしで真新しいプロセスを生成するための API を実装する方がはるかに簡単です。
vxWork を正しく覚えていれば、できません。fork() には仮想メモリ管理が必要ですが、これは VxWorks 5.5 では提供されていないと思いますが、少なくとも fork を実装するために必要な完全なセマンティクスではありません。(私が間違っていなければ、vxwork 6 で追加されました)。