2011-02-11 16 views
7

シリアルポート経由で2台のHyper-V VMを接続しようとしています。 Hyper-Vは、シリアルポートを名前付きパイプとしてホストシステムに公開し、名前付きパイプのサーバー側を実装します。結果的に、それらを接続するには、両方のVMに接続し、データを前後にコピーする名前付きパイプクライアントを作成する必要があります。Hyper-V:名前付きパイプ経由でVMを接続するとデータが失われる

We have written such an application。残念ながら、このアプリケーションはデータを失います。

2つのハイパーテキストを接続してデータを交換すると、送信が成功することがありますが、多くの場合、受信側でエラーが報告されたり、デッドロックが送信されたりします。同様に、リンクを使用してカーネルデバッガを実行すると、頻繁にハングアップするようです。

データ損失の原因は何ですか?このような方法で名前付きパイプを接続するときは、どのような注意を払う必要がありますか?

を編集してください:kdsrv.exeを使用して問題を回避しました。デバッガのCOMポートは、引き続き名前付きパイプを通じて公開されますが、デバッガはTCPを介してkdservと通信します。

答えて

1

データ損失は、名前付きパイプによるものではありません。 UARTの小さなバッファで動作するため、データを失うことがあるのはCOMポート(エミュレートされた物理ポート)です。

名前付きパイプは、COMポートに書き込まれたすべてのデータを受け取ります。あなたのプログラムは、名前付きパイプからデータを読み込み、別の名前付きパイプに書き込みます。これは、受信COMポートのUARTがオーバーフローしてデータが失われる可能性があるため、書き込みが速すぎるとデータ損失が発生する可能性があります。

受信側が期待するボーレートを超えないように、遅延を追加する必要があります。

さらに、プログラムにResetEvent()コールがありません。

KDの問題については、接続文字列にresets=0を追加する必要があります。

+0

提案していただきありがとうございます。転送を抑制することは少し役に立ちます。プレーンな "copy foo.txt COM1:"はすべてのデータを正常に送信できるようになりました。残念なことに、HyperTermはzmodem通信で依然としてデッドロックしているため、どこかでデータが失われている必要があります。 ResetEventについては、具体的にどこにありませんか? Async IOは、ReadFileとWriteFileでイベントを適切にリセットするように定義されています。明日はリセットをテストする= 0。 –

+0

私の過ち。 ResetEventの必要はありません。 – John

+0

この回答は問題を完全に解決するものではありません。それでも、それは私たちが得た最高の答えなので、私は恩恵を授与しています。問題を回避する方法については、私の編集を参照してください。 –

0

私はシリアル経由でVMに接続しようとしませんでしたが、VMとホストをusb経由で(ネットワーク経由で) に接続しています。 ソフトウェアでシリアル接続を確立する必要がある場合は、tcp \ ipを通してシリアルエミュレータを介してテストしてみてください。

+0

提案していただきありがとうございます。残念なことに、実際のアプリケーションはここのカーネルデバッガです。ゲストマシンのどのような種類のネットワークでも動作しません。 –

0

私はJohnの提案が正しいと思います - もしあなたが2つのVMをエミュレートするために低速CPUを使用しているなら、ゲストOSのシリアルポート用ドライバは高速バージョンから大きく離れています。だからJohnの提案は、シリアルリンクの入出力側をできる限り遅い速度に設定することです。つまり、VM間シリアル通信に高いボーレートを使用することはできません。代わりに、可能な限り遅い速度を使用する必要があります。そのため、VMゲストドライバはそのキューを使用して、より低速なバージョンのドライバを使用します。しかし、シリアルドライバの "エミュレーションドリフト"を避けるために、物理マシンは2つのVMを同時に実行するのに十分なCPU速度を備えていなければなりません。

まあ、ちょうど私の推測ではなく、あなたの問題のVirtualBoxのバージョンがあり、一見それを実行していない問題:

http://bodocsi.net/2011/02/how-setup-serial-port-link-in-virtualbox-between-two-guest-virtual-machine-in-linux/

しかし、VirtualBoxのための以下のバグのチケットは、あなたの問題に多くの類似点を説明します:

https://www.virtualbox.org/ticket/1548

そして、最後に読ん一見ソリューションは、VirtualBoxの内部のソースコードに関係していますを示しています。 Hyper-Vの問題でしょうか?

関連する問題