Hyper-V: подключение виртуальных машин через именованный канал приводит к потере данных


Мы пытаемся соединить две виртуальные машины Hyper-V через последовательный порт. Hyper-V предоставляет последовательный порт в виде именованного канала хост-системе и реализует серверную часть именованного канала. Следовательно, чтобы соединить их, нам нужно написать клиент именованного канала, который подключается к обеим виртуальным машинам и копирует данные туда и обратно.

Мы написали такое заявление . К сожалению, это приложение теряет данные.

Если мы соединим две гипертермы и получим их обмен данными, передача иногда удается, но во многих случаях принимающая сторона сообщает об ошибках,или передача просто блокирует. Аналогично, если мы используем ссылку для запуска отладчика ядра, он также часто зависает.

Какова может быть причина потери данных? Какие меры предосторожности должны быть приняты при соединении именованных каналов таким образом?

Edit : мы обошли проблему, используя kdsrv.exe . COM-порт отладчика продолжает оставаться открытым однако через именованный канал отладчик связывается с kdserv по протоколу TCP.

3 7

3 ответа:

Потеря данных происходит не из-за именованных каналов. Это касается COM-портов (эмулированных и физических), которые могут потерять данные, так как они работают с небольшим буфером в UART.

Именованный канал получает все данные, записанные в COM-порт. Ваша программа считывает данные из именованного канала и записывает их в другой именованный канал. Именно здесь может произойти потеря данных, если вы пишете слишком быстро UART принимающего COM-порта может переполниться, что приведет к потере данных.

Возможно, вам потребуется добавить некоторая задержка, чтобы избежать превышения скорости передачи данных, ожидаемой принимающей стороной.

Кроме того, в вашей программе отсутствуют вызовы ResetEvent().

Для ваших проблем с KD, возможно, потребуется добавить resets=0 к строке подключения.

Я не пытался подключить VM через последовательный порт, но я подключил VM и хост через usb (через сеть) и это работает. Если для вашего программного обеспечения требуется установить последовательное соединение, попробуйте протестировать его через последовательные эмуляторы с работой через tcp\ip.

Я думаю, что предложение Джона правильно - если u использует медленный процессор для эмуляции двух виртуальных машин, то драйверы гостевой ОС для последовательного порта сильно отошли от высокоскоростной версии. Поэтому Джон предлагает установить входную / выходную сторону последовательного канала на самую низкую возможную скорость. То есть, вы не можете использовать высокую скорость передачи данных для последовательной связи между виртуальными машинами. Вместо этого вы должны использовать самую медленную возможную скорость, и так, чтобы гостевой драйвер виртуальной машины принял этот сигнал и использовал более медленную версию о водителе. Но ваша физическая машина должна иметь достаточную скорость процессора для одновременного запуска двух виртуальных машин, чтобы избежать "дрейфа эмуляции" последовательного драйвера.

Ну, просто мое предположение, но есть версия 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?