- Nintendo 3DS는 스마트폰과 앱스토어가 커지던 시기의 휴대용 콘솔로, 무안경 입체 3D와 듀얼 스크린, 하위 호환 CPU, 다양한 I/O를 복잡한 SoC 구조 안에 묶음
- 상단 800×240 LCD는 반폭 픽셀과 패럴랙스 배리어로 400×240 프레임 2개를 동시에 보여주며, 깊이 슬라이더와 New 3DS의 얼굴 추적으로 시야각·피로 문제를 줄임
- 기본 모델은 268MHz ARM11 MPCore 2코어, 128MB FCRAM, DMP PICA200 GPU, CEVA TeakLite II DSP를 사용했고, New 3DS는 804MHz 4코어와 256MB FCRAM, NFC, 개선된 입체 시야 시스템을 더함
- 내부에는 ARM11 외에도 DS용 ARM946E-S와 GBA용 ARM7TDMI가 들어 있어 Native 3DS, Nintendo DSi, Game Boy Advance 모드로 전환되지만, 개발자는 보통 ARM11 MPCore만 직접 다룸
- 운영체제와 보안은 NATIVE_FIRM, TWL_FIRM, AGB_FIRM, SAFE_FIRM, Boot9/Boot11, AES/RSA/OTP 기반 신뢰 체인으로 구성됐고, 여러 취약점을 거치며 홈브루와 커스텀 펌웨어 생태계가 발전함
모델 계열과 하드웨어 세대
- Nintendo는 3DS 수명주기 동안 여러 개정 모델을 출시해 가격대와 사용자층을 나눔
- 아키텍처 관점의 모델은 6종으로 나뉨
- Nintendo 3DS(2011), Nintendo 3DS XL(2012): 원래 아키텍처 기반이며 XL과 비 XL의 주요 차이는 화면 크기임
- Nintendo 2DS(2013): 입체 화면을 제거하고 Game Boy에서 영감을 받은 형태를 사용한 저가형 모델임
- New Nintendo 3DS(2014), New Nintendo 3DS XL(2015): 하드웨어 업그레이드, NFC 리더, 더 많은 버튼, 개선된 입체 시스템을 추가함
- New Nintendo 2DS XL(2017): New Nintendo 3DS XL에서 입체 기능을 뺀 저가형 모델임
- 게임의 공통 기준은 원래 Nintendo 3DS이며, New 계열은 별도 하드웨어 차이가 큼
무안경 3D 디스플레이
- Nintendo 3DS는 Nintendo DS의 후속기처럼 LCD 2개를 탑재하고, 상단 화면은 800×240 픽셀 사양으로 깊이감을 표시함
- 입체 효과는 Virtual Boy와 같은 입체 시차(stereoscopic parallax) 원리를 사용함
- 왼쪽 눈과 오른쪽 눈에 서로 조금 다른 이미지를 보여줌
- 두 이미지의 중심 위치 차이로 물체가 앞뒤에 있는 것처럼 인식됨
- 상단 LCD는 물리적으로 반폭 픽셀로 구성되고 두 모드로 동작함
- 2D 모드: 가로 픽셀 2개를 하나처럼 취급함
- 3D 모드: 모든 픽셀을 개별로 사용해 400×240 프레임 2개를 동시에 표시함
- 패럴랙스 배리어는 LCD 픽셀 뒤의 백라이트를 분리해 각 눈이 서로 다른 픽셀 부분집합을 보도록 만듦
- 이 방식에는 제약이 있음
- 추가 밝기가 필요해 배터리 사용 시간에 영향을 줌
- 화면이 눈 기준으로 기울어지면 두 시차 프레임이 섞여 보이고 눈 피로가 커질 수 있음
- 고정된 자세와 빠른 눈 피로 때문에 3D 기능이 번거로워질 수 있음
- 3D 깊이 슬라이더는 두 프레임 간 차이를 늘리거나 줄여 깊이 효과를 조절함
- New 3DS는 전면 카메라와 적외선 LED를 이용한 얼굴 추적으로 기울임 문제를 완화함
- 게임은 GPU에 일반 프레임을 그리듯, 같은 장면을 약간 이동한 프레임 2개로 렌더링해야 함
- 공식 API는 두 개의 투영 행렬을 구성하는 루틴을 제공함
CPU, 메모리, 하위 호환 구조
- 메인 SoC인 CPU CTR은 저장장치와 RAM을 제외한 대부분의 시스템을 담음
- Nintendo는 ARM과 협력해 ARM11 MPCore 기반 CPU 클러스터를 구성함
- 원래 3DS: MP11 코어 2개, 각 268MHz
- New 3DS: MP11 코어 4개, 각 804MHz, 공유 2MB L2 캐시
- ARM11은 ARMv6k 명령어 집합을 사용하며, Thumb, Jazelle, VFP 같은 구성요소도 포함함
- ARMv6은 정수 SIMD 명령과 멀티코어 동기화용 load/store 명령을 제공함
- VFP11은 32비트 단정도와 64비트 배정도 부동소수점 연산을 가속하고 IEEE 754를 따름
- 각 MP11 코어는 8단계 파이프라인, 동적·정적 분기 예측, CP15 시스템 제어 보조프로세서, 16KB 명령 캐시와 16KB 데이터 캐시를 가짐
- ARM11 코어들은 ARM의 AXI 버스로 연결되며, MPCore의 Snoop Control Unit이 L1 캐시 일관성을 유지함
- 3DS에는 ARM11 외에도 두 CPU가 더 들어 있음
- ARM946E-S: Native 3DS 모드에서는 OS가 관리하는 보안·I/O 보조 프로세서로 동작하고, DS/DSi 게임 실행 시 주 프로세서가 됨
- ARM7TDMI: DS/DSi 모드에서는 보조 프로세서로 동작하고, GBA 모드에서는 주 실행 CPU가 됨
- 동작 모드는 세 가지임
- Native 3DS mode: ARM11이 3DS 게임을 실행하고 ARM9가 I/O와 보안을 처리하며 ARM7은 꺼짐
- Nintendo DSi mode: ARM9와 ARM7이 DS/DSi 게임을 실행하고 ARM11은 누락·재배치된 DS 하드웨어를 보조함
- Game Boy Advance mode: ARM7이 GBA 게임 명령을 실행하고 ARM11과 ARM9는 백그라운드 지원을 함
- 메모리 구성은 복잡함
- 원래 3DS는 개발자 관점에서 128MB FCRAM, New 3DS는 256MB FCRAM을 제공함
- ARM11에는 보안 목적의 512KB SRAM이 있음
- ARM9에는 1MB SRAM, New 3DS에서는 1.5MB SRAM이 있음
- ARM9는 32KB 명령 TCM과 16KB 데이터 TCM도 가짐
- FCRAM은 Fujitsu와 Toshiba가 2002년에 만든 Fast Cycle DRAM으로, 비연속 읽기에서 DRAM보다 낮은 지연시간을 목표로 함
- DMA 구성도 포함됨
- ARM9 옆 XDMA는 최대 4채널 제공
- ARM11 옆 CDMA는 최대 8채널 제공
- New 3DS는 ARM11 블록 옆에 CoreLink DMA-330을 하나 더 추가함
- 3DS 개발자는 일반적으로 ARM11 MPCore만 접근하며, 프로그램은 스레드 기반 멀티스레딩 모델로 작성됨
- New 3DS에서 게임 메타데이터가 새 모델 대상임을 표시하면 OS가 빠른 클럭, 추가 RAM, L2 캐시 같은 기능을 활성화함
- 그렇지 않으면 호환성을 위해 New 전용 하드웨어를 비활성화함
- 게임은 Old용과 New용 코드베이스를 함께 담을 수 있음
그래픽 파이프라인과 PICA200
- Nintendo 3DS는 Nintendo 휴대용 라인에서 처음으로 자체 PPU 대신 GPU 벤더의 IP 코어를 사용함
- Nintendo는 DMP의 PICA200을 라이선스해 CPU CTR SoC 안에 넣었고, GPU는 268MHz로 동작함
- PICA200은 저전력 3D 프로세서이며, OpenGL ES 1.1에 맞고 OpenGL ES 2.0 요소가 확장된 Maestro 2G 아키텍처를 사용함
- 픽셀 단계는 고정 기능 구조지만, Maestro functions가 조각 조명, 다중 그림자 알고리듬, 폴리곤 분할, 범프 매핑, 절차적 텍스처, 여러 안개 효과를 제공함
- GPU 전용 VRAM은 6MB뿐이며, 프로그래머는 즉시 접근이 필요한 명령, 버퍼, 반복 텍스처를 VRAM에 두고 나머지는 FCRAM에 배치해야 함
- PICA200은 FCRAM과 VRAM 사이 전송용 DMA를 가짐
- LCD 컨트롤러는 PICA200의 렌더 버퍼 형식을 직접 이해하지 못해 별도 LCD 프레임버퍼가 필요함
- 상단 좌안, 상단 우안, 하단 화면용 최소 3개가 필요함
- 아티팩트를 피하려면 페이지 플리핑용 복제 세트를 둘 수 있음
- 게임 중 GPU는 보통 세 화면을 렌더링함
- 상단 좌안: 400×240
- 상단 우안: 400×240
- 하단: 320×240
- 모두 8비트 RGB 색상으로 최대 1,678만 색을 표시함
- PICA200 파이프라인은 명령, 버텍스, 지오메트리, 래스터라이저, 프래그먼트, 후처리 단계로 구성됨
- 명령 단계는 command buffer를 읽어 폴리곤을 그림
- 버텍스 단계는 Vertex Processor 4개를 병렬 사용하며, 지오메트리 셰이더를 켜면 3개만 사용 가능함
- 지오메트리 단계는 Vertex Processor 하나를 가져와 별도 셰이더로 사용함
- 프래그먼트 단계는 텍스처 유닛 4개와 셰이딩 유닛으로 구성됨
- 픽셀 셰이더는 없고, 색상 결합기 6개와 Maestro 기능을 조합함
- 후처리 단계는 알파, 스텐실, 깊이 테스트와 블렌딩, 2×2 슈퍼샘플링을 수행할 수 있음
- New 3DS에는 MVD라는 DSP가 추가된 것으로 보이며, H.264/MJPEG 압축 해제와 YUV-to-RGB 변환을 수행함
- New 3DS 웹 브라우저가 가속 비디오 재생에 사용하는 것으로 보임
- DS와 GBA 게임용 PPU도 SoC 안에 들어 있음
- DS/DSi/GBA 게임은 기존 하드웨어처럼 PPU를 사용함
- 출력은 LgyFB를 거쳐 프레임버퍼로 전달되고 PICA200이 표시를 맡음
- 이 구조는 지연을 추가하지만 사용자에게는 무시 가능한 수준임
오디오와 I/O
- SoC에는 오디오 블록 2개가 있음
- 3DS 게임용 독자 DSP
- 3DS, DS, GBA 게임이 쓰는 DS 계열 CSND
- 3DS 전용 DSP는 CEVA TeakLite II이며 약 134MHz로 동작함
- 스테레오 2채널, 최대 32kHz 샘플링, 16비트 해상도를 출력함
- DSP 작업 공간으로 512KB RAM을 사용하고, 256KB씩 이중 버퍼링됨
- DSP는 ADPCM과 PCM 샘플을 최대 24채널까지 믹싱할 수 있음
- 프로그램은 공식 SDK에 포함된 Nintendo 작성 DSP 펌웨어를 런타임에 업로드하고, OS 오디오 서비스가 DSP 통신을 추상화함
- CSND는 32채널을 제공하며 DS의 대응 블록보다 두 배 많음
- 외부 I/O는 휴대용 콘솔보다 스마트폰과 경쟁하려는 구성이 강함
- 디지털 버튼, 아날로그 Circle Pad, 3D·볼륨 슬라이더, Wi-Fi 스위치
- 저항식 터치 센서, 자이로스코프, 가속도계
- 전면 카메라 1개와 후면 카메라 2개
- 적외선 송수신기, SD 카드 슬롯, 3.5mm 잭, 게임 카드 리더
- New 3DS는 추가 I/O를 더함
- 디지털 버튼 2개, C-Stick, 하단 화면 NFC 리더
- 얼굴 추적용 적외선 LED
- SD 대신 microSD 슬롯
- Wi-Fi 스위치 제거와 소프트웨어 제어
- 내부 인터페이스는 SPI, HID, I²C, FIFO 기반 고속 주변장치, MCU로 나뉨
- SPI는 게임 카드 저장용 플래시, DS 전원 관리, Wi-Fi 일부, 터치스크린, 사운드, 마이크, Circle Pad 등을 연결함
- HID는 디지털 키패드를 16비트 레지스터로 읽음
- I²C는 카메라, 적외선 송수신기, NFC, QTM 얼굴 추적 모듈, 자이로스코프, MCU 등을 연결함
- eMMC와 SD 슬롯은 16MB/s 주변장치로 FIFO 레지스터를 통해 연결됨
- Auxiliary Microcontroller는 NEC 설계·Renesas 제조 78K0R MCU이며, LCD, LED, 전원 관리, 배터리, RTC, 3D 슬라이더, HOME/전원 버튼 등을 관리함
- I/O 기반 서비스에는 QR Reader, AR Games, Face Raiders, Amiibos, SpotPass, StreetPass, Play Coins가 포함됨
운영체제와 부팅 구조
- Nintendo 3DS는 여러 펌웨어를 저장해 네이티브 실행, 하위 호환, 유지보수 모드를 제공함
- NATIVE_FIRM: 3DS 네이티브 기능을 동작시키며 ARM11이 메인 프로그램을 실행함
- TWL_FIRM: 3DS를 Nintendo DSi처럼 동작하게 하며 ARM9와 ARM7이 전면에 섬
- AGB_FIRM: 3DS를 Game Boy Advance처럼 동작하게 하며 ARM7이 메인 프로그램을 실행함
- SAFE_FIRM: 시스템 업데이트 같은 유지보수 작업에 사용됨
- NATIVE_FIRM에서는 ARM9와 ARM11이 각각 별도 OS 역할을 가짐
- ARM9는 Kernel9와 Process9를 실행하며 보안, 암호화, I/O, 파일 시스템, 타이틀 검증·설치를 맡음
- ARM11은 Kernel11과 여러 사용자 프로세스를 실행하며 네트워크, HOME Menu, 앱 실행, 하드웨어 서비스 추상화를 제공함
- ARM11 스케줄러는 코어를 일반적인 범용 코어처럼 다루지 않음
- 첫 번째 코어 appcore는 게임용이고 FIFO 스케줄링을 사용함
- 두 번째 코어 syscore는 시스템 작업용이며 실행 시간 30%를 사용자 애플리케이션에 빌려줄 수 있음
- New 3DS의 네 번째 MP11 코어는 얼굴 추적 전용임
- 세 번째 MP11 코어는 기본적으로 스케줄링되지 않아 대부분 유휴 상태임
- New 3DS의 추가 CDMA는 부팅 중에만 접근 가능하고 이후 사용되지 않음
- 앱이 실제로 쓸 수 있는 RAM은 전체 FCRAM보다 적음
- 원래 3DS: 128MB 중 기본 64MB
- New 3DS: 256MB 중 기본 124MB
APPMEMTYPE플래그로 HOME Menu를 띄우지 않고 부팅해 각각 최대 96MB, 176MB까지 확보할 수 있음
- 저장 매체는 Boot ROM, OTP, eMMC NAND, SD/microSD로 구성됨
- Boot9와 Boot11은 부팅용 ROM이며 보안상 숨겨져 있음
- OTP는 제조 중 한 번 기록되는 콘솔 고유 정보와 암호화 키를 담음
- eMMC NAND에는 시스템 데이터, 펌웨어, 3DS/DSi 모드 사용자 데이터가 저장됨
- SD/microSD에는 eShop 소프트웨어, 저장 데이터, 사진, 녹음 등이 저장되고 AES-128-CTR로 보호됨
- 부팅 시 ARM9의 Boot9가 먼저 동작하고 ARM11의 Boot11을 깨운 뒤, NAND의 NCSD 헤더와 펌웨어 파티션을 검증함
- SHA-256 해시와 RSA-2048 서명을 검증해 유효한 펌웨어를 찾음
- 실패하면 Wi-Fi 모듈의 플래시 부팅을 시도하고, 이것도 실패하면 오류 화면을 표시함
- NATIVE_FIRM이 올라오면 Kernel9, Process9, Kernel11, 시스템 프로세스, NS, HOME Menu 또는 게임으로 이어짐
- HOME Menu는 설치된 애플리케이션을 스크롤 가능한 그리드에 표시하는 1페이지 내비게이션 셸임
- NS 모듈은 HOME 버튼 오버레이와 가상 키보드 같은 Applet 호출도 제공함
- New 3DS에서는 게임이 호환 모드로 실행돼도 Applet과 NS 루틴은 전체 하드웨어를 사용할 수 있음
- 시스템 업데이트는 온라인 또는 게임 카트리지로 가능함
- 카트리지는 사용자 앱 업데이트 없이 시스템 업데이트만 포함함
- 네트워크 업데이트는 전체 패키지를 포함함
- 설치는
SAFE_FIRM으로 재부팅한 뒤 System Updater가 수행함
게임 개발, 배포, Virtual Console
- 3DS 개발 생태계는 ARM 기반 스마트폰 산업과 컴파일러 발전의 영향을 받았지만, Nintendo는 아직 표준 툴체인까지 제공하지는 않았음
- 하드웨어 개발 키트는 Intelligent Systems와 Kyoto MicroComputers가 공급함
- CTR-BOX는 3DS 하드웨어가 들어 있는 금속 박스와 더미 3DS 케이스로 구성됨
- 공식 플래시카드는 외부 테스터에게 게임 프로토타입을 배포하는 데 사용됨
- New 3DS용으로는 SNAKE 키트가 제공됨
- 공식 SDK에는 3DS용
armcc, 디버거, 하드웨어·OS 서비스 API, 그래픽 라이브러리, 패키저, 네트워크·오디오·비디오 라이브러리, Visual Studio 2010 플러그인, PICA200 도구와 프로파일러가 포함됨 - 그래픽 라이브러리는 네 종류임
- GL: 단순하지만 느린 OpenGL ES API
- GD: PICA200 명령을 생성하는 더 빠른 대안
- GR: 하드웨어에 가장 가까운 PICA200 명령 API
- GX: PICA200 관리를 위한 범용 라이브러리
- 게임 실행 매체는 세 가지임
- Gamecard: 128MB~4GB ROM 또는 최대 2GB Flash와 저장용 backup memory를 담을 수 있음
- eShop/SD Card: 다운로드 소프트웨어와 선주문, DLC 배포를 지원함
- Local wireless: Download Play가 3DS로 이어졌고, 전송된 게임은 NAND에 설치되며 한 슬롯만 사용함
- Virtual Console은 eShop을 통해 DSiWare, NES/Famicom, Sega Game Gear, Game Boy, Game Boy Color 게임을 제공함
- New 3DS 사용자는 Super Nintendo 카탈로그도 접근 가능함
- 대부분 ROM과 에뮬레이터를 포함한 앱 패키지로 동작함
- Game Boy Advance 게임은 Ambassador Program 사용자에게만 공식 제공됨
- ARM11 에뮬레이터가 아니라 AGB_FIRM을 통해 ARM7에서 네이티브로 실행됨
- GBA 게임은 FCRAM으로 복사된 뒤 AGB_FIRM으로 재부팅되어 ARM7이 제어함
- 게임 업데이트는 eShop으로 배포되며, Download Play를 제외한 게임 유형에 적용됨
보안, 복제 방지, 홈브루
- 3DS 보안의 주요 대상은 Game/CTR card reader와 운영체제임
- CTR 카트 내부 데이터는 NCSD 형식이며 OS가 인증, 검증, 복호화를 맡음
- 실제 신뢰 체인은 운영체제와 부팅 구조에 집중됨
- 전용 보안 하드웨어가 포함됨
- ARM11의 XN 플래그와 ARM9의 MPU는 임의 메모리 실행을 제한함
- ARM9는 보안 전용 프로세서처럼 동작하며 AES, RSA, PRNG 같은 암호화 블록에 접근함
- AES 엔진은 AES-128 암복호화, 최대 64개 키 슬롯, CTR/CCM/CBC/ECB 모드를 지원함
- RSA 엔진은 공개키 기반 RSA 연산을 수행하며 키 슬롯은 4개임
- OTP는 콘솔 고유 키와 CTCert를 담고, eMMC CID도 키 난독화에 사용됨
- 신뢰 체인은 Boot9, OTP, eMMC, NCSD, NCCH, Title 검증으로 이어짐
- NCSD와 NCCH는 RSA-2048 + SHA-256 서명을 사용함
- NCCH 페이로드는 AES-128 CTR로 암호화됨
- Title은 RSA-2048, RSA-4096 또는 ECDSA와 SHA-256으로 서명됨
- eShop 다운로드 라이선스인 Ticket도 RSA-2048 + SHA-256으로 서명됨
- 구현상 약점도 존재함
- Kernel11의 AXI WRAM 페이지 테이블 설정이 읽기·쓰기·실행 권한을 넓게 부여함
- 시스템 3.0.0 이전에는 OTP 메모리가 숨겨지지 않음
- Process9와 Kernel9 사이 권한 분리가 없음
- ASLR이 없고, 시스템 다운그레이드 보호도 없음
- WebKit 기반 웹 브라우저가 반복적인 공격 대상이 됨
- 초기 홈브루와 복제는 DS 플래시카드에서 출발함
- DSi와 3DS는 허가된 카드 목록인 whitelist로 플래시카드를 차단하려 함
- 제조사는 카트리지 헤더를 재프로그래밍하는 방식으로 다른 허가 게임처럼 식별하게 함
- 2013년 Gateway3DS는 첫 실질적 3DS 플래시카드로 등장함
- Blue Gateway는 DS 플래시카드로 MSET 익스플로잇 진입점을 설치함
- Red Gateway는 FPGA와 microSD로 정품 게임 카드를 복제함
- Launcher.dat는 MSET 익스플로잇 페이로드와 커스텀 펌웨어 역할을 함
- Nintendo는 업데이트로 대응함
5.0.0-11은 MSET 익스플로잇을 임시로 수정함7.0.0-13은 커널 익스플로잇을 막고 NCCH 복호화 신뢰 체인에 RSA 모듈을 추가함9.3.0은 Gateway3DS의 비공개 커널 익스플로잇을 패치함- Sky3DS는
11.0에서 블랙리스트 처리됨
- 홈브루 생태계는 libctru, nihstro, Ninjhax, Homebrew Launcher로 발전함
- Ninjhax는 Cubic Ninja의 QR 코드 기능을 진입점으로 사용함
- GSPWN은 GPU DMA로 HOME Menu heap을 덮어쓰는 취약점임
- Homebrew Launcher는
.3dsx형식의 서명되지 않은 홈브루 앱을 실행함
- memchunkhax와 memchunkhax2는 Kernel11 권한 상승을 가능하게 함
- FCRAM에 저장된
memchunk header를 조작해 AXI WRAM 접근과 Kernel11 제어로 이어짐
- FCRAM에 저장된
- 2015년 New 3DS의 arm9loader 도입 이후 arm9loaderhax가 등장함
- 부팅 시점 Kernel9 권한의 임의 코드 실행을 가능하게 한 영구 익스플로잇임
- Luma3DS, Godmode9, Anemone3DS, nds-bootstrap 같은 도구가 널리 사용됨
- 2016~2017년에는 Boot9 분석으로 sighax, boot9strap, ntrboot가 등장함
- sighax는 Boot9의 RSA-2048 서명 검증 결함을 이용해 신뢰 체인을 무력화함
- boot9strap은 SD 카드 payload 또는 정상 부팅을 지원하는 대체 부트로더가 됨
- ntrboot는 DS 플래시카드, 자석, 키 조합을 이용해 Boot9 권한을 얻음
- 이 취약점들은 Boot ROM에 들어 있어 소프트웨어 업데이트로 고칠 수 없음
- 2018년 이후 방법들은 boot9strap 설치를 단순화하는 방향으로 발전함
- seedminer는 Friend Code와 SD 카드 하위 디렉터리 이름, 짧은 brute force로
movable.sed를 재구성함 - BannerBomb3는 DSiWare title banner 파싱 중 Settings 앱의 스택 오버플로를 이용함
SAFE_FIRM기반 unSAFE_MODE와 safehax, HOME Menu 기반 menuhax67과 nimdsphax 경로가 사용됨
- seedminer는 Friend Code와 SD 카드 하위 디렉터리 이름, 짧은 brute force로
- 2023년 5월
11.17.0업데이트는 BannerBomb3를 패치해 추가 장비가 필요 없는 마지막 진입점 중 하나를 무력화함- 이후 사용자는 합법 3DS 게임 익스플로잇, ntrboot 호환 DS 플래시카드, 또는 WebKit 익스플로잇을 필요로 함