Hyper-V: подключение виртуальных машин через именованный канал приводит к потере данных - PullRequest
7 голосов
/ 11 февраля 2011

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 14 февраля 2011

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

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

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

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

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

0 голосов
/ 15 марта 2012

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

Ну, просто я догадываюсь, но есть версия вашей проблемы с 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?

0 голосов
/ 12 февраля 2011

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

...