- 이 글은 Rust로 개발된 리눅스 커널용 최신 GPU 드라이버 Tyr의 개발 과정과 GPU 드라이버의 동작 원리에 초점을 맞춤
- GPU 드라이버 개발에서 UMD(유저 모드 드라이버) 와 KMD(커널 모드 드라이버) 의 역할 구분과 상호 작용을 VkCube 예제를 통해 설명함
-
UMD는 고수준 API를 GPU가 이해할 수 있는 저수준 명령으로 변환하며, KMD는 메모리 할당, 작업 스케줄링, 장치 초기화 등 핵심 역할을 담당함
- Tyr 드라이버가 제공하는 API는 Panthor와 동일하며, 장치 쿼리, 메모리 관리, 그룹 관리, 작업 제출, Tiler 힙 관리 등으로 구성됨
- 다음 글에서는 Arm CSF 하드웨어 아키텍처와 핵심 구성요소(예: MCU) 및 부팅 과정을 다룰 예정임
소개: Rust 기반의 최신 GPU 커널 드라이버 개발
- 본 글은 리눅스 커널에서 Arm Mali CSF 기반 GPU를 지원하는 최첨단 Rust GPU 드라이버 Tyr 개발 시리즈의 두 번째 글임
- 실제 예제로서 Vulkan API를 사용해 회전하는 큐브를 렌더링하는 단순 3D 프로그램인 VkCube를 선택해 GPU 드라이버 내부 동작 방식을 설명함
- VkCube의 단순 구조는 GPU 드라이버 동작 원리를 학습하는 데 적합한 사례임
GPU 드라이버 기초: UMD와 KMD의 역할 및 구조
-
User Mode Driver(UMD) 와 Kernel Mode Driver(KMD) 로 구성됨
- UMD: panvk(Mesa의 Vulkan 드라이버 등)와 같이 일반 프로그램의 API(Vulkan, OpenGL 등)를 구현함
- KMD: Tyr 등, 하드웨어에 대한 권한 있는 커널 레벨 드라이버로, 리눅스 커널 일부로 동작함
- 커널 모드 GPU 드라이버는 컸던 UMD와 실제 GPU 사이를 연결하며, UMD는 API 명령어를 해석해 GPU가 이해할 수 있는 명령 집합으로 변환함
- UMD는 장면 구성에 필요한 지오메트리, 텍스처, 셰이더 등 데이터를 준비하고, 이를 실행 전에 KMD에게 GPU 메모리에 할당해 달라고 요청함
-
셰이더는 GPU에서 구동되는 독립적인 프로그램으로, VkCube에서는 큐브 배치, 컬러링, 회전 구현 등 역할을 담당함. 셰이더 실행에는 외부 데이터(지오메트리, 컬러, 회전 행렬 등)가 필요함
- UMD는 준비된 명령(예: VkCommandBuffers)을 KMD에 전달해 실행하며, 해당 작업이 완료되면 알림을 받아 결과를 메모리에 저장할 수 있음
KMD(커널 모드 드라이버)의 주요 책임
- GPU 메모리 할당 및 매핑(애플리케이션별로 격리 제공)
- 하드웨어 큐에 작업 제출 및 완료 시점 사용자에게 알림 제공
- 비동기·병렬 하드웨어 환경에서는 작업 의존성 관리가 필수적이며, 올바른 결과 확보를 위해 KMD가 스케줄링 및 의존성 검증 역할을 수행함
- 장치 초기화, 클럭/전압 레귤레이터 구동, 스타트업 코드 실행, 다수 클라이언트가 공평하게 하드웨어를 공유하도록 접근 로테이션 관리 등도 포함됨
복잡성의 위치: UMD와 KMD의 분업
- GPU 드라이버의 복잡성은 대부분 UMD에서 집중됨
- UMD: 고수준 API 명령어를 하드웨어 명령어로 변환
- KMD: UMD가 제대로 동작할 수 있도록 메모리 격리, 공유, 공평한 접근성 등 핵심 기능 제공
Tyr가 제공하는 드라이버 인터페이스(API) 구조
- Tyr 드라이버 API(=Panthor와 동일)는 크게 5개 그룹으로 분류할 수 있음
-
장치 정보 쿼리: DEV_QUERY(IOCTL로 GPU 하드웨어 정보 확인, ROM 영역 활용)
-
메모리 할당 및 격리: VM_CREATE, VM_BIND, VM_DESTROY, VM_GET_STATE, BO_CREATE, BO_MMAP_OFFSET 등
-
스케줄링 그룹 관리: GROUP_CREATE, GROUP_DESTROY, GROUP_GET_STATE(상세 설명은 후속 글 예정)
-
작업 제출: GROUP_SUBMIT(디바이스 명령 버퍼를 통해 GPU에 실행 요청)
-
Tiler 힙 관리: TILER_HEAP_CREATE, TILER_HEAP_DESTROY(타일드 렌더링 GPU의 메모리 요구 사항 충족)
- 해당 API들은 실제로 직접 그림을 그리는 작업과는 거리가 있지만, UMD가 실제 명령어 실행을 담당하고 KMD는 하드웨어 접근을 위해 위 인터페이스만 제공함
결론 및 이후 계획
- 이번 글에서는 GPU 드라이버의 전반적인 구조와 내부 흐름, 그리고 Tyr가 제공하는 핵심 API에 대해 살펴봄
- 이 내용을 토대로 시리즈의 후속 글에서 Arm CSF 하드웨어 아키텍처, 마이크로 컨트롤러 유닛(MCU) 등 핵심 구성요소 및 드라이버 초기화 과정을 다룰 예정임