ReBarUEFI: Resizable BAR for almost any UEFI system
ReBarUEFI: 거의 모든 UEFI 시스템에서 Resizable BAR 활성화
ReBarUEFI는 공식적으로 Resizable BAR를 지원하지 않는 UEFI 펌웨어에 DXE 드라이버를 추가해 그래픽카드의 BAR 크기를 조정하는 프로젝트입니다. 펌웨어 수정과 메모리 주소 공간 설정이 필요하며, 작성자는 RX 580에서 2GB BAR를 사용해 최대 12%의 FPS 향상을 측정했습니다.
- 주제
AI 요약
ReBarUEFI는 Resizable BAR를 공식 지원하지 않는 UEFI 시스템에서도 기능을 켜도록 돕는 DXE 드라이버입니다. Resizable BAR는 PCI 장치의 메모리를 CPU 주소 공간에 연결하는 창, 즉 Base Address Register(BAR)의 크기를 조절합니다. GPU는 전통적으로 256MB 안팎의 작은 창을 사용했지만, 창을 VRAM 크기에 가깝게 키우면 CPU가 한 번에 접근하는 GPU 메모리 범위가 넓어집니다. 프로젝트 설명에 따르면 성능 향상을 기대할 수 있으며, Intel Arc GPU를 최적으로 사용하려면 Resizable BAR가 필요합니다.
펌웨어에 드라이버 추가하기
사용자는 UEFI 펌웨어의 DXE 볼륨에 ReBarDxe 모듈을 넣어야 합니다. 프로젝트 위키의 FFS 모듈 추가 안내를 따라 펌웨어를 수정한 뒤, 부팅 설정에서 4G Decoding을 켜고 CSM을 꺼야 합니다. 4G Decoding은 선택 사항으로 안내하지만, 끄면 BAR 크기가 1GB 이하로 제한될 수 있습니다. 일부 시스템에서는 512MB까지만 사용할 수 있으며, TOLUD를 낮춰 최대 2GB까지 늘리는 방법도 소개합니다.
ReBarDxe는 PCI 호스트 브리지의 PciHostBridgeResourceAllocationProtocol에 있는 PreprocessController 함수를 교체합니다. 새 함수는 원래 함수를 실행한 뒤 장치가 Resizable BAR를 지원하는지 확인하고, ReBarState가 NVRAM에 저장한 크기로 BAR를 설정합니다. 이후 PCI 장치를 열거하는 PciBus 모듈이 변경된 BAR 크기를 확인해 주소 공간을 할당합니다. 사용자는 별도 도구인 ReBarState를 실행해 크기를 정합니다. Linux에서는 CMake로 빌드할 수 있으며, 대부분의 경우 32(unlimited)를 시도하되 작동하지 않으면 더 작은 값을 선택하라고 안내합니다.
구형 펌웨어의 제약과 패치
많은 UEFI 펌웨어가 64비트 BAR를 제대로 다루지 못해 별도 패치가 필요할 수 있습니다. 저장소는 4GB·16GB·64GB 미만의 BAR 크기 제한을 없애는 패치, 64비트 BAR가 32비트로 낮아지는 문제를 막는 패치, MMIO 주소 공간을 확장하는 패치를 제공합니다. Sandy Bridge부터 Coffee Lake까지 세대별 패치가 있으며, 일부 Ivy Bridge 보드는 DSDT 수정도 필요합니다. 그 밖에 NVRAM whitelist 때문에 ReBarState가 GetLastError: 5를 내는 문제, 4G Decoding을 켰을 때 USB 3 포트가 BIOS에서 작동하지 않는 문제, X79의 Above 4G Decoding 문제를 다루는 패치도 있습니다.
드라이버는 EDK2 트리에서 buildffs.py로 빌드하며, ReBarState는 Windows 또는 Linux에서 CMake로 빌드합니다. 프로젝트는 원래 PCIe Gen2 시스템에서는 작동하지 않을 것으로 예상했지만, i5-2500K 시스템에서 작동한 사례를 기록했습니다. 작성자는 i5-3470과 Sapphire Nitro+ RX 580 8GB 조합에서 BAR를 2GB로 설정하고 드라이버에서 Resizable BAR를 켰을 때 FPS가 최대 12% 올랐다고 보고합니다. 이는 해당 시스템에서 얻은 측정치입니다.
Linux에서는 4G Decoding을 켜면 최근 커널이 GPU BAR 크기를 자동 조정하고 할당할 수 있습니다. BIOS에 4G Decoding 항목이 없거나 DSDT가 잘못된 경우에는 DSDT를 수정하고 커널 명령줄에 pci=realloc을 추가하는 방법도 안내합니다. 반면 Windows에서는 BIOS를 수정하지 않고 Resizable BAR를 켜는 방법을 현재 알고 있지 않다고 설명합니다. 문제가 생기면 CMOS를 초기화해 기능을 끄라고 권합니다. 경우에 따라 CMOS 배터리를 빼야 할 수도 있습니다.
Hacker News 반응
- @bigwheels — 이게 무슨 일을 하나요? README를 훑어봤지만 ReBAR의 목적과 사용 사례를 아직 모르겠습니다. 다른 사람도 간단한 설명을 원할 것 같아 질문을 남깁니다.
- @mathisfun123 — 저장소 두 번째 문장에 성능 향상을 제공하며 Intel Arc GPU를 최적으로 쓰려면 필요하다고 적혀 있습니다.
- @qudat — 그 인용만으로는 이 프로젝트를 이해하기 어렵습니다. BAR가 뭔지, Resizable BAR는 뭔지 모르겠습니다. README가 바로 본론으로 들어가는 건 괜찮지만, 왜 Hacker News에 올라왔고 왜 관심을 가져야 하는지는 모르겠습니다.
- @pizza234 — ReBAR는 Resizable BAR(Base Address Register)의 약자입니다. CPU가 GPU 메모리에 접근하는 창의 크기를 조절합니다. 작은 단위로 접근하는 대신 더 많은 VRAM에 한 번에 접근해 일부 최신 GPU에서 성능을 높일 수 있습니다.
- @toast0 — BAR는 PCI 사양의 일부입니다. 펌웨어와 운영체제가 카드가 사용하는 메모리나 I/O 창의 크기를 확인하고, 시스템 펌웨어가 보통 그 주소 범위를 정하는 데 씁니다. 예전 시스템은 큰 BAR를 매핑할 주소 비트가 부족해 고정된 작은 크기를 사용했습니다. GPU에 VRAM이 16GB 있어도 256MB BAR만 지원하면 창을 옮기거나 페이지를 바꾸는 방식으로 접근해야 합니다. Resizable BAR는 호환성을 위해 작은 크기로 시작하되 지원하는 시스템에서는 창을 키웁니다.
- @wmf — CPU가 GPU VRAM 전체에 접근하게 해줍니다. 특히 AMD GPU에서 게임 성능이 좋아집니다.
- @willis936 — VRAM이 꽉 차서 시스템 메모리를 자주 오가는 상황이라면 주의해야 합니다. 그런 경우 ReBAR가 끊김의 빈도와 정도를 악화할 수 있습니다. 저는 8GB RTX 3070에서 그 문제를 겪었습니다.
- @Moto7451 — ReBAR 자체보다는 시스템 메모리로 페이징하는 상황을 겪은 것 같습니다. ReBAR는 메모리 복사 작업을 줄입니다. 물론 BIOS 버그일 가능성도 있습니다.
- @cesarb — PCI 장치는 메모리나 I/O 포트를 CPU 주소 공간에 매핑합니다. BAR는 그 위치를 정하는 레지스터입니다. 예를 들어 GPU는 8GB 크기의 BAR와 256MB 크기의 BAR를 노출할 수 있습니다. ReBAR를 지원하는 시스템은 더 큰 크기를 선택할 수 있으며, GPU가 8GB VRAM을 가졌다면 CPU가 VRAM 전체를 직접 읽고 쓸 수 있습니다. 작은 BAR를 쓰면 CPU가 보는 영역은 일부에 그쳐 더 간접적인 접근 방식이 필요합니다.
- @marcus9999 — Above 4G Decoding이 필요한 구형 워크스테이션 보드에서 BIOS 메뉴에 해당 옵션조차 없을 때 생기는 실제 불편을 해결해줍니다. 최근 X79 보드에서는 현대 GPU를 쓰려면 BIOS를 직접 패치해 기능을 드러내야 했습니다.
- @jedbrooke — 예전 X79 시스템에서 VRAM 12GB GPU를 쓰려고 BIOS를 직접 패치했던 기억이 납니다. 재미있는 일이었죠. 제 메인보드도 얼마 지나지 않아 알 수 없는 이유로 작동을 멈췄습니다.
- @zir_blazer — 이런 BIOS 개조가 Coreboot에 관심을 갖게 된 이유입니다. 독점 도구와 코드를 건드리지 않고 펌웨어 기능을 확장할 수 있습니다. 예전 펌웨어에 NVMe 부팅 기능을 추가하거나 공식 지원하지 않는 CPU를 쓰도록 마이크로코드를 넣는 개조도 있었습니다.
- @gregoryl — 하드웨어가 ReBAR를 지원하지만 Dell이 켜주지 않은 업무용 노트북에서 이게 작동할지 궁금합니다. 외장 Arc GPU로 화면 세 개를 제대로 쓰고 싶습니다. Dell의 드라이버와 펌웨어가 문제인데, 같은 하드웨어에서 세 화면을 지원합니다.
원문: GitHub / 번역·요약: Trawling