vnpu 개발기 #3 - 빈 NPU 디바이스를 꽂고 드라이버로 잡기

드라이버보다 디바이스를 먼저 만들었다. 드라이버가 probe할 대상이 없으면, 드라이버를 짜도 돌려 볼 방법이 없어서다. QEMU에서 PCI 디바이스를 만드는 건 PCI 설정 공간을 채우는 일부터 시작한다. 리눅스는 부팅할 때 PCI 버스를 훑으면서 장치마다 벤더 ID, 디바이스 ID, 클래스 코드를 읽고, 그 값에 맞는 드라이버를 찾아 붙인다. 벤더 ID는 QEMU가 자체 가상 장치에 쓰는 0x1234를 썼다. 디바이스 ID는 0x4e50으로 직접 골랐다. 0x1234 안에서 비어 있는 번호이고, ASCII로 읽으면 “NP"다. 클래스 코드는 처리 가속기를 뜻하는 0x1200이다. 리눅스에는 이 값의 이름(PCI_CLASS_ACCELERATOR_PROCESSING)이 있는데 QEMU에는 없어서, 같은 이름으로 하나 추가했다. ...

September 28, 2026 · 1 min · Donggeun Yoo

vnpu 개발기 #2 - 개발 환경 세팅

NPU 디바이스를 어디에 만들지부터 정해야 했다. 앞으로 만들 NPU 드라이버가 잡을 NPU는 QEMU에 없으므로, 드라이버를 돌리려면 디바이스 모델부터 직접 만들어야 한다. 방법은 두 가지였다. 하나는 QEMU 소스를 받아서 hw/misc 아래에 PCI 디바이스로 직접 넣는 것이고, 다른 하나는 libvfio-user로 디바이스를 별도 프로세스로 만들고 QEMU는 vfio-user로 붙이는 것이다. QEMU 포크로 정했다. QEMU에 디바이스가 들어가는 원래 방식 그대로라서다. 대신 QEMU 전체를 소스에서 빌드해야 한다. 기준은 QEMU 최신 안정판인 11.1.1로 잡았다. VM에서 돌릴 커널도 최신 릴리스인 7.2로 새로 빌드했다. 이전 프로젝트에서 쓰던 커널은 accel 서브시스템(CONFIG_DRM_ACCEL)이 꺼져 있어서 그대로 쓸 수 없었다. ...

September 28, 2026 · 1 min · Donggeun Yoo

vnpu 개발기 #1 - NPU 디바이스와 드라이버를 밑바닥부터 만들기

이 프로젝트는 NPU 디바이스와 그 리눅스 드라이버를 밑바닥부터 직접 만드는 것이다. 디바이스는 QEMU 안에 에뮬레이션 모델로 만들고, 드라이버는 그 디바이스를 잡는 accel 드라이버로 만든다. 레퍼런스로는 인텔 NPU 드라이버인 drivers/accel/ivpu를 삼았다. 헤더 포함 소스 코드가 1만 5천 줄 정도 되는데, 이 드라이버가 할 수 있는 건 전부 할 수 있게 만드는 게 목표다. ivpu는 NPU 드라이버가 어떤 일들을 처리해야 하는지 파악하는 용도로만 보고, 코드는 전부 새로 짠다. 보면서 더 낫게 만들 수 있겠다 싶은 부분은 바꿔 볼 거고, 결국 ivpu랑 같은 방식을 택하게 되는 곳도 당연히 있을 수 있다. ...

September 28, 2026 · 1 min · Donggeun Yoo