← 목록
기타 2026-05-08 4KB 읽기 5분

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 실행

해결한 주요 문제

  1. 37MB 스택 오버플로우: process_t 인라인 배열 → 힙 할당으로 전환
  2. PUSH/ALU 디코딩 충돌: 0x55(PUSH RBP)가 ALU immediate로 잘못 파싱 → 범위 가드 추가
  3. CALL/JMP 주소 계산: 다음 명령어 기준 상대 오프셋 (rip + insn_length + rel)
  4. 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