Bus-Relative 주소를 가상 주소에 매핑
일부 프로세서는 별도의 메모리 및 I/O 주소 공간을 구현하지만 다른 프로세서는 구현하지 않습니다. 하드웨어 플랫폼의 이러한 차이로 인해 드라이버가 I/O 또는 메모리 상주 디바이스 리소스에 액세스하는 데 사용하는 메커니즘은 플랫폼마다 다릅니다.
드라이버는 PnP 관리자의 IRP_MN_QUERY_RESOURCE_REQUIREMENTS IRP에 대한 응답으로 디바이스 I/O 및 메모리 리소스를 요청합니다. 하드웨어 아키텍처에 따라 HAL은 I/O 공간 또는 메모리 공간에서 I/O 리소스를 할당할 수 있으며 I/O 공간 또는 메모리 공간에서 메모리 리소스를 할당할 수 있습니다.
HAL이 버스 상대 메모리 공간을 사용하여 디바이스 리소스(예: 디바이스 레지스터)에 액세스하는 경우 드라이버는 이러한 리소스에 액세스할 수 있도록 I/O 공간을 가상 메모리에 매핑해야 합니다. 드라이버는 디바이스 시작 시 PnP 관리자가 드라이버에 전달한 변환된 리소스를 검사하여 리소스가 I/O인지 또는 메모리 상주인지 확인할 수 있습니다. HAL에서 I/O 공간을 사용하는 경우 매핑이 필요하지 않습니다.
특히 드라이버가 IRP_MN_START_DEVICE 요청을 받으면 PnP 관리자가 디바이스에 할당한 원시(버스 상대) 및 번역된 리소스를 각각 설명하는 IrpSp-Parameters.StartDevice.AllocatedResources> 및 IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated>의 구조를 검사해야 합니다. 드라이버는 디버깅을 지원하기 위해 디바이스 확장에 있는 각 리소스 목록의 복사본을 저장해야 합니다.
리소스 목록은 원시 목록의 각 요소가 변환된 목록 의 동일한 요소에 해당하는 CM_RESOURCE_LIST 구조체와 쌍을 이웁니다. 예를 들어 AllocatedResources.List[0]에서 원시 I/O 포트 범위를 설명하는 경우 AllocatedResourcesTranslated.List[0]는 번역 후 동일한 범위를 설명합니다. 번역된 각 리소스에는 실제 주소와 리소스 유형이 포함됩니다.
드라이버에 변환된 메모리 리소스(CmResourceTypeMemory)가 할당된 경우 MmMapIoSpace 를 호출하여 물리적 주소를 디바이스 레지스터에 액세스할 수 있는 가상 주소에 매핑해야 합니다. 드라이버가 플랫폼 독립적 방식으로 작동하려면 반환되고 번역된 모든 리소스를 검사 필요한 경우 매핑해야 합니다.
커널 모드 드라이버는 모든 디바이스 리소스에 대한 액세스를 보장하기 위해 IRP_MN_START_DEVICE 요청에 대한 응답으로 다음 단계를 수행해야 합니다.
IrpSp-Parameters.StartDevice.AllocatedResources>를 디바이스 확장에 복사합니다.
IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated>를 디바이스 확장에 복사합니다.
루프에서 AllocatedResourcesTranslated의 각 설명자 요소를 검사합니다. 설명자 리소스 종류가 CmResourceTypeMemory이면 MmMapIoSpace를 호출하여 번역된 리소스의 실제 주소와 길이를 전달합니다.
드라이버는 PnP 관리자로부터 IRP_MN_STOP_DEVICE 또는 IRP_MN_REMOVE_DEVICE 요청을 받으면 비슷한 루프에서 MmUnmapIoSpace 를 호출하여 매핑을 해제해야 합니다. 또한 드라이버는 IRP_MN_START_DEVICE 요청에 실패해야 하는 경우 MmUnmapIoSpace를 호출해야 합니다.
원시 리소스 유형은 드라이버가 호출해야 하는 HAL 액세스 루틴(READ_REGISTER_XXX, WRITE_REGISTER_XXX, READ_PORT_XXX, WRITE_PORT_XXX)을 나타냅니다. 드라이버 자체가 리소스를 요청했거나 드라이버 작성기가 디바이스 하드웨어의 특성에 따라 필요한 유형을 알고 있기 때문에 대부분의 드라이버는 원시 리소스 목록을 검사 사용할 루틴을 결정할 필요가 없습니다.
I/O 공간의 리소스(CmResourceTypePort, CmResourceTypeInterrupt, CmResourceTypeDma)의 경우 드라이버는 반환된 물리적 주소의 하위 32비트를 사용하여 HAL의 읽기 및 쓰기 READ_REGISTER_XXX, WRITE_REGISTER_XXX, READ_PORT_XXX, WRITE_PORT_XXX 루틴을 통해 디바이스 리소스에 액세스해야 합니다.