2011-02-11 101 views
7

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

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

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

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

编辑:我们已经解决了这个问题,使用kdsrv.exe。调试对象的COM端口继续通过命名管道暴露,但调试端通过TCP与kdserv通信。

回答

1

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

命名管道接收写入COM端口的所有数据。您的程序从命名管道读取数据并将其写入另一个命名管道。这是数据丢失可能源于如果你写太快接收COM端口的UART可能溢出导致数据丢失。

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

此外,您在程序中缺少ResetEvent()调用。

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

+0

感谢您的建议。限制转发有一点帮助;一个普通的“复制foo.txt COM1:”现在可以成功传输所有数据。不幸的是,HyperTerm在zmodem通信中仍然存在死锁,所以仍然有数据丢失的地方。至于ResetEvent:特别是缺少的地方?异步IO定义为在ReadFile和WriteFile中正确重置事件。明天测试重置= 0。 –

+0

我的错误。不需要重置事件。 – John

+0

此答案不能完全解决问题,只能部分解决。尽管如此,这是我们得到的最好答案,所以我将奖励给予奖励。查看我的编辑,了解我们如何解决问题。 –

0

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

+0

感谢您的建议。不幸的是,真正的应用程序是这里的内核调试器,它不适用于来宾机器中的任何类型的网络。 –

0

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

好,只是我的猜测,但你的问题的VirtualBox的版本,看似运行它没有任何问题:

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

但对于VirtualBox的以下的bug票并描述许多相似之处,您的问题:

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

和读取结束似乎表明该解决方案具有的VirtualBox的内部源代码做。也许这是Hyper-V的问题?