2011-02-11 22 views
7

Stiamo provando a connettere due VM Hyper-V tramite una porta seriale. Hyper-V espone la porta seriale come una named pipe al sistema host e implementa il server end della named pipe. Di conseguenza, per collegarli, è necessario scrivere un client named pipe che si connetta a entrambe le macchine virtuali e copia i dati avanti e indietro.Hyper-V: il collegamento di macchine virtuali tramite named pipe perde i dati

We have written such an application. Purtroppo, questa applicazione perde i dati.

Se colleghiamo due estremi e li scambiamo dati, la trasmissione a volte ha esito positivo, ma in molti casi, la ricezione riceve errori o la trasmissione si blocca. Allo stesso modo, se usiamo il link per eseguire un debugger del kernel, sembra che si blocchi spesso.

Quale potrebbe essere la causa della perdita di dati? Quali precauzioni devono essere prese quando si collegano le pipe denominate in questo modo?

Modifica: Abbiamo risolto il problema utilizzando kdsrv.exe. La porta COM del debugge continua a essere esposta attraverso una named pipe, tuttavia, l'end debugger parla con kdserv via TCP.

risposta

1

La perdita di dati non è dovuta alle pipe denominate. Sono infatti le porte COM (emulate e fisiche) che possono perdere dati poiché operano con un piccolo buffer nella UART.

La pipe denominata riceve tutti i dati scritti nella porta COM. Il tuo programma legge i dati dalla named pipe e li scrive su un'altra named pipe. È qui che può verificarsi la perdita di dati se si scrive troppo velocemente che la UART della porta COM ricevente può traboccare causando la perdita di dati.

Potrebbe essere necessario aggiungere un po 'di ritardo per evitare di superare la velocità di trasmissione prevista dal lato ricevente.

Inoltre, mancano le chiamate ResetEvent() nel programma.

Per i problemi relativi a KD, potrebbe essere necessario aggiungere resets=0 alla stringa di connessione.

+0

Grazie per il suggerimento. Limitare l'inoltro aiuta un po '; un semplice "copia foo.txt COM1:" può ora trasmettere correttamente tutti i dati. Sfortunatamente, HyperTerm è ancora in deadlock nella comunicazione zmodem, quindi ci deve essere ancora una perdita di dati da qualche parte. Per quanto riguarda ResetEvent: dove manca in particolare? Async IO è definito per reimpostare correttamente gli eventi in ReadFile e WriteFile. Testerà reset = 0 domani. –

+0

My misteake. Non c'è bisogno di ResetEvent. – John

+0

Questa risposta non risolve completamente il problema, solo parzialmente. Eppure, è la migliore risposta che abbiamo, quindi la premo con la taglia. Vedi la mia modifica per come abbiamo risolto il problema. –

0

Non ho provato a connettere VM tramite Serial ma ho collegato VM e host tramite USB (tramite rete) e funziona. Se è necessario che il tuo software stabilisca una connessione seriale prova a testare tramite emulatori seriali con lavoro tramite tcp \ ip.

+0

Grazie per la proposta. Sfortunatamente, la vera applicazione è il debugger del kernel qui, che non funzionerà con nessun tipo di rete nella macchina ospite. –

0

Penso che il suggerimento di John sia corretto: se si utilizza una CPU lenta per emulare TWO VM, i driver del sistema operativo guest per la porta seriale si allontanano molto dalla versione ad alta velocità. Quindi il suggerimento di John è di impostare il lato di input/output del collegamento seriale alla velocità più lenta possibile. Ad esempio, non è possibile utilizzare una velocità di trasmissione elevata per la comunicazione seriale inter-VM. Devi invece utilizzare la velocità più lenta possibile, in modo che il driver guest VM prenda quella stecca e utilizzi la versione più lenta del driver. Ma la tua macchina fisica deve avere una velocità della CPU sufficiente per eseguire due macchine virtuali contemporaneamente, per evitare la "deriva dell'emulazione" del driver seriale.

Ebbene, proprio la mia ipotesi, ma c'è una versione di VirtualBox del problema, apparentemente senza problemi di eseguirlo:

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

Ma il seguente biglietto di bug per VirtualBox fa descrivere molte somiglianze con il vostro problema:

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

E la lettura alla fine apparentemente indicano la soluzione ha a che fare con il codice sorgente interna di VirtualBox. Forse è il problema di Hyper-V?

Problemi correlati