CrownyApp v0.2.0 — 크로스플랫폼 앱 실행기
개요
CrownyApp은 Windows/Linux/Intel Mac x86_64 바이너리를 Apple Silicon(ARM64) macOS에서 실행하는 크로스플랫폼 앱 호환성 레이어이다. x86→ARM64 동적 변환 + PE/ELF/Mach-O 로더 + 시스콜 변환을 통합하며, 4상균형3진법 상태 관리를 적용한다.
핵심 구성요소
x86→ARM64 변환기 (translate/)
- x86 디코더: REX/ModRM/SIB 파싱, 70+ opcode 지원 (ALU/MOV/LEA/PUSH/POP/JMP/Jcc/CALL/RET/SYSCALL/SSE 기본)
- ARM64 코드 생성기: MOVZ/MOVK 시퀀스, LDR/STR, 산술/분기 인코딩
- JIT 컴파일러: MAP_JIT + pthread_jit_write_protect_np (Apple Silicon W^X), sys_icache_invalidate
- 인터프리터: 복잡한 명령어 폴백, 128비트 MUL/DIV, RFLAGS 에뮬레이션
- 변환 캐시: 4096 버킷 해시맵, 64MB 코드 풀
바이너리 로더 (loader/)
- ELF64: PT_LOAD 세그먼트 매핑, RELA 재배치, DT_NEEDED import, PIE 지원
- PE64: 섹션 매핑, 베이스 재배치(DIR64/HIGHLOW), IAT import 파싱
- Mach-O: LC_SEGMENT_64 매핑, LC_MAIN 진입점, LC_LOAD_DYLIB import
시스콜 변환 (syscall/)
- Linux: 25+ 시스콜 (read/write/open/close/mmap/brk/exit/uname/arch_prctl/getrandom 등)
- Win32: 20+ API 심 (GetStdHandle/WriteFile/HeapAlloc/VirtualAlloc/ExitProcess 등) — HLT 트램폴린 방식
- macOS x86: CF 기반 에러 규약 변환
- VFS: 경로 변환 (Linux /proc→샌드박스, Windows C:\→/tmp/crownyapp/C/)
프로세스 관리 (runtime/)
- 4상균형3진 상태: T(실행), O(대기), A(종료), U(미로드)
- 프로세스 테이블: 최대 64 프로세스, 힙 할당
수치
| 항목 | 수치 |
|---|---|
| 신규 C 코드 | 4,218줄 (8개 디렉토리) |
| 전체 C/ObjC/헤더 | 95개 파일, 9,653줄 |
| crownyapp 바이너리 | 70KB |
| crownyvm 바이너리 | 117KB |
| 셀프테스트 | 18/18 통과 |
| 컴파일 에러 | 0 |
파일 구조
crowny-vm/
├── translate/ # 2,478줄 — x86→ARM64 변환기
│ ├── translate.h # 공통 타입/선언
│ ├── x86_decode.c # x86-64 디코더
│ ├── x86_state.c # CPU 상태/RFLAGS
│ ├── arm64_emit.c # ARM64 인코더
│ ├── jit_compile.c# JIT 컴파일러
│ ├── tcache.c # 변환 캐시 (MAP_JIT)
│ └── translate.c # 인터프리터/메인 루프
├── loader/ # 620줄 — ELF64/PE64/Mach-O 로더
│ ├── loader.h # 바이너리 포맷 구조체
│ ├── elf.c # ELF64 로더
│ ├── pe.c # PE64 로더
│ ├── macho.c # Mach-O 로더
│ └── detect.c # 자동 감지 + 통합 로더
├── syscall/ # 800줄 — 시스콜 변환
│ ├── syscall.h # 시스콜 컨텍스트
│ ├── linux.c # Linux 시스콜 (25+)
│ ├── win32.c # Win32 API 심 (20+)
│ └── vfs.c # VFS + macOS 시스콜
├── runtime/ # 100줄 — 프로세스 관리
│ ├── runtime.h # 4상 프로세스 타입
│ └── process.c # 생성/실행/소멸
└── app.c # CrownyApp 진입점 (18개 셀프테스트)
빌드 + 실행
bashcd /Users/ef/crowny-vm
make app # CrownyApp 빌드 (70KB)
./build/crownyapp --self-test # 18개 셀프테스트
./build/crownyapp --info /path/to/bin # 바이너리 정보 출력
./build/crownyapp /path/to/linux.elf # Linux ELF 실행
./build/crownyapp /path/to/app.exe # Windows PE 실행
./build/crownyapp /path/to/macho # Intel Mac 실행
해결한 주요 문제
- 37MB 스택 오버플로우: process_t 인라인 배열 → 힙 할당으로 전환
- PUSH/ALU 디코딩 충돌: 0x55(PUSH RBP)가 ALU immediate로 잘못 파싱 → 범위 가드 추가
- CALL/JMP 주소 계산: 다음 명령어 기준 상대 오프셋 (
rip + insn_length + rel) - Apple Silicon JIT: MAP_JIT + pthread_jit_write_protect_np + sys_icache_invalidate
잔여 이슈
- 한선씨 콘솔(앱콘솔.한선)은 컴파일 성공하지만 crownyc VM 런타임 행 (알려진 VM 한계)
- win32.c
guest_wstr_to_str미사용 함수 경고 - 실제 Windows/Linux 바이너리 실행은 추가 시스콜/API 구현 필요
관련 파일
- 소스:
/Users/ef/crowny-vm/ - CLAUDE.md:
/Users/ef/crowny-vm/CLAUDE.md - 한선씨 콘솔:
/Users/ef/crowny-vm/manage/앱콘솔.한선 - 계획:
/Users/ef/crowny-vm/PLAN_V2.md