windows에서 드라이버를 설치하기 위해서는 필수 파일인 inf 파일에 대해서 좀 더 자세히 알아보려고 한다.
%SystemRoot% -> C:\Windows를 의미
사용자가 장치 관리자에서 드라이버 업데이트를 누르거나, CLI에서 pnputil /add-driver npu_driver.inf 명령어를 실행하는 순간 드라이버 스테이징 또는 사전 설치가 발생한다. 이 과정에서 복사가 일어난다.
장치가 실제로 컴퓨터에 장착되었을 때, OS가 드라이버를 1초 만에 찾아서 로드할 수 있도록 정렬해 두는 것이라고 한다.

경로: HKLM\SYSTEM\CurrentControlSet\Services
INF 파일이 %SystemRoot%\Inf에 복사되었다고 해서 바로 레지스트리에 서비스가 등록되는 것은 아니다. 레지스트리 등록은 장치락 실제로 시스템에 인식되어 드라이버와 짝지어지는 시점에 일어난다.

장착된 device의 하드웨어 ID를 추출하여 OS가 %SystemRoot\Inf 폴더에서 찾아서, 해당 하드웨어 ID와 일치하는 [Manufacturer] 섹션을 가진 INF 파일을 찾아낸다.
일치하는 INF를 찾으면, 그 내부의 명세서대로 레지스트리에 서비스를 생성하고 장치 정보를 등록한다.

실제로 npu를 장착하고 장치 관리자에서 하드웨어 ID를 확인하면 위 사진과 같다.
그렇다면 INF 파일의 [Manufacturer] 섹션을 확인해 보겠다.

Manufacturer 섹션을 확인해 보면 모델 이름이 나오고 해당 모델 이름을 가진 섹션을 찾아가 보면 [Standard.NTamd64.10.0...16299]을 확인할 수 있다.
내용을 보면 PCI\VEN_1AC1&DEV_089A&SUBSYS_089A1AC1&REV_00으로 나와있는 것을 확인할 수 있는데 이 부분은 개발자가 하드웨어 ID를 입력해서 넣어준 부분이다. 따라서 npu device에 올릴 드라이버를 지정해 준 것으로 볼 수 있다.
HKLM\SYSTEM\CurrentControlSet\Services를 살펴보면 npu_driver가 레지스트리에 등록된 것을 확인할 수 있다.

Enum키는 드라이버가 현재 어떤 실제 하드웨어 장치들을 지배하고 있는지 역으로 추적할 수 있게 해주는 연결고리라고 보면 된다.

0의 경우 장치 인스턴스 ID를 저장한다. 현재는 npu 카드 하나만 꽂았기 때문에 0만 존재하지만 여러 카드를 꽂게 되면 여러 개로 등록된다고 한다.
parameters키는 온전히 NPU 드라이버 개발자를 위한 키라고 보면 된다.
드라이버가 로드될 때 참조해야 하는 각종 커스텀 설정이나 환경 변수 값들을 저장하는 곳이다.
; -------------- npu_driver driver install sections
[npu_driver_Service_Inst]
DisplayName = %npu_driver.SVCDESC%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %13%\npu_driver.sys
위 내용은 Pnp관리자가 설치 단계에서 레지스트리에 서비스 명세서를 적을 때 사용이 된다.

위에 레지스트리 값들에 맵핑 시켜준다고 보면 된다. 그 후 실제로 실행 타이밍에(드라이버가 로드될 때) 레지스트리에 적힌 이 값들을 보면서 설정한 데로 동작한다.
inf 파일이 driver 개발함에 있어서 필요하다는 것은 알고 있었는데 어떻게 동작하는지는 몰랐다. 이번 포스팅을 하면서 알게 된 것 같다.