다음을 통해 공유


드라이버 로드 순서 지정

대부분의 시스템에서 컴퓨터의 디바이스 물리적 계층 구조는 Windows 및 PnP 관리자가 드라이버를 로드하는 순서를 결정합니다. Windows 및 PnP 관리자는 시스템 루트 디바이스부터 디바이스를 구성한 다음 루트 디바이스의 자식 디바이스(예: PCI 어댑터), 해당 디바이스의 자식 디바이스 등을 구성합니다. 드라이버가 이전에 다른 디바이스에 대해 로드되지 않은 경우 PnP 관리자는 디바이스가 구성될 때 각 디바이스에 대한 드라이버를 로드합니다.

INF 파일의 설정은 드라이버 부하 순서에 영향을 줄 수 있습니다. 이 항목에서는 드라이버의 INF AddService 지시문에서 참조하는 service-install-section에서 공급업체가 지정해야 하는 관련 값에 대해 설명합니다. 특히 이 항목에서는 StartType, BootFlags, LoadOrderGroup종속성 항목에 대해 설명합니다.

드라이버는 StartType을 지정하기 위해 다음 규칙을 따라야 합니다.

  • 부팅 초기에 PnP 드라이버가 필요하지 않음

    PnP 드라이버는 PnP 관리자가 드라이버가 서비스하는 디바이스를 발견할 때 PnP 관리자가 드라이버를 로드할 수 있도록 지정하는 시작 유형의 SERVICE_DEMAND_START(0x3)이어야 합니다.

  • 컴퓨터를 시작하는 데 필요한 디바이스용 드라이버

    디바이스가 컴퓨터를 시작해야 하는 경우 디바이스의 드라이버에 시작 유형의 SERVICE_BOOT_START(0x0)이 있어야 합니다.

  • PnP 열거할 수 없는 디바이스를 검색하는 부팅 시작 이 아닌 드라이버

    PnP 열거 가능하지 않은 디바이스의 경우 드라이버는 IoReportRootDevice 또는 IoReportDetectedDevice를 호출하여 디바이스를 PnP 관리자에 보고합니다. 이러한 드라이버에는 시스템 초기화 중에 Windows에서 드라이버를 로드할 수 있도록 시작 유형 SERVICE_SYSTEM_START(0x01)이 있어야 합니다.

    PnP가 아닌 하드웨어를 보고하는 드라이버만 이 시작 유형을 설정해야 합니다. 드라이버가 PnP 및 비 PnP 디바이스를 모두 서비스하는 경우 이 시작 유형을 설정해야 합니다.

  • 서비스 제어 관리자에서 시작해야 하는 PnP가 아닌 드라이버

    이러한 드라이버에는 시작 유형 SERVICE_AUTO_START(0x02)이 있어야 합니다. PnP 드라이버는 이 시작 유형을 설정해서는 안됩니다.

Windows에서 드라이버가 서비스하는 디바이스를 구성할 때 로드할 수 있도록 PnP 드라이버를 작성해야 합니다. 반대로 PnP 관리자가 드라이버 서비스에 더 이상 디바이스가 없다고 판단할 때마다 드라이버를 언로드할 수 있어야 합니다. PnP 드라이버가 따라야 하는 유일한 드라이버 로드 순서는 다음과 같습니다.

  1. 자식 디바이스의 드라이버는 부모 디바이스의 드라이버가 로드된다는 사실에 따라 달라질 수 있습니다.

  2. 디바이스 스택의 드라이버는 아래의 모든 드라이버가 로드된다는 사실에 따라 달라질 수 있습니다.

    예를 들어 함수 드라이버는 하위 필터 드라이버가 로드되는지 확인할 수 있습니다.

    그러나 디바이스 스택의 드라이버는 다른 디바이스가 구성되었을 때 이전에 드라이버가 로드되었을 수 있으므로 디바이스의 하위 드라이버 후에 순차적으로 로드되는 것에 의존할 수 없습니다.

필터 그룹의 필터 드라이버는 부하 순서를 예측할 수 없습니다. 예를 들어 디바이스에 등록된 상위 필터 드라이버가 3개 있는 경우 이러한 세 드라이버는 모두 함수 드라이버 다음에 로드되지만 상위 필터 그룹 내에서 순서대로 로드될 수 있습니다.

드라이버에 다른 드라이버에 대한 명시적 부하 순서 종속성이 있는 경우 부모/자식 관계를 통해 해당 종속성을 구현해야 합니다. 자식 디바이스용 드라이버는 자식 드라이버가 로드되기 전에 로드되는 부모 디바이스의 드라이버에 따라 달라질 수 있습니다.

올바른 StartType 값을 설정하는 중요성을 강화하기 위해 다음 목록에서는 Windows 및 PnP 관리자가 INF 파일에서 StartType 항목을 사용하는 방법을 설명합니다.

  1. 시스템 시작 시 운영 체제 로더는 컨트롤을 커널로 전송하기 전에 SERVICE_BOOT_START 형식의 드라이버를 로드합니다. 커널이 제어될 때 이러한 드라이버는 메모리에 있습니다.

    부팅 시작 드라이버는 대부분의 디바이스가 구성되기 전에 로드되므로 디바이스 계층 구조에서 부하 순서를 확인할 수 없습니다. 부팅 시작 드라이버는 INF LoadOrderGroup 항목을 사용하여 로드 순서를 지정할 수 있습니다. 운영 체제는 부팅 시작 드라이버에 대한 INF 종속성 항목을 무시합니다.

  2. PnP 관리자는 드라이버가 부팅 디바이스를 서비스할 수 있도록 SERVICE_BOOT_START 드라이버의 DriverEntry 루틴을 호출합니다.

    부팅 디바이스에 자식 디바이스가 있는 경우 해당 디바이스가 열거됩니다. 자식 디바이스는 드라이버가 부팅 시작 드라이버인 경우 구성되고 시작됩니다. 디바이스의 드라이버가 모든 부팅 시작 드라이버가 아닌 경우 PnP 관리자는 디바이스에 대한 디바이스 노드(devnode)를 만들지만 아직 디바이스를 시작하지는 않습니다.

  3. 모든 부팅 드라이버가 로드되고 부팅 디바이스가 시작되면 PnP 관리자는 나머지 PnP 디바이스를 구성하고 해당 드라이버를 로드합니다.

    PnP 관리자는 디바이스 트리 를 걷고 아직 시작되지 않은 devnodes (즉, 이전 단계의 시작되지 않은 devnode)에 대한 드라이버를 로드합니다. 각 디바이스가 시작될 때 PnP 관리자는 디바이스의 자식을 열거합니다(있는 경우).

    이러한 디바이스를 구성할 때 PnP 관리자는 디바이스를 시작하기 전에 드라이버의 StartType 값(StartType이 SERVICE_DISABLED 경우 제외)에 관계없이 디바이스에 대한 드라이버를 로드합니다. 이러한 드라이버의 대부분은 SERVICE_DEMAND_START 드라이버입니다.

    PnP 관리자는 이 단계에서 로드하는 드라이버에 대해 INF 종속성 항목 및 LoadOrderGroup 항목의 결과로 생성된 레지스트리 항목을 무시합니다. 부하 순서는 물리적 디바이스 계층 구조를 기반으로합니다.

    이 단계가 끝나면 PnP 열거 가능하지 않은 디바이스와 해당 디바이스의 하위 항목을 제외한 모든 디바이스가 구성됩니다. (하위 항목은 PnP 열거 가능하거나 그렇지 않을 수 있습니다.)

  4. PnP 관리자는 아직 로드되지 않은 StartType SERVICE_SYSTEM_START 드라이버를 로드합니다.

    이러한 드라이버는 PnP가 아닌 디바이스를 검색하고 보고합니다. PnP 관리자는 이러한 드라이버에 대한 INF LoadOrderGroup 항목의 결과인 레지스트리 항목을 처리합니다. 이러한 드라이버에 대한 INF 종속성 항목으로 인해 생성된 레지스트리 항목은 무시됩니다.

  5. 서비스 제어 관리자는 아직 로드되지 않은 StartType SERVICE_AUTO_START 드라이버를 로드합니다.

    서비스 제어 관리자는 서비스의 DependOnGroupDependOnServices와 관련하여 서비스 데이터베이스 정보를 처리합니다. 이 정보는 INF AddService 항목의 종속성 항목에서 가져옵니다. 종 속성 정보는 필요한 PnP 드라이버가 시스템 시작의 이전 단계에서 로드되었기 때문에 PnP가 아닌 드라이버에 대해서만 처리됩니다. 서비스 제어 관리자는 INF LoadOrderGroup 정보를 무시합니다.

    서비스 제어 관리자에 대한 자세한 내용은 Microsoft Windows SDK 설명서를 참조하세요.

BootFlags를 사용하여 부팅 시나리오에 따라 부팅 시 드라이버의 StartType 승격

운영 체제는 드라이버의 INF에 지정된 BootFlags 값에 따라 드라이버의 StartType을 부팅 시작 드라이버로 승격할 수 있습니다. INF 파일에서 16진수 값으로 표현되는 다음 숫자 값 중 하나 이상(ORed)을 지정할 수 있습니다.

  • 드라이버를 네트워크 부팅 시 부팅 시작 드라이버로 승격해야 하는 경우 0x1(CM_SERVICE_NETWORK_BOOT_LOAD )을 지정합니다.
  • VHD에서 부팅할 때 드라이버를 승격해야 하는 경우 0x2(CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD )을 지정합니다.
  • USB 디스크에서 부팅하는 동안 드라이버를 승격해야 하는 경우 0x4(CM_SERVICE_USB_DISK_BOOT_LOAD )을 지정합니다.
  • SD 스토리지에서 부팅하는 동안 드라이버를 승격해야 하는 경우 0x8(CM_SERVICE_SD_DISK_BOOT_LOAD )을 지정합니다.
  • USB 3.0 컨트롤러의 디스크에서 부팅하는 동안 드라이버를 승격해야 하는 경우 0x10(CM_SERVICE_USB3_DISK_BOOT_LOAD )을 지정합니다.
  • 측정된 부팅을 사용하도록 설정한 상태에서 부팅하는 동안 드라이버를 승격해야 하는 경우 0x20( CM_SERVICE_MEASURED_BOOT_LOAD )을 지정합니다.
  • 검증 도구 부팅을 사용하도록 설정한 상태에서 부팅하는 동안 드라이버를 승격해야 하는 경우 0x40(CM_SERVICE_VERIFIER_BOOT_LOAD )을 지정합니다.
  • WinPE 부팅에서 드라이버를 승격해야 하는 경우 0x80(CM_SERVICE_WINPE_BOOT_LOAD )을 지정합니다.

부팅 시나리오에 따라 부팅 시 드라이버의 StartType 을 승격하는 방법에 대한 자세한 내용은 INF AddService 지시문을 참조하세요.