Repository navigation
v0.0.206
rePIU v0.0.206
이전 릴리스 v0.0.205 이후의 변경입니다(issue #18). pumpitea의
ANDAMIRO 로고 다음 로딩 공백이 약 29초에서 약 1.5~2.7초로
줄었습니다 — 회귀 전 기준(v0.0.180, 5.0초)보다도 짧습니다. 로딩 뒤
47초 부근의 두 번째 정지(2.56.5초)도 1.42.1초로 줄었습니다.
해결된 issue
| issue | 내용 | 커밋 |
|---|---|---|
| #18 | pumpitea 로고 다음 로딩이 5초 대신 29초(ES 변경마다 캐시 전량 세그먼트 재패치) | 612251c 804df40 7a5c88c c6426c2 39c0620 |
새로 들어온 것
shadow를 진실원으로 하는 세그먼트 슬롯 (#18). Win32에서 물리
세그먼트 레지스터는 게스트 selector를 절대 담지 않는다는 사실을 전용
probe(repiu_aot_probe --segment-restore)로 확정하고, i386 guarded
세그먼트 슬롯들이 shadow selector 블록을 가상 상태의 진실원으로 쓰게
했습니다.
- 로드 슬롯(
612251c): 물리 비교를 버리고 shadow·레지스터별 수용
쌍(flat + 마지막 수용된 base 0 selector, 메모리 워드 비교라 쌍
변경에 재패치 불필요)과 비교해, 쌍 일치 시 shadow를 네이티브로
씁니다. 게스트 memcpy의 ES flip(0x0024↔0x002B)이 트랩·재해석·전량
재패치 없이 돕니다. - pop·메모리-소스 로드 슬롯(
804df40): 같은 세 비교를 pop에 적용하고,
mov Sreg, r/m16메모리-소스를 guarded load로 분류합니다. - INT8 캐시 진입과 무가드 read(
7a5c88c): 타이머 주입이 핸들러를 캐시
블록으로 진입시키고(REPIU_TIMER_HANDLER_CACHE_ENTRY=0으로 복원),
read 슬롯은 가드 없이 shadow 워드를 읽습니다.
뜨거운 INT 21h 서비스의 호스트 직접 디스패치와 승격 (#18). 두 번째
정지의 원인은 데모 데이터 파일 I/O(~45,000호출)의 VEH 왕복이었습니다.
REPIU_AOT_DBT_SUPERBLOCK 호스트 디스패치의 INT 일괄 제외에 AH=2Ch
(시각)·AH=42h(lseek) 허용을 더하고(c6426c2), 16개 롬셋 매트릭스에서
8개 타이틀을 깨뜨린 AH=3Fh(read)는 제외했습니다 — read가 게스트
메모리를 바꾼 뒤 디스패처의 직접 캐시 점프가 재진입 funnel의
리타이어·격리 검사를 건너뛰기 때문입니다(39c0620). 이 증거로 토글을
Port-I/O(Task 386) 선례대로 기본 켜짐으로 승격했습니다 —
REPIU_AOT_DBT_SUPERBLOCK=0으로 INT3 전용 경계를 복원합니다.
진단 도구. repiu_aot_probe에 --selector-guard(selector guard
probe 단독 실행)와 --segment-restore(VEH 재개의 세그먼트 복원 측정)
플래그가 추가됐고, 세그먼트 로드 트레이스가 사전 상태(물리 Seg*,
갱신 전 shadow)를 함께 찍습니다.
기각 기록. 재패치 경로를 싸게 만드는 세 변형(레지스터 마스크 v1·v2,
보호 범위 축소 v3)은 교대 측정에서 공백을 2~3배 늘려 기각했고, 전
과정을 docs/analysis/pumpitea-loading-segment-flip.md에 남겼습니다.
확인된 것
| 구성 | 확인 |
|---|---|
| Win32 x86 Release | 빌드, repiu_aot_probe --selector-guard·--segment-restore, pumpitea 90초 교대 측정(공백 1.5 |
알려진 것
- 같은 바이너리의 공백이 런에 따라 빠른/느린 영역으로 갈리는 모드
분기의 선택자는 미확정입니다(EEPROM 내용·순수 워밍업은 배제). - pumpit3a가 로딩 중 간헐 게스트 AV(4회 중 1회꼴, EBX=0)로 종료한
사례가 있습니다 — 세그먼트 경로 타이밍 변화로 드러나는 기존 경합으로
추정하며 미해결입니다. - far 문자열 비교 관용구(
0xFCF6D/6F)의 폴백 2,530회/90초는 남아
있습니다(시간 영향 ~0.1초). - 호스트 HLE 디스패치 승격과 새 슬롯들은 Win32에서만 측정했습니다.
long-mode(x64) 슬롯은 기존 동작 그대로입니다.
rePIU v0.0.206 (English)
Changes since v0.0.205 (issue #18). pumpitea's loading gap after
the ANDAMIRO logo drops from ~29 s to ~1.5–2.7 s — shorter than the
pre-regression baseline (v0.0.180, 5.0 s) — and the second stall around
47 s shrinks from 2.5–6.5 s to 1.4–2.1 s.
Resolved: #18
(whole-cache segment re-patch on every ES change) — commits 612251c,
804df40, 7a5c88c, c6426c2, 39c0620.
New: shadow-authoritative i386 guarded segment slots (a dedicated
probe proved a Win32 VEH resume never installs a guest selector into a
physical segment register; the load, pop and memory-source-load slots
now compare against the shadow and a per-register accepted pair and
write the shadow natively, the read slot reads it unguarded, and timer
injection enters the INT8 handler through its cache block); host-direct
dispatch for hot INT 21h services (AH=2Ch/42h; AH=3Fh read is excluded
because its guest-memory writes followed by the dispatcher's direct
cache jump skip the reentry funnel's retirement checks and broke eight
titles), promoted to default-on following the Port-I/O precedent
(REPIU_AOT_DBT_SUPERBLOCK=0 restores INT3-only boundaries); new
repiu_aot_probe --selector-guard and --segment-restore flags; and
the full record of the three rejected re-patch-cheapening variants in
docs/analysis/pumpitea-loading-segment-flip.md.
Verified: Win32 x86 Release build, both probes, interleaved 90 s
pumpitea measurements (gap 1.5–2.7 s, second stall 1.4–2.1 s, zero
exceptions), and a 16-romset 30 s smoke matrix default-on.
Known: the fast/slow mode selector remains unidentified (EEPROM
contents and pure warm-up excluded); an intermittent pumpit3a guest AV
during loading (~1 in 4, EBX=0) is suspected to be a pre-existing race;
the far-strcmp fallbacks (2,530 per 90 s, ~0.1 s) remain; the promotion
and new slots are measured on Win32 only, with long-mode slots
unchanged.