Tyr, the Rust GPU driver for Arm Mali, now boots its firmware in Linux 7.3 (6 unsafe lines out of ~3,700)
Rust 기반 Arm Mali GPU 드라이버 Tyr, Linux 7.3에서 펌웨어 부팅
Rust로 작성한 Linux 커널 GPU 드라이버 Tyr가 Linux 7.3에서 Arm Mali-G610의 MCU 펌웨어를 부팅합니다. GEM 공유 메모리, 페이지 테이블, GPUVM 추상화로 GPU 메모리 매핑 조건을 지키는 과정을 설명하며, 약 3,700줄 가운데 unsafe 연산은 6줄이라고 밝힙니다.
- 주제
에디터 노트
페이지 테이블의 기존 매핑을 덮어쓰지 않는 조건을 GPUVM으로 관리한다는 설명이 이 진전의 기술적 요점입니다. 펌웨어 주소가 고정된 간단한 경우에도 매핑 기록과 검증을 추상화에 맡겨 unsafe 호출의 전제 조건을 지킵니다. C 코드의 WARN_ON을 Rust API의 안전 요구사항으로 옮긴 과정도, 기존 커널 동작의 의미를 Rust 인터페이스에 어떻게 반영하는지 구체적으로 보여줍니다. 다만 MCU 펌웨어 부팅은 GPU 드라이버 기능 전체가 갖춰졌다는 뜻이 아닙니다. 원문은 작업 스케줄링 등 Panthor를 대체하기까지 남은 작업을 언급하고, 추상화가 발전하는 동안 Tyr를 여러 차례 다시 썼다고 설명합니다. 댓글의 3,700줄 중 unsafe 6줄이라는 반응은 코드의 안전 경계를 가늠하게 하지만, 추상화가 성숙해질 때 유지보수가 얼마나 쉬워질지는 아직 질문으로 남아 있습니다.
AI 요약
Tyr는 Arm Mali-G610용 Linux 커널 드라이버로, 기존 C 드라이버 Panthor를 사용자 공간 인터페이스 변경 없이 Rust로 옮기는 프로젝트입니다. Linux 6.18에 처음 병합된 뒤 GPU 탐색과 전원 제어 등을 지원했고, Linux 7.3에서는 GPU의 마이크로컨트롤러(MCU)에 펌웨어를 올려 실행하는 단계에 도달했습니다. MCU 부팅에는 펌웨어 메모리를 GPU가 접근할 수 있는 주소 공간에 배치하고, 매핑 충돌을 막는 메모리 관리 기반이 필요합니다.
MCU 펌웨어를 GPU 메모리에 올리는 과정
펌웨어는 Linux 펌웨어 저장소나 배포판 패키지에서 가져옵니다. 펌웨어 요청 API로 데이터를 읽는 것만으로는 GPU가 접근할 수 없으므로 Direct Rendering Manager(DRM)의 GEM 공유 메모리 버퍼에 넣어야 합니다. Rust GEM 공유 메모리 보조 기능은 Linux 7.1에 병합됐습니다.
GPU의 메모리 관리 장치(MMU)는 펌웨어를 여러 섹션으로 나눠 정해진 가상 주소에서 찾습니다. Tyr는 GPU가 지원하는 주소 범위를 기준으로 가상 주소 공간을 만들고, GEM 버퍼의 물리 메모리를 해당 GPU 가상 주소에 연결합니다. 이때 Rust 페이지 테이블 추상화를 사용합니다. 해당 추상화는 Linux 7.0에 병합됐습니다.
unsafe API가 요구하는 매핑 조건
Tyr의 약 3,700줄 가운데 unsafe 연산을 쓰는 부분은 6줄이며, 그중 3줄은 페이지 테이블 추상화와 관련됩니다. Rust의 unsafe 함수는 호출자가 지켜야 하는 안전 조건을 문서화합니다. 페이지 테이블의 map_pages()는 실행 중 같은 범위를 다른 작업이 건드리지 않도록 잠금을 보장하고, 이미 존재하는 매핑을 덮어쓰지 않으며, 매핑된 물리 메모리를 계속 유효하게 유지하도록 요구합니다.
이 조건은 기반이 된 C API의 가정에서 나왔습니다. C 구현은 기존 매핑을 발견하면 WARN_ON을 발생시키고 -EEXIST를 반환합니다. 오류 반환만 보면 호출자가 처리할 수 있는 상황이지만, 커널에서 경고는 예상 밖의 상태를 나타내도록 제한적으로 사용합니다. Rust 추상화는 이 경고를 바탕으로 기존 매핑 위에 새 매핑을 만들지 말라는 조건을 API에 명시했습니다.
고정된 펌웨어 주소에도 GPUVM을 쓰는 이유
Tyr는 GPU 가상 주소 공간의 매핑 정보를 기록하는 GPUVM 추상화를 사용합니다. GPUVM은 변경할 매핑을 추적하고 페이지 테이블에 반영하기 전에 필요한 해제나 재매핑을 조정합니다. 펌웨어 섹션의 주소와 크기를 미리 알고 서로 겹치지 않는 단순한 상황에서도 GPUVM을 쓰는 이유는, 페이지 테이블 API가 요구하는 매핑 불변 조건을 명시적으로 관리하기 위해서입니다. 자체 가정에 기대는 대신 추상화가 매핑을 추적하고 검증하게 합니다. Rust GPUVM은 Linux 7.2에 병합됐습니다.
메모리 관리 설정을 마친 뒤 Tyr는 COMMAND 레지스터에 UPDATE를 쓰고 MCU_CONTROL 레지스터를 설정해 MCU를 실행합니다. MCU 부팅은 필요한 메모리 관리 기반을 갖췄다는 진전이지만, Tyr가 Panthor를 대체하려면 작업 스케줄링 등 더 많은 기능이 필요합니다. Rust 커널 추상화와 드라이버 인터페이스가 계속 설계되는 동안 Tyr도 여러 차례 다시 작성됐고, 새 기능 개발은 추상화의 설계·검토·테스트·병합을 기다려야 했습니다. 한편 실제 드라이버 개발에서 드러난 요구와 한계는 이 추상화들을 개선하는 피드백으로 이어집니다.
Reddit 반응
- @mfilion — Arm Mali용 Tyr Rust GPU 드라이버를 다룬 Deb Brouwer의 새 글입니다. Rust 개발자에게 특히 흥미로운 부분은 C 페이지 테이블 코드의 WARN_ON이 Rust map_pages() API의 명시적 안전 조건으로 바뀐 과정, 펌웨어 주소가 단순하고 고정돼 있는데도 그 조건을 지키려고 전체 GPUVM 추상화를 쓰는 이유, 커널 Rust 추상화가 설계되는 동안 드라이버를 만드는 경험입니다. 저는 Tyr를 개발하는 Collabora에서 일합니다. Deb에게 질문을 전달할 수 있습니다.
- @Shnatsel — 인기 비디오게임과 이름이 겹칠 소프트웨어 프로젝트라니, 좋네요. 환영합니다.
- @GigglySpring — 적어도 이쪽 이름은 멋있네요.
- @Sky2042 — 수영복 브랜드가 GPU와 무슨 상관인지 궁금했어요.
- @sweating_teflon — 걱정 마세요. Tyr를 Try하고 나면 다 이해될 거예요.
- @butteryLinger — 3,700줄 중 unsafe가 6줄이라니 꽤 인상적이네요. 커널 Rust 추상화가 성숙해지면 드라이버 유지보수가 얼마나 쉬워질지 궁금합니다.
원문: Collabora / 번역·요약: Trawling