지시된 전원 관리 프레임워크 소개
Windows 10 버전 1903부터 PoFx(런타임 전원 관리 프레임워크) 버전 3은 선택적 방향 전원 모델인 DFx(Directed PoFx)를 제공합니다.
DFx를 사용하면 시스템이 유휴 상태로 전환되고 정품 인증 소프트웨어 작업이 없을 때 운영 체제에서 디바이스 스택이 적절한 저전력 유휴 상태를 입력하도록 지시하므로 시스템이 저전력으로 보다 안정적으로 진입할 수 있습니다.
시스템 전원 효율을 높이고 폼 팩터에서 Windows 디바이스의 에너지 소비를 줄이기 위한 것입니다.
DFx는 현재 D-상태 제약 조건이 있는 디바이스에 대해서만 지원됩니다. DFx는 F-state 제약 조건이 있는 모든 디바이스 하위 트리를 건너뜁니다.
DFx는 페이징 또는 디버그 디바이스의 전원을 사용하지 않습니다.
WDF(미니포트가 아닌) 드라이버에 대한 요구 사항
전원 정책 소유자인 WDF 드라이버는 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 구조에서 SystemManagedIdleTimeout 또는 SystemManagedIdleTimeoutWithHint 를 지정하여 적절한 S0 유휴 정책을 구현해야 합니다. 이렇게 하면 디바이스가 유휴 상태일 때 전원이 닫을 수 있습니다. 추가된 복원력 측정값으로 드라이버는 DDInstall.HW 섹션 내의 INF의 AddReg 지시문 섹션에 다음 레지스트리 키를 추가하여 DFx를 옵트인할 수 있습니다.
HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,1
버전 31 이상을 대상으로 하는 WDF 드라이버는 기본적으로 DFx를 사용하도록 설정합니다. 원치 않는 경우 드라이버는 레지스트리 키를 0으로 설정하여 DFx를 옵트아웃할 수 있습니다.
HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,0
버전 33 이상을 대상으로 하는 WDF 드라이버는 WDF_POWER_FRAMEWORK_SETTINGS 구조체의 DirectedPoFxEnabled 멤버를 WdfFalse로 설정하여 DFx를 옵트아웃할 수 있습니다.
시스템 관리 유휴 시간 제한을 요청하면 WDF가 드라이버를 대신하여 PoFx에 등록되므로 이 시나리오에서는 드라이버가 PoFx에 등록할 필요가 없습니다.
드라이버가 DriverManagedIdleTimeout을 지정하는 경우 시스템 관리 유휴 시간 제한으로 전환하는 것이 좋습니다. 이것이 가능하지 않은 경우 아래 WDM 섹션의 지침을 사용하여 DFx를 옵트인합니다.
WDF 드라이버가 런타임 전원 관리를 사용하지 않는 경우 지원을 추가하고 시스템 관리 유휴 시간 제한을 사용합니다. 이렇게 하려면 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 구조를 WdfDeviceAssignS0Idle설정 입력으로 제공합니다.
WDM(미니포트가 아닌) 드라이버에 대한 요구 사항
드라이버가 WDF에서 제공하는 시스템 관리 유휴 지원을 사용하지 않는 경우(드라이버는 드라이버 관리 유휴를 사용하는 WDF 드라이버 또는 WDM 드라이버) PoFx에 등록하여 DFx 지원을 받을 수 있습니다. 이 시나리오에서 드라이버는 다음을 구현하여 PoFx에 등록합니다.
PoFxRegisterDevice 함수에 입력되는 PO_FX_DEVICE_V3 구조에서 이러한 콜백에 대한 포인터를 제공합니다.
DFx 지원을 받으려면 드라이버는 다음을 수행해야 합니다.
- PoFx에
PO_FX_DIRECTED_POWER*
등록할 때 콜백 제공 - 유휴 상태의 반환 시 PO_FX_DIRECTED_POWER_UP_CALLBACK 콜백 함수에서 PoFxReportDevicePoweredOn을 호출합니다. WDF 드라이버인 경우 플래그를 설정한 다음 EvtDeviceD0Entry에서 플래그를 검사 PoFxReportDevicePoweredOn을 호출할 수 있습니다.
- Sx 전환에서 다시 시작할 때 PoFxReportDevicePoweredOn을 호출합니다. WDF 드라이버인 경우 IRP_MN_SET_POWER 전처리해야 합니다. 전처리 콜백은 다음 경우에만
Parameters.Power.Type == SystemPowerState
진행해야 합니다. 디바이스가 절전/재개 주기의 전체 동안 Dx 상태로 유지될 수 있으므로 EvtDeviceD0Entry에서 플래그를 검사 위의 방법은 작동하지 않습니다. 대신 EvtDeviceWdmIrpPreprocess 이벤트 콜백 함수는 IoSetCompletionRoutine을 호출하여 IoCompletion 루틴을 설정하고 완료 루틴에서 PoFxReportDevicePoweredOn을 호출해야 합니다.
예시
다음 예제에서는 위에서 설명한 자체 등록 옵션을 보여줍니다.
PO_FX_DEVICE_V3 MyPoFxDevice;
POHANDLE MyPoFxHandle;
RtlZeroMemory(&MyPoFxDevice, sizeof(PO_FX_DEVICE_V3));
MyPoFxDevice.Version = PO_FX_VERSION_V3;
// Initialize other PoFx callbacks and other fields like
// components and their idle states.
MyPoFxDevice.DirectedPowerUpCallback = <Driver's DFx power up callback>
MyPoFxDevice.DirectedPowerDownCallback = <Driver's DFx power down callback>
Status = PoFxRegisterDevice(
<Driver's device object>,
(PPO_FX_DEVICE)&MyPoFxDevice,
&MyPoFxHandle);
if (!NT_SUCCESS(Status)) {
return Status;
}
드라이버가 이전에 지정한 PO_FX_VERSION_V1
경우 구조체는 PO_FX_DEVICE_V3
구성 요소 배열 구조에 사용됩니다 PO_FX_COMPONENT_V2
.
미니포트 드라이버에 대한 요구 사항
포트/미니포트 드라이버 모델을 따르는 디바이스 클래스의 경우 시스템 제공 포트 드라이버는 일반적으로 전원 정책 소유권을 처리합니다. 해당 포트 드라이버가 DFx 지원을 처리해야 하므로 대부분의 미니포트는 DFx를 옵트인하기 위해 코드 변경이 필요하지 않습니다.
KS.sys 타사 미니포트에 대한 지침
Windows 10 버전 2004(20H1 또는 빌드 19041라고도 함)부터는 기본적으로 DFx 및 관련 HLK 요구 사항을 옵트아웃하는 KS.sys. 타사 KS.sys 미니포트는 PoFx에 등록하고 KsDFxSupportEnable 레지스트리 키를 INF에 추가하여 DFx 및 관련 HLK에 옵트인할 수 있습니다.
드라이버는 이 섹션에 멘션 구현을 사용하여 PoFx에 등록할 수 있습니다. 또한 AddReg 지시문 섹션에 다음 줄을 추가해야 합니다.
HKR, , KSDFxSupportEnable, 0x00010001, 1
AddReg 섹션은 디바이스의 [DDInstall.HW] 섹션 또는 드라이버의 [service-install-section]에서 호출할 수 있습니다. [DDInstall.HW] 섹션에 추가하면 해당 특정 디바이스만 변경합니다. 이는 동일한 드라이버가 서로 다른 VID/PID 조합에 사용되지만 특정 디바이스에 대해서만 DFx를 사용하도록 설정해야 하는 경우에 유용합니다.
해당 드라이버를 사용하는 모든 디바이스에 대해 [service-install-section] 옵트인 DFx에 AddReg 섹션을 추가합니다.
테스팅
Microsoft는 DFx에 대한 세 가지 테스트, 즉 사용자 지정 디바이스를 테스트 하기 위한 Windows 드라이버 키트 의 단일 디바이스 테스트, 디바이스 수준 HLK 테스트 및 시스템의 모든 디바이스를 테스트하기 위한 시스템 수준 HLK 테스트를 제공합니다.
단일 디바이스 테스트는 WDK와 함께 제공되는 PwrTest 도구의 일부로 사용할 수 있습니다. 액세스하려면 스위치를 사용하여 도구를 실행합니다 /directedfx
. 자세한 내용은 PwrTest DirectedFx 시나리오를 참조 하세요.
HLK 테스트에 대한 자세한 내용은 다음 페이지를 참조하세요.
S4 전환 후 DFx 테스트는 S4에서 다시 시작한 후 드라이버가 PoFxReportDevicePoweredOn을 올바르게 호출하지 않을 수 있는 경우를 catch하는 것이 좋습니다.
DFx 및 S 상태 전환
- DFx 전환의 대상 D 상태는 S3/S4 전환의 대상 D 상태와 다를 수 있는 RTD3(런타임 D3)의 경우와 일치해야 합니다. 디바이스가 RTD3용 D2를 입력하지만 S3/S4용 D3을 입력하는 시나리오를 고려합니다. 이 경우 DFx의 대상 D 상태는 D2여야 합니다.
- 마찬가지로 DFx의 절전 모드 해제 동작은 RTD3의 경우와 일치해야 하며, 이는 S3/S4 전환에 사용된 동작과 다를 수 있습니다. 예를 들어 디바이스는 RTD3용 D2/wake-armed를 입력할 수 있지만 S3/S4의 경우 D3/no-wake-armed를 입력합니다. 이 시나리오에서는 DFx 전환도 D2/wake-armed로 입력해야 합니다.
DFx 및 런타임 D3(RTD3)
- RTD3을 사용하면 디바이스가 유휴 상태가 되면 일반적으로 더 낮은 전원 D 상태로 전환됩니다. 새 작업이 도착하면 디바이스가 즉시 D0으로 절전 모드 해제됩니다. DFx를 사용하면 PoFx가 전원을 백업하도록 지시할 때까지 디바이스가 대상 D-상태(및 큐에서 새 작업 보류)에서 계속 다시 기본 합니다.