7

シリアル ポートを介して 2 つの Hyper-V VM を接続しようとしています。Hyper-V は、シリアル ポートを名前付きパイプとしてホスト システムに公開し、名前付きパイプのサーバー側を実装します。したがって、それらを接続するには、両方の VM に接続し、データを相互にコピーする名前付きパイプ クライアントを作成する必要があります。

そのようなアプリケーションを作成しました。残念ながら、このアプリケーションはデータを失います

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

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

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

4

3 に答える 3

2

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

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

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

さらに、ResetEvent()プログラムで呼び出しが欠落しています。

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

于 2011-02-14T01:08:47.837 に答える
0

John の提案は正しいと思います。遅い CPU を使用して 2 つの VM をエミュレートしている場合、シリアル ポート用のゲスト 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の問題でしょうか?

于 2012-03-15T08:47:51.547 に答える
0

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

于 2011-02-11T21:04:25.733 に答える