본문으로 건너뛰기
PS5PCEM
작동CPU, 로더, 도구

네이티브 게스트 실행

Windows x86-64에서는 게스트의 기계어가 직접 실행됩니다. 게스트 pthread마다 호스트 워커 하나가 붙고, Windows가 FS 베이스를 유지하지 않으므로 차단 호출 뒤마다 이를 복원합니다.

2026년 10월 10일까지의 저장소 노트

게스트 스레드마다 워커 하나

디스패처는 게스트 pthread마다 호스트 워커 하나를 시작하고, 그 스레드의 TLS를 설치한 뒤, System V 인수 레지스터와 함께 요청된 주소로 게스트에 진입합니다. join, detach, yield, sleep, 중첩 콜백, scePthreadExit가 모두 이 경로로 돌아옵니다. HLE 스레드는 게스트 실행이 그 컨텍스트를 떠난 뒤에만 완료됩니다.

브리지는 진입점이 실행 가능한지, 스택과 TLS가 매핑되어 있는지 확인합니다. Windows 비휘발성 레지스터, MXCSR, x87 제어 워드를 저장하고, 게스트 스택으로 전환하고, 게스트 FS 베이스를 설치한 뒤 진입점을 호출합니다. 동기식 scePthreadExit는 게스트 프레임을 버리는 네이티브 이스케이프로 빠져나가며, 디스패처가 인터럽트를 보기 전에 호스트 FS를 복원합니다.

Windows는 FS 베이스를 버립니다

FS를 한 번 설치하는 것으로는 부족합니다. Windows는 사용자가 쓴 FS 베이스를 컨텍스트 전환 사이에 보존하지 않습니다. sleep 뒤에 rdfsbase는 다시 0을 읽습니다. 게스트 코드는 System V 규약에 따라 스레드 로컬 저장소를 FS에 두므로, 다음 FS 기준 접근은 주소 0 근처에서 폴트를 일으킵니다. 게스트에는 잘못이 없습니다. 게스트가 믿을 권리가 있는 레지스터를 호스트가 버린 것입니다.

그래서 디스패처는 차단 호출 뒤 FS를 복원합니다. 대기는 시퀀스 인식 futex를 사용하므로, 잠금 해제와 대기 진입 사이에 도착한 깨우기는 한 번만 소비되고, 브로드캐스트는 이전 시퀀스를 본 모든 대기자에게 보입니다. 고정된 깨우기 이력이 가득 차면 디스패처는 넉넉하게 깨우고 HLE가 객체를 다시 확인하게 합니다. 시간 제한 sleep은 경보를 받지 않는 전용 지연을 사용하므로, 관련 없는 깨우기 때문에 오디오 워커가 헛돌지 않습니다.

폴트와 다른 운영체제

폴트가 난 게스트 스레드는 격리됩니다. 진단은 가능하면 주소를 모듈과 심볼에 연결하며, 프로세스가 처리되지 않은 호스트 예외로 죽을 필요가 없습니다. PS5_CPU_WAIT_DIAGNOSTICS=1은 상세 대기 추적을 다시 켭니다. 대기 중인 워커 여러 개가 동시에 출력하면 그 자체로 프레임이 멈출 수 있어, 일반 플레이 중에는 꺼져 있습니다.

네이티브 실행에는 Windows x86-64와 RDWRFSGSBASE 프로세서 기능이 필요합니다. Linux와 macOS 빌드도 디코더, 로더, HLE는 컴파일하며, 네이티브 브리지는 지원되지 않는다고 보고합니다. 게스트 바이너리는 x86-64 기계어이며, 인터프리트하지 않습니다.

구현된 것

  • Windows에서 게스트 pthread마다 호스트 워커 하나를 쓰는 네이티브 x86-64 게스트 실행.
  • System V 호출, 게스트 스택, 차단 호출 뒤 FS 복원.
  • 시퀀스 인식 대기, 격리된 폴트, 호스트를 복원하는 pthread 종료.
  • Linux와 macOS에서의 검사, 디코딩, HLE. 네이티브 실행은 없습니다.

아직 빠진 것

  • 인터프리터는 없습니다. Windows x86-64 외의 호스트는 게스트를 실행하지 않습니다.
  • FS와 GS 베이스를 쓸 수 없는 CPU는 네이티브 브리지에 진입할 수 없습니다.
  • 상세 대기 진단은 출력이 플레이를 멈추게 하므로 기본적으로 꺼져 있습니다.

관련 메커니즘

이 페이지들에 대하여

본문은 PS5PCEM 저장소의 아키텍처 노트와 2026년 10월 보고서를 따릅니다. 특정 테스트를 통과했다고 해서 새로운 프레임 속도나 새로운 완주를 뜻하지는 않습니다.

모든 기술