커널 모듈
gpu-unlock은 NVIDIA 드라이버가 카드를 잡기 전에 GPU 안의 SEC2 보안 프로세서에 변조된 입력을 먹여 권한 레지스터(PLM)를 열고, SM 명령 발행 속도 선택값(SS0/SS1)을 전속으로 바꾼 뒤 PCIe FLR로 GPU를 리셋하고 순정 nvidia 드라이버에 넘기는 리눅스 커널 모듈입니다. 드라이버를 패치하지 않기 때문에 NVIDIA가 새 드라이버를 내도 다시 패치할 필요가 없다는 것이 README가 내세우는 장점입니다. 커널 명령줄에 gpu_unlock.targets=를 적어야만 동작합니다.
대상은 GA102·GA103·GA104·GA106 계열 GeForce(RTX 3090 Ti·3090·3080·3070·3060 12GB 등)입니다. 효과는 FP16/BF16 입력을 FP32로 누적하는 FMA의 발행 속도가 2배가 되는 것이고, 전문가용 카드는 이미 전속이라는 점이 "원래 같은 칩의 상품 구분"이라는 맥락입니다(README: "professional equivalents").
차(GPU)의 엔진 출력은 같은데 특정 작업에서만 절반 속도로 묶는 제한값이 있습니다. 보통 그 값은 운전자(드라이버)가 타기 전에 이미 잠겨 있고, 운전자는 값을 못 바꿉니다.
이 모듈은 운전자보다 먼저 정비소(initramfs)에 들어가 자물쇠 장치의 허락 권한을 바꾸고, 제한값을 쓴 다음, 차를 한 번 껐다 켜서(FLR) 운전자에게 넘깁니다. 운전자는 값이 이미 바뀐 차를 그대로 몹니다.
| 입력 형식 | 풀기 전 | 풀린 뒤 | 증가율(계산) |
|---|---|---|---|
| FP16 | 87.46 TFLOPS | 118.39 TFLOPS | 약 +35% |
| BF16 | 87.50 TFLOPS | 157.41 TFLOPS | 약 +80% |
| TF32 | 42.58 TFLOPS | 82.61 TFLOPS | 약 +94% |
이 표는 현재 README가 인용하는 이슈 #1의 사용자 측정이며, 이 문서가 직접 측정한 값이 아닙니다. 명령 발행 속도 증가가 모든 작업의 같은 비율 성능 향상을 뜻하지는 않습니다. 전력·메모리 병목과 워크로드에 따라 결과가 달라집니다.
2026-10-27 Daily 모멘텀 순위 2위로 관측됐습니다. 관심의 중심은 소비자용 GPU의 특정 텐서 연산 제한을 드라이버 앞단에서 바꾸는 접근입니다. README의 3090 Ti 수치는 사용자 보고이며, 현재 개정 코드 전체의 재측정 결과로 읽으면 안 됩니다.
recipes.c, 펌웨어 공용 캐시는 firmware_610.c, Falcon 제어는 falcon.c로 나뉘었습니다.generate_v67.py와 JSON 입력 매니페스트가 사라졌습니다. NVIDIA 설치 파일에서 GSP를 추출하는 extract_gsp.py가 추가됐고 펌웨어 문서는 Python 3와 외부 zstd를 요구합니다.UEFI 방식과 달리 리눅스 initramfs에 통합하고 순정 드라이버에 넘기는 구조입니다. README는 별도 Windows 포트를 연결하지만 이 저장소가 Windows를 유지보수한다고 하지는 않습니다.
| 층 | 역할과 근거 |
|---|---|
| 커널 C / GPL-2.0 | main.c가 카드 선택·병렬 실행·PM 알림을 담당하고 unlock_610.c가 자원 수명과 실패 정리를 관리합니다. |
| 카드·펌웨어 모델 | recipes.h의 gu_card → gu_family → gu_fw_desc / gu_booter가 카드, 레지스터 표, 펌웨어 묶음의 관계를 분리합니다. |
| 추출 Python | fetch_artifacts.py, extract_gsp.py, extract_boot_assets.py. NVIDIA 610.43.03 입력을 고정하고 GSP·Booter·라이선스를 추출합니다. |
| 부트·패키징 | DKMS, mkinitcpio, initramfs-tools, dracut. Arch·Debian·RPM이 같은 Makefile 설치 타깃을 공유합니다. |
| 검증 도구 | tests/integration/의 커널 shim·C 장치 모델·Python 추적 판독기, tests/docker.sh의 배포판별 모듈/패키지 검사. |
프런트엔드나 웹 서버는 없습니다. firmware/NOTICE.md는 NVIDIA 오픈 모듈의 라이선스가 펌웨어까지 허가하는 것이 아니라고 구분합니다. 공개 재배포 승인을 주장하지 않으며 현재 펌웨어 입력·라이선스를 직접 확인해야 합니다.
initramfs: gpu_unlock 로드 (targets가 있어야 시작)
└─ main.c: PCI ID → gu_card_find() → 카드별 recipe
├─ 선택한 모든 펌웨어 계열의 공유 캐시 준비
├─ 준비 성공 카드만 비동기로 실행
│ └─ unlock_610.c: 상태 확인 → 메모리/펌웨어 처리
│ → 정상 서명 복원 → 결과 읽기 → FLR → 정리
└─ 모든 카드 완료 대기 → 공유 캐시 해제 → nvidia 바인딩
절전 복귀: PM_POST_SUSPEND + resume=true → 같은 카드 재확인
recipes.h는 카드의 PCI ID·칩 식별자와 계열별 펌웨어를 연결합니다. 같은 펌웨어 포인터를 공유하는 계열은 하나의 로드 슬롯을 쓰도록 설계됐습니다. main.c의 unlock_cards()는 먼저 모든 계열을 준비하고, 성공한 카드만 예약한 뒤 전체 완료를 기다립니다. 준비가 덜 된 공유 캐시를 병렬 실행에 노출하지 않는 순서가 핵심입니다.
gpu_unlock_610_unlock()은 실패 시 정상 서명 복원을 시도하고 공통 unwind로 갑니다. 펌웨어가 멈추지 않으면 DMA 버퍼를 해제하지 않고 장치·모듈 참조도 전원 차단까지 유지합니다. 아직 장치가 접근할 수 있는 메모리를 호스트가 재사용하지 않게 하는 수명 관리입니다.
resume은 기본 true이고 쓰기 가능한 bool 모듈 파라미터입니다. PM 알림은 우선순위 1로 등록돼 일반적인 NVIDIA 알림보다 먼저 돌며, 복귀 시 현재 드라이버 이름이 nvidia인 카드만 재확인합니다. 이미 목표 상태이면 -EALREADY로 기록합니다. README는 gpu_unlock.resume=0 또는 대응 sysfs 파라미터로 이 동작을 끌 수 있고 최대 절전 모드는 다루지 않는다고 설명합니다.
이 SHA의 recipes.c에는 GA100·AD102 계열 정의가 있지만, gu_card_find()가 검색하는 cards[]에는 GA102·GA103·GA104·GA106 항목만 있습니다. README의 RTX 4090 언급만으로 이 커밋의 모듈이 4090을 선택한다고 단정할 수 없습니다. NOTICE도 개정 경로의 실제 하드웨어 반복 검증이 필요하다고 밝힙니다.
gpu-unlock/
├── README.md / VERSION 사용 조건 / 1.1.0
├── Makefile 입력·추출·배포판별 패키징
├── kernel/gpu_unlock/
│ ├── main.c 선택·공유 준비·병렬 실행·복귀
│ ├── recipes.c / recipes.h 카드와 계열별 데이터 정의
│ ├── firmware_610.c 공유 펌웨어 로딩·검증
│ ├── falcon.c Falcon 엔진 제어
│ ├── payload.c 입력 버퍼 구성
│ ├── unlock_610.c 카드별 트랜잭션·FLR·정리
│ └── layout_610.c / prep_610.c / vbios_610.c
├── firmware/ 입력 다운로드·GSP/부트 자산 추출·NOTICE
├── packaging/ / debian/ DKMS·부트 드롭인·패키지
└── tests/
├── integration/ shim·장치 모델·실행 증거 판독
├── docker.sh 배포판 컨테이너 검사
└── packaging/install.sh 설치·제거 검사
예전 tests/test_main.c·tests/test_layout_610.c 등 개별 하니스와 firmware/generate_v67.py는 이 SHA에서 삭제됐습니다. 이전 문서의 파일명·줄 수를 그대로 따라가면 안 됩니다. recipes.h → main.c → 트랜잭션 진입부 → 통합 테스트 문서 순서로 읽으면 데이터와 실행 책임을 나눠 볼 수 있습니다.
| 학습 주제 | 코드에서 확인할 것 | 읽기 과제 |
|---|---|---|
| 데이터 중심 설계 | gu_card / gu_family / gu_fw_desc | 정의된 계열과 cards[]에서 실제 선택 가능한 항목을 구분해 표로 정리합니다. |
| 공유 자원과 병렬성 | unlock_cards() | 준비가 모두 끝난 뒤 예약하고 전체 완료 뒤 캐시를 해제하는 이유를 설명합니다. |
| 장치 수명 관리 | unlock_transaction_unwind(), retained | 실패 후 즉시 해제하면 안 되는 자원을 찾아봅니다. |
| 전원 상태 이벤트 | PM_POST_SUSPEND, resume 파라미터 | 부팅 경로와 복귀 경로의 드라이버 바인딩 조건을 비교합니다. |
| 검증 결과 모델 | tests/integration/README.md | driver_result와 실제 펌웨어 실행·목표 쓰기·unlock_verified가 왜 별도 값인지 정리합니다. |
| 항목 | 확인된 조건 |
|---|---|
| 대상 GPU | 이 SHA의 cards[]는 GA102·GA103·GA104·GA106 PCI ID를 열거합니다. 다른 계열 정의의 존재만으로 실제 지원을 확정하지 않습니다. |
| 실행 환경 | 리눅스 커널 모듈·해당 커널 헤더·DKMS·C 도구체인. 순정 NVIDIA 드라이버가 바인딩하기 전 부트 순서가 필요합니다. |
| 펌웨어 추출 | 현재 문서는 Python 3와 zstd, 고정 NVIDIA 610.43.03 입력을 요구합니다. 이전 Python 3.14 전용 설명은 제거됐습니다. |
| 장치 조건 | 전원 상태·PCIe FLR·칩 식별·보호 메모리 상태 등을 코드가 검사하며, 이미 다른 드라이버가 사용한 카드는 조건에 따라 거부됩니다. |
| 통합 하니스 | 외부 debug 키·별도 debug 펌웨어·Falcon 환경이 필요합니다. 문서상 최종 clean-halt/target-write/unlock 검증은 현재 실패합니다. |
설치·부팅 변경은 GPU와 부트 이미지를 실제로 바꿉니다. 본문은 소스 검토를 기준으로 하며 여기서 실행 검증을 하지 않았습니다. 실패 후 장치 펌웨어가 멈추지 않으면 전원을 차단하기 전 재시도하지 말라는 지침이 README에 있습니다. 최대 절전 모드는 지원 범위에 포함되지 않습니다.
README의 이전 사용자 측정과 새 통합 하니스의 실패는 서로 다른 증거입니다. 앞의 성능 표로 현재 개정 경로의 성공이나 모든 GPU 호환성을 보증할 수 없습니다. NVIDIA 펌웨어 배포 조건도 별도로 남습니다.
git show 6081407b312aa3139a2bed62bdda354f4ffddc1d:kernel/gpu_unlock/recipes.c
# cards[]와 gu_card_find()를 읽고 정의만 있는 계열을 구분합니다.
산출물은 실제 열거되는 계열 목록입니다. README의 지원 설명과 차이가 있으면 그 차이를 기록합니다.
main.c의 unlock_cards()를 읽고 두 list 순회와 전체 대기의 역할을 표시합니다. 펌웨어 준비 실패 카드가 실행 예약에서 제외되는지 확인합니다.
unlock_one()과 unlock_again()의 드라이버 확인 조건을 표로 비교합니다. 기본 resume 값, 알림 이벤트, 비활성화 조건을 소스에서 찾습니다.
통합 테스트 문서에서 반환값, 펌웨어 실행 여부, 최종 검증값을 따로 정리하고 현재 실패한 단계를 표시합니다. 외부 키·펌웨어가 없는 상태를 성공으로 바꾸지 않는 것이 과제입니다.
| 주차 | 주제 | 할 일 |
|---|---|---|
| 1주 | 리눅스 모듈과 PCI | 빈 모듈 만들기, lspci -vv 해석, main.c 읽기 |
| 2주 | GPU 부팅 구조 | recipes.h의 계열·펌웨어 관계 그리기, NVIDIA 오픈 모듈 소스의 GSP·FWSEC 용어 찾기 |
| 3주 | 상태 기계와 실패 처리 | unlock_610.c의 트랜잭션·언와인드·FLR 검증 분석 |
| 4주 | 패키징과 공급망 | 입력 해시 고정, DKMS, initramfs 드롭인 비교. 취약점 책임 있는 공개와 펌웨어 라이선스 쟁점 정리 |
| 용어 | 뜻 (이 레포 기준) |
|---|---|
| SEC2 | GPU 안의 보안 프로세서. 서명된 Booter 펌웨어를 실행해 GSP-RM을 인증·로드 |
| Booter / V67 | SEC2용 서명 펌웨어 / 이 프로젝트의 권한 변경 입력 구성에 쓰는 이름. 현재는 payload.c와 recipes.c에 소스로 들어 있습니다. |
| PLM | Privilege Level Mask. 레지스터별 읽기·쓰기 허용 권한 마스크. FEAT_OVR_PLM 0x00823804 |
| SS0 / SS1 | SM 명령 발행 속도 선택 레지스터 두 개 (0x0082381c, 0x00823820) |
| FLR | PCIe Function Level Reset. 장치 기능 하나를 리셋. 선택값은 FLR 후에도 유지된다고 코드가 가정 |
| WPR2 | 보호된 VRAM 영역. 이미 켜져 있으면 드라이버가 사용한 카드로 보고 모듈이 거부 |
| FWSEC / FRTS | VBIOS 속 보안 펌웨어 / 그것이 하는 영역 설정 작업 |
| GFW | 보드 펌웨어. 부팅 완료 여부를 상태 레지스터로 보임 |
| DKMS | 커널이 바뀔 때마다 모듈을 자동 재빌드하는 시스템 |
| BME | PCI Bus Master Enable. 장치가 직접 메모리에 쓰는 DMA 권한 |