이 포스트는 블로그 주인장이 흥미롭다고 생각하는 주제를 AI 모델을 통해 작성을 요청한 아티클입니다.
주인장이 개인적으로 읽으려고 만든게 맞으니 참고 바랍니다!
v86 에뮬레이터로 브라우저에서 Windows 98을 실행하는 모습
v86은 브라우저에서 직접 실행할 수 있는 x86 PC 에뮬레이터입니다. 이 프로젝트는 x86 머신 코드를 런타임에 WebAssembly 모듈로 변환하여 웹 브라우저에서도 합리적인 성능을 달성합니다. 개발자들은 이 에뮬레이터를 통해 Windows 95, Linux, FreeDOS 등 다양한 운영체제를 별도의 설치 없이 웹 페이지에서 바로 실행할 수 있습니다.
핵심 아키텍처와 기술적 특징
v86은 Pentium 4 수준의 명령어 세트를 에뮬레이션하며, SSE3 명령어까지 완전히 지원합니다. 프로젝트의 핵심은 x86 코드를 WebAssembly로 실시간 JIT 컴파일하는 기능으로, 이를 통해 순수 JavaScript 구현 대비 크게 향상된 성능을 제공합니다.
코드베이스는 JavaScript(36.3%), Rust(31.0%), C(24.7%)로 구성되어 있으며, 각 언어의 장점을 활용한 하이브리드 구조를 채택했습니다. 다만 32비트 커널만 지원하며, 64비트 확장 명령어는 구현되지 않았습니다.
일반적인 데스크톱 PC 환경에서 v86은 약 100 MIPS 수준의 성능을 보여주며, 이는 레트로 컴퓨팅과 소프트웨어 보존 목적으로 충분히 활용 가능한 수준입니다.
에뮬레이션되는 하드웨어 구성
v86은 완전한 PC 환경을 제공하기 위해 다양한 하드웨어 컴포넌트를 에뮬레이션합니다.
1. CPU와 연산 장치
부동소수점 연산을 위해 Berkeley SoftFloat 라이브러리를 사용하여 정밀한 계산을 보장합니다. 실제 하드웨어와의 호환성을 위해 프로그래밍 가능한 인터럽트 컨트롤러(8259)와 타이머(8254)도 구현되어 있습니다.
2. 입출력 장치
PS/2 키보드 컨트롤러와 마우스 지원을 통해 사용자 입력을 처리하며, VGA 카드는 SVGA 모드와 Bochs VBE 확장을 지원합니다. 이를 통해 다양한 해상도와 색상 모드를 활용할 수 있습니다.
3. 저장 장치와 네트워킹
IDE 디스크 컨트롤러는 ISO 9660 CD-ROM 이미지 생성 기능을 내장하고 있으며, NE2000 네트워크 카드와 Virtio 디바이스를 통해 파일시스템, 네트워킹, 메모리 관리 기능을 제공합니다. SoundBlaster 16 사운드 카드도 에뮬레이션되어 오디오 출력이 가능합니다.
지원되는 운영체제
1. Linux 배포판
32비트 커널을 사용하는 Linux 배포판은 안정적으로 동작합니다. Alpine, Arch Linux 32, Buildroot, Damn Small Linux 등이 잘 작동하며, Ubuntu는 18.04 LTS까지 호환됩니다.
2. Windows 계열
Windows 1.01, 3.x, 95, 98, ME, NT, 2000이 합리적인 수준으로 동작합니다. Windows XP, Vista, 8도 특정 조건에서 실행 가능하지만, NT 이후 버전은 “ACPI PC” 대신 “Standard PC” 구성으로 설정해야 합니다.
3. 기타 운영체제
ReactOS, FreeDOS, MS-DOS, KolibriOS, Haiku, Android-x86(4.4-r2까지), FreeBSD, OpenBSD, 9front, QNX, SerenityOS(32비트만) 등 다양한 운영체제를 지원합니다.
Plan 9와 OS/2는 현재 v86에서 동작하지 않습니다. 이는 에뮬레이터가 구현하지 않은 특정 CPU 기능(태스크 게이트, 보호 모드의 far call 등)을 필요로 하기 때문입니다.
빌드와 개발 환경
v86을 빌드하고 개발하기 위해서는 아래와 같이 준비해야 합니다.
필수 도구
- Make 빌드 시스템
- Rust 컴파일러(wasm32-unknown-unknown 타겟 포함)
- 호환되는 Clang 버전
- Node.js(v16.11.1 이상 권장)
- Java(Closure Compiler용, 디버그 빌드에서는 선택사항)
- 테스팅 도구(nasm, gdb, qemu-system, gcc, libc-i386, rustfmt)
배포 옵션 Docker 컨테이너를 통한 배포가 가능하며, Dev Container 지원으로 최신 IDE에서 편리하게 개발할 수 있습니다. 로컬 개발 시에는 Python HTTP 서버를 활용할 수 있고, libv86.js 라이브러리를 통해 웹 페이지에 직접 임베딩할 수도 있습니다.
API 사용 예시
v86을 웹 페이지에 임베딩하는 기본적인 방법은 간단합니다.
1
2
3
4
5
6
7
var emulator = new V86({
screen_container: document.getElementById("screen_container"),
bios: { url: "../../bios/seabios.bin" },
vga_bios: { url: "../../bios/vgabios.bin" },
cdrom: { url: "../../images/linux.iso" },
autostart: true
});
프로젝트는 시리얼 터미널 상호작용, 상태 지속성, 다중 인스턴스 윈도우, Broadcast Channel API를 통한 네트워킹 등을 다루는 7가지 예제를 제공합니다.
알려진 제약사항과 성능
v86의 CPU 에뮬레이션에는 몇 가지 제약이 있습니다. 태스크 게이트, 보호 모드의 far call, 트랩 플래그 디버깅, 일부 부동소수점 예외, 멀티코어 지원, 64비트 확장 기능은 구현되지 않았습니다.
성능 최적화를 위해 프로젝트는 종합적인 테스트 스위트를 제공합니다. KVM 유닛 테스트, QEMU 테스트 케이스, 커스텀 테스트 인프라가 포함되어 있으며, 프로파일링 문서와 CPU 유휴 상태 최적화 가이드도 개발자에게 제공됩니다.
라이선스와 오픈소스 활용
v86은 BSD-2-Clause 라이선스로 배포되며, Berkeley SoftFloat, zstd 압축 라이브러리, QEMU에서 파생된 코드 등 서드파티 컴포넌트는 각각의 라이선스를 따릅니다.1
마치며
v86은 웹 기술의 발전을 통해 과거의 소프트웨어를 보존하고 접근성을 높이는 흥미로운 프로젝트입니다. WebAssembly의 JIT 컴파일 기능을 활용하여 브라우저 환경에서도 실용적인 성능을 달성했으며, 다양한 운영체제와 하드웨어를 에뮬레이션하여 레트로 컴퓨팅, 교육, 소프트웨어 보존 등 여러 분야에서 활용될 수 있습니다.
32비트 제한과 일부 구현되지 않은 기능들은 분명한 한계이지만, 순수하게 웹 브라우저에서 실행된다는 점에서 충분한 가치가 있습니다. 개발자들은 libv86.js를 통해 자신의 웹 애플리케이션에 x86 에뮬레이션 기능을 손쉽게 통합할 수 있으며, 오픈소스 프로젝트로서 지속적인 개선과 기능 확장이 가능합니다.
v86 GitHub Repository https://github.com/copy/v86 ↩︎