2012-12-04 1 views
3

리눅스 박스가있는 네트워크를 통해 연결된 MacOSX (Windows는 이미 실행 중) 용 가상 USB 버스 드라이버에서 작업하고 있습니다. 10.6 및 10.7에서 대용량 저장 장치 및 마우스 또는 키보드와 같은 HID 장치를 사용하면 정상적으로 작동합니다.kext는 10.7 언로드에 실패했지만 10.6은 작동하지 않습니다.

그러나 장치를 제거하거나 플러그를 뽑으면 더 쉽게 꺼낼 수 있습니다. HID 장치 은 10.7 (.5) 미만이므로 인스턴스가 남아 있습니다 (분리 후 보유 수는 0이되지 않음). 내 10.6 및 10.7 테스트 환경은 동일하게 MacBooksPro 8.2 i7입니다.

간혹 (5 ~ 50 분 후) kext가 내 옆에서 아무런 행동없이 자유롭게됩니다. 전원 모드가 바뀌지 않는 것 같습니다.

네, USBFamily 로깅 LIB 출력을 많이 가지고 있지만, (kextunload 확인) 작업 실행을 작동하지 않는 사이에 난 때문에 대용량 저장 장치의 로깅 수준을 7

과 함께 loggings의 차이를 찾을 장치가 잘 작동하는 것처럼 보입니다. 문제는 10.7 이하의 HID 드라이버 스택 안에 있다고 생각합니까?

10.6과 10.7 사이의 USB HID 장치 드라이버 스택을 제거하는 데있어 알려진 차이점이 있습니까?

내 kext는 실제 (원격 Linux 상자에) USB 장치에 연결된 USBDevice를 설정/생성하는 (가상) ControllerV3 파생 클래스입니다. XCode 사용하기 4.4.1. 어떤 아이디어 나 힌트에 미리

감사합니다, 관련 마르쿠스

추신 : 10.7에서 많은 HID 객체가 드라이버 스택의 상단에있는 것을 나에게 조금 이상한 보인다. kextunload (실패 "..VirDevice 1 인스턴스가") 이후 그들은 여전히 ​​살아있는 것. 하지만 이것은 100 %로 로컬 연결 및 분리 된 Logitech 마우스와 동일합니다.

저로부터 저는 IOUSBDevice에서 파생 된 객체 인 MsVirBus (가상 USB 버스, IOUSBControllerV3에서 파생 됨)와 Mouse @ xaffe003f만이 가장 낮습니다.

Driver Stack after kextunload

답변

2

나는 HID 스택 깊은 경험이 없어,하지만 난 당신에게 이러한 문제의 원인을 추적하는 방법에 대한 몇 가지 일반적인 IOKit/KEXT 조언을 제공 할 수 있습니다.

kextunload I/O 레지스트리의 모든 개체에 대해 terminate()을 호출합니다. 이것은 KEXT 언로드 할 수는없는 끝낼 수 있습니다 이유 이가지 경우가 있습니다 의미 :

  1. terminate()가 실패하거나 모든 자식이

  2. 나머지 라이브 개체가 I의 모든없는 개체를 제거하는 데 실패는/O 레지스트리

ioreg 명령을 사용하여 개체가 I/O 레지스트리에 남아 있는지 확인하십시오. 또한 일반적으로 제거를 방해하는 클라이언트가 있는지 확인하십시오.

레지스트리에 개체가 없으면 유지/릴리스 불일치가 발생했을 가능성이 큽니다. 나는 이것들을 추적하는 것에 대한 약간의 제안을 in this answer에게 주었고, 나는 이것을 여기서 반복하지 않을 것이다.또한 kext가 언로드되고 10.6에서 작동하기 때문에 가능성이없는 것으로 보입니다.

개체가 I/O 레지스트리에 남아있는 경우 해당 개체가 여전히 존재하는 이유를 추적해야합니다. 클래스에서 terminate()을 이미 재정의하지 않은 경우 기본 클래스 구현에 대한 호출을 전달하는 더미 오버라이드를 추가하십시오. 그러나 포워딩 전달을 로깅 출력으로 감싸고 호출 성공 여부를 출력하십시오. 이미 terminate을 무시한 경우 비슷한 로깅을 추가하십시오. 종료가 비동기적일 수 있으므로 에 대해 유사한 로깅을 추가 할 수도 있습니다.

USB 장치의 플러그가 뽑혀있을 때 terminate()을 클라이언트에 전달해야합니다. 나는 EHCI 컨트롤러 코드의 동등한 부분을 점검하여 특별한 인수 등이 필요한지 확인한다.

+0

건설적인 제안에 많은 감사드립니다! 레지스트리가 정리 된 것 같습니다. 드라이버 스택 맨 위에는 여전히 재미있는 HID 객체가 많이 있지만, 플러그 앤 플러그되지 않은 로컬 마우스 (똑같은 광학로 연결된 Logitech 마우스를 사용합니다)와 똑같습니다. 여기에 사진을 추가하는 방법을 모르겠다. 어쩌면 kextunload 이후 스택을 보는 것이 중요 할 것이다. –

+0

taggedRetain/Release 메소드를 오버라이드하는 것은 좋은 생각입니다. 월요일에 시도하고 e 피드백을 가능한 빨리 추가 할 것입니다. 다른 이상한 점은 "... has 1 instance"오류로 언로드 한 후 kext를 다시로드 할 수 있다는 것입니다. 언로드 두 번째 시간은 인스턴트 카운트 "1"로 동일하게 오류입니다. –

+0

안녕하세요, 도움을 요청하기 전에 이미 내 로그에 getRetainCount() 정보를 추가했지만 제시 한 오버로드 방식은 훨씬 더 똑똑합니다. 지금까지 백 트레이스가 작동하지 않고 시스템이 바쁜 마우스 포인터 (회전 된 공)로 멈 춥니 다.하지만 USBLogger를 사용하기 때문에 OSDebug에 대한 작업이 조금 더 있습니다. 카운터의 결과는 예상대로입니다 : 10.6의 경우 0으로 내려 가고 10.7의 경우 오류의 경우 1로 이동합니다. RetainCounter는 USBDevice :: start 후에 성공적으로 일치하고 드라이버 스택을 확립 한 후에 달라진 것 같습니다. –

관련 문제