파이버와 사용자 수준 스레드
Windows에서 libSceFiber의 각 파이버는 실제 Windows 파이버이므로, 전환 시 게스트 레지스터와 게스트 스택이 유지됩니다. 사용자 수준 스레드는 같은 pthread 경로로 시작됩니다.
2026년 10월 10일까지의 저장소 노트
파이버가 아무 일도 안 할 수 없는 이유
게스트 코드는 네이티브 기계어로 실행됩니다. 파이버 전환은 호스트 프레임과 게스트 프레임이 섞인 바로 그 스택과 바로 그 레지스터를 재개해야 합니다. sceFiberSwitch가 전환하지 않고 성공만 반환하면 타이틀이 엉뚱한 스택에서 계속 실행되어 양쪽을 모두 망가뜨립니다.
PS5PCEM은 초기화된 게스트 파이버마다 Windows 파이버 하나를 붙입니다. sceFiberRun, sceFiberSwitch, sceFiberReturnToThread가 이 메커니즘을 사용합니다. sceFiberRun을 호출한 스레드가 루트 파이버입니다. 공개된 128바이트 SceFiber 레코드는 ABI 시그니처, 상태, 진입 인수, 이름, 호출자가 제공한 컨텍스트 범위를 보관합니다.
스택의 주인
타이틀은 컨텍스트 버퍼를 제공하고, 그 버퍼는 ABI 객체에 기록됩니다. 실제 스택은 Windows가 소유합니다. 타이틀의 버퍼를 네이티브 Windows 스택으로 쓰면 운영체제가 요구하는 가드 페이지와 언와인드 관리를 건너뛰게 됩니다. 펌웨어 레코드가 기대하는 최소 컨텍스트 크기, 정렬, 시작·끝 시그니처는 여전히 검사합니다.
sceFiberGetSelf, 종료 처리, 스레드 간 소유권 검사, 런타임 초기화가 구현되어 있습니다. 백엔드는 Windows x86-64 네이티브 실행 대상에 있습니다. 다른 호스트에서도 에뮬레이터의 나머지 부분은 빌드할 수 있지만, 이 전환 경로는 사용할 수 없습니다.
사용자 수준 스레드
libSceUlt의 초기화와 종료가 성공하므로 타이틀의 작업 시스템이 시작될 수 있습니다. 런타임, 대기 큐, 큐 데이터 풀, 뮤텍스, 세마포어, 큐는 타이틀이 할당한 객체를 키로 호스트 측 상태를 유지합니다. 작업 항목 자체는 기존 pthread 경로로 시작됩니다. 작업 영역 크기 조회는 해당 생성 함수가 기대하는 정렬된 크기를 반환합니다.
커널 사용자 엣지 이벤트 큐는 pthread 동기화와 같은 시퀀스 인식 대기를 공유합니다. VideoOut 필터 -13과 그래픽 필터 -14가 이 큐를 사용하며, 각 등록의 식별자와 사용자 데이터를 유지합니다. ULT는 스케줄링을 잇는 접착제이며, 두 번째 CPU 에뮬레이터를 더하지 않습니다.
구현된 것
- sceFiberRun, sceFiberSwitch, sceFiberReturnToThread를 위한 Windows 파이버.
- ABI 시그니처, 소유권 검사, 가드 페이지가 있는 호스트 소유 스택.
- ULT 초기화, 큐, 뮤텍스, 세마포어, pthread 기반 작업 항목.
- VideoOut, 그래픽 완료와 공유하는 사용자 엣지 이벤트 큐.
아직 빠진 것
- 파이버 전환은 Windows x86-64에 있습니다. 다른 호스트 운영체제는 게스트 코드를 네이티브로 실행하지 않습니다.
- 파이버는 선점형으로 스케줄되는 하드웨어 스레드가 아닙니다.
- ULT는 작업 본문을 위한 별도 인터프리터를 구현하지 않습니다.
관련 메커니즘
이 페이지들에 대하여