Hyper - V: подключение VMs через именованный канал теряет данные

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

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

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

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

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

3 ответов


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

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

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

кроме того, вам не хватает ResetEvent() вызовы в вашей программе.

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


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


Я думаю, что предложение Джона правильно - если u использует медленный процессор для эмуляции двух виртуальных машин, то драйверы гостевой ОС для последовательного порта сильно отклоняются от высокоскоростной версии. Поэтому предложение Джона состоит в том, чтобы установить входную/выходную сторону последовательного соединения на самую медленную возможную скорость. Т. е. нельзя использовать высокую скорость передачи данных для последовательной связи между виртуальными машинами. Вместо этого вы должны использовать самую медленную возможную скорость, и чтобы гостевой драйвер 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?