2011-02-11 1 views
7

우리는 직렬 포트를 통해 두 개의 Hyper-V VM을 연결하려고합니다. Hyper-V는 직렬 포트를 명명 된 파이프로 호스트 시스템에 노출시키고 명명 된 파이프의 서버 끝을 구현합니다. 결과적으로 이들을 연결하려면 두 VM에 모두 연결되는 명명 된 파이프 클라이언트를 작성하고 데이터를 앞뒤로 복사해야합니다.Hyper-V : 명명 된 파이프를 통해 VM을 연결하면 데이터가 손실됩니다.

We have written such an application. 죄송합니다. 이 응용 프로그램은 데이터가입니다.

두 개의 하이퍼 링크를 연결하고 데이터를 교환하게되면 전송이 성공하는 경우가 있지만 대부분의 경우 수신 측에서 오류가 발생하거나 전송이 교착 상태 만보고합니다. 마찬가지로 링크를 사용하여 커널 디버거를 실행하면 자주 중단되는 것처럼 보입니다.

데이터 손실의 원인은 무엇입니까? 이러한 방식으로 명명 된 파이프를 연결할 때주의해야 할 사항은 무엇입니까?

: kdsrv.exe을 사용하여이 문제를 해결했습니다. 디버거의 COM 포트는 계속해서 명명 된 파이프를 통해 노출되지만 디버거 끝은 TCP를 통해 kdserv와 통신합니다.

답변

1

데이터 손실은 명명 된 파이프 때문이 아닙니다. 실제로 UART에서 작은 버퍼로 작동하기 때문에 데이터를 잃을 수있는 COM 포트 (에뮬레이트 및 물리적)입니다.

명명 된 파이프는 COM 포트에 기록 된 모든 데이터를받습니다. 프로그램은 명명 된 파이프에서 데이터를 읽고 다른 명명 된 파이프에 씁니다. 수신하는 COM 포트의 UART가 너무 빨리 작성하여 데이터 손실로 이어지는 오버 플로우가 발생할 수있는 경우 데이터 손실이 발생할 수 있습니다.

수신 측에서 예상하는 전송 속도를 초과하지 않도록 약간의 지연을 추가해야 할 수도 있습니다.

또한 프로그램에서 ResetEvent() 호출이 누락되었습니다.

KD 문제의 경우 연결 문자열에 resets=0을 추가해야 할 수 있습니다.

+0

제안 해 주셔서 감사합니다. 포워딩 스로틀 링은 약간의 도움이됩니다. 일반 "copy foo.txt COM1 :"은 이제 모든 데이터를 성공적으로 전송할 수 있습니다. 불행하게도 HyperTerm은 여전히 ​​zmodem 통신에서 교착 상태이므로 여전히 데이터 손실이 있어야합니다. ResetEvent의 경우 : 구체적으로 어디에 누락 되었습니까? 비동기 IO는 ReadFile 및 WriteFile에서 이벤트를 올바르게 재설정하도록 정의됩니다. 내일 리셋 테스트 = 0. –

+0

내 실수. ResetEvent는 필요 없습니다. – John

+0

이 대답은 부분적으로 만 문제를 완전히 해결하지는 못합니다. 그래도 우리가 얻은 가장 좋은 답변이므로 현상금을 수여합니다. 문제 해결 방법에 대한 편집을 참조하십시오. –

0

시리얼을 통해 VM에 연결하려고하지 않았지만 usb (네트워크를 통해) 을 통해 VM과 호스트에 연결되었으며 작동합니다. 소프트웨어가 직렬 연결을 설정해야하는 경우 tcp \ ip를 통해 직렬 에뮬레이터를 통해 테스트 해보십시오.

+0

제안 해 주셔서 감사합니다. 안타깝게도 실제 응용 프로그램은 여기에있는 커널 디버거입니다. 게스트 시스템의 모든 종류의 네트워킹에서는 작동하지 않습니다. –

0

존의 제안은 정확하다고 생각합니다. 두 개의 VM을 에뮬레이트하기 위해 느린 CPU를 사용하는 경우, 게스트 OS의 직렬 포트 드라이버는 고속 버전에서 크게 벗어났습니다. 그래서 John의 제안은 직렬 링크의 입/출력 쪽을 가능한 가장 느린 속도로 설정하는 것입니다. 즉, VM 간 직렬 통신에 높은 전송 속도를 사용할 수 없습니다. 대신에 가능한 가장 느린 속도를 사용해야하며, 따라서 VM 게스트 드라이버가 해당 큐를 사용하고 더 느린 버전의 드라이버를 사용하게하십시오. 그러나 실제 시스템은 직렬 드라이버의 "에뮬레이션 드리프트"를 피하기 위해 두 VM을 동시에 실행하는 데 충분한 CPU 속도를 가져야합니다.

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

을하지만 버추얼 박스에 대해 다음 버그 티켓 문제에 많은 유사점을 설명 않습니다

글쎄, 내 생각 엔, 그러나 겉으로는 아무 문제가 그것을 실행하지, 문제의 버추얼 버전이 있습니다 :

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

그리고 끝을 읽는

겉보기 솔루션은 버추얼 박스의 내부 소스 코드를 함께 할 수있다 나타낸다. 아마도 Hyper-V의 문제일까요?