HLE, 고수준 펌웨어 에뮬레이션
HLE는 타이틀이 임포트하는 펌웨어 호출에 PS5PCEM이 응답하는 방식입니다. 숫자 NID 하나하나가 호스트 스택에서 실행되는 Zig 함수가 되며, Windows에서도 게스트의 System V 호출 규약이 유지됩니다.
2026년 10월 10일까지의 저장소 노트
펌웨어가 게임 안에 없는 이유
PlayStation 5 타이틀은 자신이 호출하는 운영체제를 함께 싣고 있지 않습니다. 임포트는 11자짜리 식별자입니다. PS5PCEM은 각 식별자를 익스포트 이름에서 계산합니다. 이름에 고정 솔트를 붙인 SHA-1을 구한 뒤, 다이제스트 앞 8바이트를 base64 변형으로 인코딩합니다. 구현은 읽을 수 있는 이름으로 등록되며, 그 이름이 만들어 내야 하는 식별자를 요구할 수 있으므로 철자가 틀린 익스포트는 모듈을 빌드할 때 실패합니다.
동적 링커는 식별자를 라이브러리, 모듈, 각각의 버전과 함께 조회합니다. 같은 식별자가 여러 라이브러리에 있을 수 있습니다. 쓸 만한 메타데이터가 없는 임포트를 위해 식별자만으로 조회하는 경로도 있지만, 모호하기 때문에 이 대체 경로는 최후의 수단으로 취급합니다.
호출은 호스트 스택에서 실행됩니다
게스트는 펌웨어를 직접 호출하므로, 호출은 게스트 스레드의 스택에서 시작됩니다. 타이틀이 그만큼 요청했기 때문에 보통 1메가바이트입니다. 파일 열기 같은 호스트 작업에는 훨씬 큰 프레임이 필요합니다. 컴파일러는 그 프레임을 어떤 조기 반환보다도 먼저, 진입 시점에 확보합니다. 따라서 펌웨어 본문은 공간이 필요한 줄에 도달하기 전에 게스트 스택을 벗어날 수 있고, 그 폴트는 모든 게스트 매핑 바깥에서 일어납니다.
모든 HLE 호출은 호스트 작업이 이어지는 동안 스레드별 호스트 스택으로 전환합니다. 인수는 메모리를 통해 전달되므로, 부동소수점과 집합체 반환을 포함한 모든 시그니처를 어셈블리 스텁 하나가 처리합니다. 중첩된 펌웨어 호출은 바깥 호출이 이미 마련한 스택에 머뭅니다. Windows에서 게스트는 System V AMD64 규약을, 호스트는 Microsoft x64 규약을 쓰기 때문에, 게스트가 호출할 수 있는 모든 함수는 게스트 규약으로 선언합니다. 이 선언을 빼도 컴파일은 되지만, 그러면 인수를 엉뚱한 레지스터에서 읽습니다.
HLE가 다루는 범위
이 기반 위에서 펌웨어 라이브러리가 다이렉트 메모리와 플렉서블 메모리, 모듈 핸들, pthread, 동기화, 파일, 저장 데이터, 파이버, 글꼴, PNG, 시계, 패드, AudioOut, AJM, NGS2, ACM, AvPlayer, APR, AMPR을 제공합니다. 네트워크, SSL, NP Web API는 컨텍스트와 요청 수명을 유지하면서 결정적인 오프라인 오류를 반환합니다. 시스템 셸이 필요한 대화 상자는 일관된 헤드리스 결과로 즉시 끝납니다.
10월 10일 검증 실행은 ReleaseSafe HLE 전체 스위트 606개 중 606개를 통과했습니다. 이 숫자는 펌웨어 스위트의 결과입니다. 그것만으로 새로운 프레임 속도나 새로운 완주를 기록하지는 않습니다.
구현된 것
- NID 계산, 버전이 붙은 심볼 레지스트리, 모든 펌웨어 호출의 호스트 스택 전환.
- 호스트 규약이 Microsoft x64인 Windows에서의 게스트 System V 호출.
- 메모리, 파일, 스레딩, 저장 데이터, 미디어, 오디오 코덱, APR/AMPR 명령 경로.
- 헤드리스 대화 상자와 호스트 소켓을 열지 않는 오프라인 네트워크 프로필.
아직 빠진 것
- 타이틀이 임포트하지만 PS5PCEM이 구현하지 않은 라이브러리는 여전히 임포트에 실패합니다.
- 게시된 그래프에 없던 모듈을 정말로 필요할 때 불러오려 하면 오류를 반환합니다.
- 실제 셸, 계정, 네트워크 상대가 필요한 플랫폼 서비스는 사용할 수 없습니다.
관련 메커니즘
이 페이지들에 대하여