7

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

我们已经编写了这样一个应用程序。不幸的是,这个应用程序丢失了数据

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

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

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

4

3 回答 3

2

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

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

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

此外,您ResetEvent()的程序中缺少呼叫。

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

于 2011-02-14T01:08:47.837 回答
0

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

于 2011-02-11T21:04:25.733 回答
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 的问题?

于 2012-03-15T08:47:51.547 回答