Hyper-V:通过命名管道连接VM会丢失数据

时间:2011-02-11 20:11:27

标签: serial-port named-pipes hyper-v

我们正在尝试通过串行端口连接两个Hyper-V VM。 Hyper-V将串行端口公开为主机系统的命名管道,并实现命名管道的服务器端。因此,为了连接它们,我们需要编写一个连接到两个VM的命名管道客户端,并来回复制数据。

We have written such an application。不幸的是,此应用程序丢失了数据

如果我们连接两个超文本并让它们交换数据,则传输有时会成功,但在许多情况下,接收端报告错误,或者传输只是死锁。同样,如果我们使用链接来运行内核调试器,它似乎也经常挂起。

数据丢失的原因是什么?以这种方式连接命名管道时必须采取哪些预防措施?

修改:我们使用kdsrv.exe解决了这个问题。调试对象的COM端口继续通过命名管道公开,但是,调试器端通过TCP与kdserv进行通信。

3 个答案:

答案 0 :(得分:1)

数据丢失不是由于命名管道造成的。实际上,COM端口(仿真和物理)可能会丢失数据,因为它们在UART中使用小缓冲区运行。

命名管道接收写入COM端口的所有数据。您的程序从命名管道读取数据并将其写入另一个命名管道。如果写入速度太慢,接收COM端口的UART可能会溢出导致数据丢失,那么这就是数据丢失的原因。

您可能需要添加一些延迟以避免超出接收方预期的波特率。

此外,您的计划中缺少ResetEvent()次来电。

对于您的KD问题,您可能需要将resets=0添加到连接字符串。

答案 1 :(得分:0)

我没有尝试通过串口连接VM但我通过USB连接VM和主机(通过网络) 它的工作原理。 如果您的软件需要建立串行连接,请尝试通过串口仿真器通过tcp \ ip进行测试。

答案 2 :(得分:0)

我认为John的建议是正确的 - 如果你使用慢速CPU来模拟两个VM,那么客户操作系统的串口驱动程序就会远离高速版本。所以John的建议是将串行链路的输入/输出端设置为最慢的速度。即,您不能使用高波特率进行VM间串行通信。相反,您必须使用最慢的速度,以便VM来宾驱动程序将采用该提示并使用较慢版本的驱动程序。但是你的物理机必须有足够的CPU速度来同时运行两个VM,以避免串行驱动程序的“仿真漂移”。

嗯,只是我的猜测,但是你的问题有一个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的问题?