- 이 저장소는 NVIDIA Linux 오픈 GPU 커널 모듈 소스 릴리스이며, README 기준 버전은 565.57.01임
- 빌드한 커널 모듈은 같은 565.57.01 드라이버 릴리스의 GSP 펌웨어와 사용자 공간 NVIDIA GPU 드라이버 구성요소와 함께 사용해야 함
- 지원 대상은 x86_64와 aarch64이며, Linux 커널은 독점 NVIDIA 커널 모듈과 같은 범위를 지원하고 현재 기준 4.15 이상임
- 커널 모듈은 운영체제 독립 구성요소와 Linux 커널 인터페이스 계층으로 나뉘며, 대상 커널에 맞춰 커널 인터페이스 계층을 빌드해야 함
- 호환 GPU는 Turing 이후 GPU이며, 표에는 NVIDIA GeForce RTX 4090을 포함한 여러 GeForce, RTX, A/H/L 시리즈 제품과 PCI ID가 나열됨
릴리스와 빌드 조건
- 이 저장소는 NVIDIA Linux open GPU kernel modules의 소스 릴리스이며 버전은 565.57.01임
- 기본 빌드 명령은 다음과 같음
make modules -j$(nproc)
- 설치 전에는 기존 NVIDIA 커널 모듈을 제거해야 하며, root 권한으로 다음을 실행함
make modules_install -j$(nproc)
- 여기서 빌드한 커널 모듈은 대응되는 565.57.01 드라이버 릴리스의 GSP 펌웨어와 사용자 공간 NVIDIA GPU 드라이버 구성요소가 필요함
- NVIDIA GPU 드라이버
.run파일을--no-kernel-modules옵션으로 설치하는 방식이 예시로 제시됨
- NVIDIA GPU 드라이버
지원 아키텍처와 도구체인
- 커널 모듈은 현재 x86_64 또는 aarch64용으로 빌드할 수 있음
- 교차 컴파일 시
TARGET_ARCH=aarch64|x86_64와 함께CC,LD,AR,CXX,OBJCOPY를 make 명령줄에서 지정함 - GCC 또는 Clang의 비교적 최신 버전으로 빌드할 수 있음
- 커널 모듈의 커널 인터페이스 계층은 대상 커널을 빌드할 때 사용한 도구체인으로 빌드해야 함
- 지원 Linux 커널 버전은 독점 NVIDIA 커널 모듈이 지원하는 범위와 같으며, 현재 Linux kernel 4.15 이상임
빌드 옵션
NV_VERBOSE=1은 실행되는 전체 명령을 출력함- 기본값에서는 간단한
CC줄만 출력됨
- 기본값에서는 간단한
DEBUG=1은 커널 모듈을 디버그 빌드로 컴파일함- 기본 빌드는 디버깅 정보 없이 컴파일됨
- 이 옵션은 커널 모듈의 여러 디버그 로그 메시지도 활성화함
커널 모듈 구조
- NVIDIA 커널 모듈 대부분은 두 구성요소로 나뉨
- OS-agnostic 구성요소: 운영체제와 독립적인 부분
- kernel interface layer: Linux 커널 버전과 설정에 특화된 부분
- NVIDIA
.run설치 패키지에서는 OS-agnostic 구성요소가 바이너리로 제공됨- 이 구성요소는 크고 컴파일 시간이 오래 걸려, 매 드라이버 설치 때 사용자가 다시 컴파일하지 않도록 사전 빌드 버전이 제공됨
nvidia.ko의 해당 구성요소 이름은nv-kernel.o_binarynvidia-modeset.ko의 해당 구성요소 이름은nv-modeset-kernel.o_binarynvidia-drm.ko와nvidia-uvm.ko에는 OS-agnostic 구성요소가 없음
- 각 커널 모듈의 커널 인터페이스 계층은 대상 커널에 맞춰 빌드해야 함
디렉터리 구성과 Nouveau 연동
- 주요 디렉터리 역할은 다음과 같음
kernel-open/: 커널 인터페이스 계층kernel-open/nvidia/:nvidia.ko용 커널 인터페이스 계층kernel-open/nvidia-drm/:nvidia-drm.ko용 커널 인터페이스 계층kernel-open/nvidia-modeset/:nvidia-modeset.ko용 커널 인터페이스 계층kernel-open/nvidia-uvm/:nvidia-uvm.ko용 커널 인터페이스 계층src/: OS-agnostic 코드src/nvidia/:nvidia.ko용 OS-agnostic 코드src/nvidia-modeset/:nvidia-modeset.ko용 OS-agnostic 코드src/common/:nvidia.ko와nvidia-modeset.ko중 하나 이상에서 쓰는 유틸리티 코드nouveau/: Nouveau 장치 드라이버 연동 도구
nouveau디렉터리의 Python 스크립트는 소스 코드에 인코딩된 일부 펌웨어 바이너리 이미지와 관련 데이터를 추출해 별도 파일로 저장함- 이 파일들은 Nouveau 장치 드라이버가 GSP 펌웨어를 로드하고 통신하는 데 사용됨
- 바이너리 파일 레이아웃은
nouveau_firmware_layout.ods에 설명되어 있으며, 이 파일은 OpenDocument Spreadsheet 형식임
기여와 이슈 처리
- 기여는 NVIDIA의
open-gpu-kernel-modules저장소에 pull request를 만드는 방식으로 진행함 - pull request 제출 시 Contributor License Agreement 수락이 요구됨
- 이 코드베이스는 NVIDIA 독점 드라이버와 공유되며, 공개 소스는 공유 코드에 여러 처리를 거쳐 생성됨
- GitHub 저장소는 주로 각 드라이버 릴리스의 스냅샷처럼 동작함
- NVIDIA 공유 코드베이스에서 이뤄진 개별 변경의 revision history 제공은 기대하기 어려움
- 드라이버 릴리스마다 git commit이 하나만 있을 가능성이 큼
- 개별 기여가 GitHub 저장소에서 별도 git commit으로 반영되지 못할 수 있음
- 공개 전 처리 과정 때문에 기여를 공유 코드베이스에 적용하려면 수동 병합이 필요함
- 큰 리팩터링은 병합과 수용이 어려울 수 있어 사전 연락과 조율이 필요함
- Open GPU Kernel Modules 관련 문제는 NVIDIA 저장소의 Issues, NVIDIA 개발자 포럼,
linux-bugs@nvidia.com으로 전달할 수 있음 - 보안 취약점을 발견한 경우 별도
SECURITY.md문서를 확인해야 함
호환 GPU 범위
- NVIDIA 오픈 커널 모듈은 Turing 이후 GPU에서 사용할 수 있음
- 기능 지원과 제한 사항의 세부 내용은 NVIDIA GPU driver end user README의
kernel_open.html문서를 참조하도록 되어 있음 - vGPU 지원은 vGPU Host Package에 포함된
README.vgpu를 참조해야 함 - 호환 GPU 표는 제품명과 PCI ID를 함께 나열함
- 세 개의 ID가 있는 경우 첫 번째는 PCI Device ID, 두 번째는 PCI Subsystem Vendor ID, 세 번째는 PCI Subsystem Device ID임
- 표에는 NVIDIA GeForce RTX 4090, NVIDIA GeForce RTX 4090 D, NVIDIA GeForce RTX 4080 SUPER, NVIDIA GeForce RTX 4070 Ti SUPER, NVIDIA H100, NVIDIA H200, NVIDIA GH200, NVIDIA L40S 등 여러 제품이 포함됨