Windows에서 USB 장치 인식이 어떻게 작동하는지 궁금합니다. 나는 이것이 다음과 같다고 상상 한다.
- 장치를 연결하면 Windows에 “내 장치 ID가 있습니다”라는 메시지가 나타납니다.
- Windows는 해당 장치 ID와 일치하는 드라이버가 설치되어 있는지 확인합니다. 드라이버는 아마도 “BlackBerry Curve”또는 “Canon Printer”와 같이 장치에 어떤 장치를 호출해야하는지 Windows에 알려줍니다.
- 그렇다면 어떻게 든 해당 장치를 해당 드라이버와 연결합니다
- 그렇지 않으면 온라인에서 일치하는 드라이버를 찾습니다 (허용 한 경우).
내가 맞아? 그렇다면 여전히 몇 가지 의문이 남습니다.
- 드라이버를 설치할 때 어디로 가나 요? 파일이 폴더에 있습니까, 아니면 레지스트리에 추가됩니까?
- Windows가 장치를 처음 인식하고 생각하고 마지막으로 “새 장치가 설치되어 사용할 준비가 되었습니까?”
- Windows에서 누락 된 드라이버를 어디에서 찾습니까? 자체 데이터베이스에 있습니까? 장치 제조업체는 드라이버를 포함시키기 위해 드라이버를 Microsoft에 제출합니까?
이 프로세스가 실제로 어떻게 작동하는지 설명 할 수 있습니까? 또한 다른 OS에서 다르게 작동합니까?
답변
USB 버스는 물리적으로 플러그를 삽입하고 제거하는 행위를 호스트 컨트롤러가 인식 할 수 있도록 설계되었습니다. 이 “플러그”이벤트가 발생하면 호스트 컨트롤러는 장치 드라이버에게 버스를 스캔하고 각 장치가 자신을 식별하도록 요청합니다.
모든 USB 장치에는 디스크립터라고하는 장치에 대한 정보 모음이 포함되어 있습니다. 장치 설명자는 동일한 명령을 사용하여 모든 장치에서 검색됩니다. 이를 통해 USB 버스 자체의 장치 드라이버가 새로 연결된 장치가 무엇인지 효과적으로 묻고 합리적인 응답을 기대할 수 있습니다.
모든 설명자 중에서 일부만 드라이버를 대부분의 장치에 일치시키는 데 직접 사용됩니다. USB는 장치 클래스를 정의하기 때문에 일반적으로 각 장치 클래스의 시스템 드라이버는 해당 클래스에 있다고 주장하는 모든 장치를 처리하기에 충분합니다.
마우스, 태블릿 및 게임 컨트롤러와 같이 모든 키보드는 HID (Human Interface) 클래스에 있다고 주장합니다. HID 클래스에는 여러 서브 클래스 (키보드, 마우스 등)가 있으므로 각각 예상대로 처리됩니다.
대부분의 디스크와 같은 장치는 Mass Storage 클래스에 있다고 주장하며 시스템 드라이버도 이러한 장치에 적합합니다.
디스크립터는 클래스 및 서브 클래스 외에 공급 업체 ID (VID), 제품 ID (PID) 및 개정판도 포함합니다. 공급 업체 ID는 표준위원회에 의해 할당됩니다 (주로 발행 순서이지만 일부 회사는 특별한 요청을 받았습니다 : 예를 들어 인텔은 0x8086입니다). 제품 ID는 각 공급 업체에서 할당하며 VID와 PID의 조합은 출시 된 각 제품마다 고유해야합니다.
장치가 처음 설치되면 VID, PID, 개정, 클래스 및 서브 클래스가 예측 가능한 방식으로 사용되어로드되는 장치 드라이버를 선택합니다. 공급 업체 및 제품 고유의 이름을 사용하면 공급 업체가 스톡 시스템 드라이버가 (거의) 올바르게 처리 할 수있는 장치를 사용자 정의 할 수 있습니다.
또 다른 중요한 설명자는 장치 일련 번호입니다. 장치에 일련 번호가있는 경우 다른 물리적 USB 포트를 사용하더라도 다시 연결하면 동일하게 인식되고 처리 될 수 있습니다. 이것은 저장 장치에 동일한 드라이브 문자를 할당하고 직렬 포트 어댑터 및 모뎀과 같은 장치에 동일한 COM 포트 지정을 부여하는 데 중요합니다.
이 전체 프로세스는 MSDN에 문서화되어 있지만 세부 사항은 다양한 위치에 분산되어 있습니다.
답변
질문 :
- 디렉토리 : 드라이버는 2 개의 디렉토리에 설치됩니다. 실행중인 부분은 대부분의 경우 % RootDir % \ system32에 설치되고 장치 정보 부분은 % RootDir % \ inf에 설치됩니다. inf 디렉토리 아래에 설치 / 등록 된 드라이버의 경우 oem * .inf 파일이 생성됩니다. (*는 숫자입니다). Vista에서 드라이버는 아직 발견되지 않은 장치를 설치할 때 참조로 % RootDir % \ system32 \ driverstore 디렉토리에 복사됩니다.
- 레지스트리 : 드라이버가 커널 모드 서비스로 설치됩니다. 이를 위해 드라이버 서비스를위한 특정 레지스트리 키가 생성됩니다. 버스 드라이버 아래에 해당 장치에 개별 장치 인스턴스 키가있는 다른 위치가 있습니다. 이 키에서 장치에는 현재이 장치에 사용 된 드라이버에 대한 참조가 있습니다.
- 장치 ‘도착’: 버스 드라이버가 버스에서 새 장치를 찾으면 고유 한 키 아래에 고유 한 장치 인스턴스 ID에 해당하는 키 레지스트리를 작성하여 시스템에서 장치를 고유하게 식별하는 데 사용할 수 있습니다. 이 키가 이미 존재하면 버스 드라이버는이 노드가 참조하는 장치를로드하려고 시도합니다. 이 노드가 없거나 드라이버가로드되지 않으면 시스템은 % RootDir % \ inf 아래에 등록 된 장치 드라이버를 스캔하여 장치와 호환되는 드라이버를 찾습니다. 이 장치에 적합한 드라이버는 열거 및 정렬됩니다. 그런 다음 장치에 가장 적합한 드라이버가 선택되어로드됩니다.
- 드라이버 검색 : inf 디렉토리에서 드라이버를 먼저 검색합니다. 드라이버를 찾지 못하면 Windows는 드라이버를 제공 할 수 있는지 또는 Microsoft 서버를 살펴 봐야하는지 사용자에게 묻습니다. 드라이버 제조업체는 Microsoft 장치 드라이버 서버에 포함시키기 위해 드라이버를 제출할 수 있습니다.
Lunatik은 이른바 버스 드라이버가 장치를 찾는 방법의 첫 번째 부분입니다.
답변
usb에 관한 좋은 책을 추천하고 싶습니다 :
- Jan Axelson의 USB 완성
나는 당신이 이것을 요구하지 않았다는 것을 알고 있지만, 연결 해야하는 USB 장치에 대해 조금 아는 것이 좋습니다.