Bochs는 x86 PC 에뮬레이터이자 Lesser GNU Public license(GPL)에 의해 라이센스를 받은 디버거이다. 해당 플랫폼은 하나 이상의 프로세서 및 하드 디스크, 표시장치, CD-ROM 드라이브 및 기타 일반적인 주변기기와 같은 다양한 PC 주변기기를 비롯하여 전체 PC 플랫폼의 에뮬레이션을 제공한다. PC 플랫폼을 대상으로 하는 운영 체제를 실행하기 위해 Bochs를 사용할 수 있으며, 이는 운영 체제 개발에 이상적인 애플리케이션이기도 하다(왜냐하면 Bochs가 제공하는 디버깅 기능 외에도 개발 중인 운영 체제의 중단이 게스트 내에서 격리될 수 있기 때문이다). Bochs는 에뮬레이션을 통해 이를 완수하지만, 성능의 비용에 접근한다.
빠른 우회로를 택하여 에뮬레이션과 오늘날 더 일반적인 사용 가능한 가상화 메소드 사이의 차이점에 대해 이해해보자.
Bochs는 플랫폼 에뮬레이터이며, 이는 현대적인 관점에서 실제로 가상화라기보다는 시뮬레이션임을 의미한다. 가상화에서 하이퍼바이저와 가상 머신(VM)은 베어메탈(bare-metal) 하드웨어에서 실행한다(일반적으로 하드웨어 명령어를 통해 VM 가운데 하드웨어를 공유하도록 환경을 작성하는 하이퍼바이저 사용). 명령어가 호스트 프로세서로 직접 실행되기 때문에 이 프로세스는 일반적으로 직접 실행이라고 한다. 이러한 가상화 유형은 현대식 프로세서(예를 들어, Intel Virtualization Technology for x86[VT-x] 또는 AMD virtualization[AMD-V])로부터 지원을 사용한다. 에뮬레이션은 일반적으로 VM과 해당 내재된 하드웨어 및 운영 체제 사이에 계층을 제공하여 그림 1과 같이 원하는 플랫폼 환경의 환영을 작성한다.
그림 1. 가상화 대 에뮬레이션
에뮬레이션도 게스트 VM의 명령어를 일반적으로 해석한다(가상화와 비교되며, 여기에서 게스트의 명령어 세트 아키텍처가 호스트와 동일해야 한다). 이는 에뮬레이션에 대한 흥미로운 장점을 나타내며, 여기에서 게스트 VM 플랫폼은 전체적으로 호스트와 다를 수 있다(예를 들어, IBM® PowerPC® 대상에서 x86 게스트를 실행하는 것).
에뮬레이션의 또 다른 흥미로운 장점은 환경의 완전한 제어가 있다는 점이며, 이로 인해 상태를 조사하는 전체 머신을 일시정지하기에 간편할 뿐만 아니라 어느 종류의 결함도 운영 체제의 오류 트리를 테스트하기 위해 에뮬레이션으로 도입하기에도 간편해진다. 이 기능은 성능의 비용에 접근하지만, 이러한 환경 유형에 실질적인 혜택을 준다. 게다가, 에뮬레이터는 호스트로부터 게스트의 진정한 격리를 제공한다. 이러한 방식으로 에뮬레이터는 환경의 완전한 투명성을 제공할 수 있다.
에뮬레이션이 성능 아키텍처에 사용될 수 있는 경우들이 있다. 하나의 예제는 Transmeta가 제작한 코드 모핑 기술이다. Transmeta의 프로세서는 x86 코드 시퀀스를 에뮬레이트할 수 있었던 매우 긴 명령어 단어(VLIW) 수퍼스칼라 아키텍처였다. 이는 에뮬레이션 또는 코드 시퀀스의 동적 컴파일을 통해 이렇게 수행했다(QEMU의 기능과 유사함). Transmeta는 1995년에 설립되어 2007년 후반에 문을 닫았다.
다른 예제는 Java 기술을 포함하며, 이는 Java 바이트코드로부터 내재된 호스트의 아키텍처로 해석된다. Java 기술은
Transmeta 및 기타 무수한 에뮬레이션 솔루션(QEMU를 포함하여 Bochs와 유사한 다른 플랫폼 에뮬레이션 솔루션)과
유사하게, JIT(Just-In-Time) 컴파일을 구현하여 일부 비효율성을 해결한다. 하지만 Bochs도 효율적인 에뮬레이션을
달성하는 동시에(현대식 프로세서에서 최대 1억 개의 초당 명령어[MIPS]) 휴대용이 된다. Bochs는 해석된 x86
명령어 실행과 플랫폼 에뮬레이션을 위해 순전히 C++ 언어에서 개발되었다.
이제 Bochs의 일부 내부를 탐색하여 Bochs가 순전한 C++ 구현 방식에서
유용한 성능을 달성하는 방법을 이해해보자. 이 기사는 에뮬레이션의 두 가지 측면에 집중한다. 즉, 이는
CPU(명령어 세트 아키텍처[ISA] 에뮬레이션) 및 디바이스이다.
Bochs는 에뮬레이션을 위한 메소드 면에서 고유하다. 다른 솔루션은 직접 실행 또는 JIT 컴파일을 제공하지만, Bochs는 CPU ISA(대칭 멀티프로세싱 구성에서 최대 8대의 CPU로 x86 및 x86-64 CPU 에뮬레이션에 대한 지원 포함)의 순전한 에뮬레이션을 구현한다. Bochs는 실제 CPU의 에뮬레이션을 CPU의 페치-디코드-실행 플로우를 에뮬레이트하는 레벨로 제공한다.
플로우 단계에서 Bochs는 권한 검사를 수행한 다음에 opcode를 페치한다. 디코드 단계에서 Bochs는 페치된 x86 명령어를 내부 표현으로 디코드한다. 이는 또한 원본 x86 시스템(이는 디코딩의 오버헤드 없이 나중에 페치될 수 있음)의 "마이크로 연산"을 저장하여 개선된 성능에 대한 명령어 캐시도 유지보수한다. 마지막으로, 실행 단계에서 Bochs는 특정 명령어(operands에 대한 효율적인 주소를 계산한 다음에 특정 명령어 실행 메소드로 간접적인 호출을 수행하는 것 포함)의 실행과 관련하여 많은 연산을 수행한다. 명령어가 실행될 때, 영향 받은 레지스터와 플래그에 관계 없이 모두 (적절하게) 업데이트될 수 있다. Bochs는 레이지 플래그 업데이트(lazy flag update)라고 하는 최적화를 제공하여 산술 플래그가 필요할 때에(각 단계에서 업데이트하는 것 대신에) 산술 플래그만 계산한다.
페치-디코드-실행 플로우 외에 Bochs는 디바이스 인터럽트 및 바이트 스와핑 및 기타 권한이 있는 검사와 같은 기타 필수 기능과 같은 외부 이벤트도 관리한다. 제네릭 x86 CPU 외에도 Bochs는 MMX 기술을 갖춘 Intel Pentium Processor, Intel의 Streaming Single Instruction, Multiple Data Extensions 2(SSE2) 및 AMD 3DNow! 명령어와 같은 수많은 CPU 기능을 구현한다.
Bochs의 내부 명령어 캐시는 기존 JIT 컴파일로 훌륭한 거래 조건을 제공한다. JIT 컴파일은 실행을 가속화하기 위해 일부 장점을 제공하지만, 더 큰 메모리 용량을 희생하여 이를 수행한다.
Bochs는 디바이스 유형을 기반으로 하는 디바이스 에뮬레이션으로 PC 플랫폼의 에뮬레이션을 제공한다. 예를 들어, 키보드는 호스트와 게스트 사이에 공유되는 실제 디바이스이지만, 디스크는 에뮬레이션을 통해 공유되며, 여기에서 게스트 디스크는 호스트 디스크의 파일 시스템에서 파일이다.
Bochs는 메모리, NE2000 Ethernet 카드, Cirrus Logic 비디오 카드(PCI 또는 ISA), Intel 440FX PCI 칩셋, BIOS, USB 루트 허브, Sound Blaster 사운드 카드 및 디스크와 플로피 제어기를 비롯하여 에뮬레이트된 하드웨어의 유용한 목록을 제공한다. CPU와 같이 이러한 디바이스도 에뮬레이트되며, 이는 경로에서 주목할 만한 오버헤드를 도입할 수 있다. 예를 들어, 드라이버가 하드웨어와 통신할 때, 이는 디바이스의 원하는 일부 조작을 요청하기 위해 레지스터를 조작한다. 에뮬레이트된 플랫폼에서 디바이스를 대표하는 레지스터와 메모리가 에뮬레이트된다. 게스트 운영 체제의 드라이버가 메모리 및 하드웨어 레지스터에서 보고 조사할 때, 소프트웨어는 디바이스를 에뮬레이트하기 위해 그 아래에 존재한다(그림 2 참조). 에뮬레이트된 인터페이스를 넘어 디바이스 에뮬레이션은 원하는 조작을 수행해야 하며, 이는 디바이스의 에뮬레이션과 호스트 플랫폼(실제 네트워크 인터페이스 카드[NIC] 또는 실제 디스크 등)에서 실제 디바이스와의 통신을 잠재적으로 암시한다.
그림 2. 에뮬레이션을 통한 디바이스 가상화
Bochs와 해당 유틸리티는 다양한 게스트 운영 체제를 에뮬레이트하기 위해 사용하기에 매우 간단하다. 이 예제는 Bell Labs 운영 체제의 Plan 9의 에뮬레이션을 실례로 보여준다.
먼저, 시스템에서 Bochs가 이미 사용 가능하지 않은 경우 Bochs를 설치해야 한다.
필자의 Ubuntu 시스템의 경우, 필자는 apt 패키지 관리자를 사용하여
다음 필수 패키지를 설치한다.
$ sudo apt-get install bochs $ sudo apt-get install bochs-x |
이 명령행은 Bochs IA-32/64 PC 에뮬레이터와 Bochs용 X-11 에뮬레이터를 설치한다.
Bochs에서 Plan 9를 에뮬레이트하려면 가상화된 환경을 위해 두 가지가 더 필요하다. Plan 9 설치 이미지가 들어있는 CD-ROM 하나와 설치의 대상으로서 가상 하드 디스크(VHD) 하나이다.
먼저 다음 명령행이 표시하는 대로 Bell Labs 사이트에서 Plan 9 이미지를 받자.
$ wget http://plan9.bell-labs.com/plan9/download/plan9.iso.bz2 $ bunzip2 plan9.iso.bz2 |
plan9 이미지는 ISO 9660 형식을 사용하여 해석될 수 있는 하나의 ISO
형식 파일이다(곧 다룰 예정인 CD-ROM 드라이브의 에뮬레이션으로).
다음 단계는 VHD를 작성하는 것이다. 이는 호스트 운영 체제에서 파일이 될 것이라는 점을
상기하자. Bochs는 bximage라는 이 파일을 작성하는 특수 유틸리티를
제공한다. bximage 유틸리티는 대화식이고 파일이 작성되고 관리되는 방식에 대한
무수한 옵션을 지정하도록 허용한다.
목록 1은 VHD를 작성하는 세션을 제공한다.
bximage를 호출한 후에 하드 디스크 이미지(플로피 이미지가 아니라)를
작성하려는 것을 지정한다. Bochs는 수많은 이미지 유형을 지원할 수 있지만, 성능을 위해 고정된(flat) 것을
요청할 수 있다. 왜냐하면 런타임 동적 성장이 필수가 아니기 때문이다. Plan 9 운영 체제는
설치를 위한 막대한 공간 용량이 필요하므로, 700MB 디스크에 이어서 하드 디스크 파일의 이름(c.img)을
지정한다.
목록 1. bximage를 사용하여 Bochs용 VHD 이미지 작성하기
$ bximage
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c,v 1.34 2009/04/14 09:45:22 sshwarts Exp $
========================================================================
Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd]
What kind of image should I create?
Please type flat, sparse or growing. [flat]
Enter the hard disk size in megabytes, between 1 and 129023
[10] 400
I will create a 'flat' hard disk image with
cyl=1422
heads=16
sectors per track=63
total sectors=1433376
total size=699.89 megabytes
What should I name the image?
[c.img]
Writing: [] Done.
I wrote 314302464 bytes to c.img.
The following line should appear in your bochsrc:
ata0-master: type=disk, path="c.img", mode=flat, cylinders=1422, heads=16, spt=63
$ ls -la c.img
-rw-r--r-- 1 mtj mtj 733888512 2010-12-19 14:30 c.img
$
|
CD-ROM 이미지와 하드 디스크 이미지를 사용하여 다음 단계는 Bochs 구성 파일을 작성하는 것이다. 이 파일은
Bochs 에뮬레이션이 어떻게 수행되어야 정의하는 동시에 환경의 핵심 측면(ISO 파일, 하드
디스크 이미지 및 기타 등등)을 찾는 지점을 지정한다. bochsrc 구성 파일은
목록 2에 표시된다. 이 파일은 128MB RAM, 마우스, 기본
Extended Graphics Array 표시장치, 하드 디스크(ata0-master로 정의되고,
bximage로 작성됨), CD-ROM(ata1-master로 정의되고,
다운로드된 plan9.iso 파일을 가리킴), Bochs 출력에 대한 로그 파일(bochsout.txt) 및 CD-ROM의 기본 부트 디바이스를 갖춘 x86 플랫폼을
정의한다.
목록 2. bochsrc 구성 파일
# bochsrc # megs: 128 # mouse: enabled=1 # ata0-master: type=disk, path="c.img", mode=flat, cylinders=609, heads=16, spt=63 ata1-master: type=cdrom, path=./plan9.iso, status=inserted # log: bochsout.txt # boot: cdrom |
Bochs는 구성 파일을 통해 표현 가능한 수많은 옵션을 제공한다. 이러한 옵션은 어느 디바이스가 플랫폼에서 사용 가능한지 또는 표현되는 옵션의 유형을 정의할 수 있다(예를 들어, SSE 또는 Advanced Encryption Standard 확장과 같은 개별 CPU 구성).
Plan 9의 Bochs로 설치를 시작하기 위해 디스크 이미지, ISO 이미지 및 bochsrc 파일과 동일한
디렉토리에서 다음 -q 옵션(시작 메뉴를 건너뛰는 용도)으로 Bochs를 시작한다.
$ bochs -q |
이 명령은 에뮬레이트된 플랫폼을 표현하는 새 창을 작성하며, 이는 그림 3에 표시된다. 에뮬레이터는 표시되는 것처럼 디스크와 CD-ROM을 인식했고 부트하여 Plan 9 운영 체제 설치를 시작했다.
그림 3. Bochs 시작하기(Plan 9 운영 체제의 설치)
설치를 계속하면서, Plan 9는 다양한 구성 및 설치 단계를 통해 진행한다. 그림 4는 디스크의 설정(파티셔닝 용도)을 보여준다.
그림 4. Plan 9 운영 체제 설치하기
이러한 예제에 사용된 윈도잉 시스템은 Plan 9의 rio이다. Rio는 일부 고유한 특성이 있는 흥미로운 윈도잉 시스템이다. 예를 들어, rio에서 창은 자체적인 사설 네임 스페이스였고 운영 체제에서 실행 중인 애플리케이션으로 파일 시스템 인터페이스를 내보냈다(rio가 rio 창 내에서 실행하도록 허용). Rio는 UNIX용 X 윈도잉 시스템보다 앞섰고 이를 따랐던 윈도잉 시스템에 대한 기술적 기초를 제공했다.
오랜 설치가 완료되면, 에뮬레이션 머신이 중지되고 디스크로부터 부트하기 위해
bochsrc 파일이 업데이트된다(boot: disk). 창의 맨 위에서(그림 5 참조)
활성인 요소(CD-ROM, 마우스) 및 오른쪽에 제어 세트(에뮬레이트된 머신을 재설정하고
중지하거나 전원을 끄는 용도)를 보여주는 Bochs 제어가 있다.
그림 5. Bochs의 컨텍스트에서 실행 중인 Plan 9
에뮬레이션의 즐거움 중 하나는 빠르고 간단한 방식으로 다른 운영 체제를 간편하게 실행하는 기능이다. FreeDOS, DLX Linux(10MB Linux 이미지), OpenBSD, GNU/Hurd 및 KNOPPIXBochs와 같은 일부 다른 운영 체제를 시도하려면 Bochs 사이트에서 디스크 이미지 목록을 찾을 수 있다(참고자료 참조). 그림 6은 Bochs에서 FreeDOS 커널 부팅을 보여준다.
그림 6. Bochs에서 FreeDOS 실행하기
FreeDOS는 Microsoft가 더 이상 MS-DOS를 제작하지 않는다고 발표한 후에 작성된 프로젝트이며 GPL에 의해 수많은 회사들이 사용한다.
비록 Bochs가 플랫폼 에뮬레이션에 유용한 애플리케이션이지만. 다른 솔루션은 유사한 기능을 제공한다. QEMU는 PC 호환 가능 플랫폼 에뮬레이션 뿐만 아니라 다른 무수한 프로세서 아키텍처(ARM, PowerPC 및 기타 등등)를 제공하여, 가장 대중적인 것 중 하나이다.
다른 특수화된 플랫폼은 SPIM(MIPS 프로세서 시뮬레이터) 및 컴퓨터 히스토리 시뮬레이션 프로젝트를 포함하며, 이는 무수한 히스토리적으로 중대한 컴퓨팅 시스템(Altair, VAX 11/780, IBM 1130 등등)의 플랫폼 에뮬레이션을 제공한다.
Bochs는 오래된 운영 체제를 실행하기 위해 훌륭한 플랫폼 에뮬레이터이지만, 이는 또한 운영 체제를 개발하기 위해 이상적인 플랫폼이다. Bochs는 효율적인 플랫폼 에뮬레이션과 원시 하드웨어(전체 기능을 갖춘 그래픽 디버거 포함)에서 쉽게 제공되지 않는 디버깅 기능을 제공한다. 소프트웨어 테스팅에 실제 하드웨어를 능가하는 것은 없지만, Bochs는 다양한 x86 및 x86 외의 호스트에 걸쳐 휴대용인 유용한 개발 환경을 제공할 수 있다.
교육
- Bochs의 최신 버전과 뉴스, 문서, 샘플 디스크 이미지를 확인하고 발생할 수 있는
어느 문제나 해결하기 위한 메일링 목록으로 액세스하려면
Bochs 웹 사이트를 방문하자. 사이트에서 버그 보고서를 입력할 수도 있다.
- Darek Mihocka 및 Stanislav Shwartsman의 논문인
"Virtualization Without Direct Execution or Jitting: Designing a
Portable Virtual Machine Infrastructure"를 읽고 Bochs의 세부사항을 확인하고
직접 실행 없이 효율적인 플랫폼을 제공하는 방법을 학습하자.
-
Transmeta Corporation(Wikipedia에서 Transmeta
페이지 참조)은 실행을 위해 x86 명령어를 네이티브 VLIW로 변환하는 코드 모핑 기술을
개발했다.
VLIW 아키텍처와
Wikipedia에서 VLIW
아키텍처 페이지에서 이를 사용하는 CPU 아키텍처에 대해 자세히 읽어보자.
-
"System
emulation with QEMU"(developerWorks, 2007년 9월)에서는 다양한 호스트에서 실행하고 수많은
다른 아키텍처를 에뮬레이트하는 휴대용의 오픈 소스 에뮬레이터를 논의한다. QEMU는 완료된 가상화 솔루션(에뮬레이션
사용)을 제공한다.
-
Marat Fayxullin의 "How To
Write a Computer Emulator"는 해당 주제를 훌륭하게 소개하고
CPU 에뮬레이션이 메모리 등 다른 측면의 에뮬레이션과 함께 어떻게 구현되는지도 탐색한다.
- Plan 9 운영 체제는
1980년대 연구 운영 체제와 UNIX 계승자로서 Bell Labs가 작성했다. Plan 9는 특수 디바이스가 아니라
파일로서 모든 시스템 인터페이스를 대표했다. 이는 연구 목적으로 취미 애호가 커뮤니티에서 계속
개발되었다. 이러한
presentation from Rob
Pike에서 Plan 9의 윈도잉 시스템인 rio에 대해 더 자세히 배워보자. 좋아하는 운영
체제(Linux 등)에서 Plan 9의 애플리케이션으로 실험하려는 사람들에게
Plan 9 from User Space는 중요한 많은 컴포넌트의
사용자 공간 구현 방식을 제공한다.
-
developerWorks Linux 존에서는
수백 개의 기술자료 목록과 함께, Linux 개발자와 관리자를 위한
다양한 다운로드, 토론 포럼 및 다른 참고자료를 찾을 수 있다.
-
developerWorks 기술 행사 및 웹 캐스트를 통해 다양한 IBM 제품 및 IT 산업 주제에 대한 최신 정보를 얻을 수 있다.
-
무료 developerWorks Live!
briefing을 통해 최신 IBM 제품 및 도구에 대한 정보뿐만 아니라 IT 업계의 최신 경향까지도 빠르게 확인할 수 있다.
-
developerWorks on-demand demos에서는 입문자를 위한 제품 설치 및 설정부터 숙련된 개발자를 위한 고급 기능까지 망라된 다양한 데모를 제공한다.
-
Twitter의 developerWorks를 팔로우(follow)하거나
developerWorks에 대한 Linux 트윗(tweet)의 피드를 구독하자.
제품 및 기술 얻기
-
자신에게 가장한 적합한 방법으로 IBM
제품을 평가해 보자. 시험판 제품을 다운로드하거나, 온라인으로 제품을 사용해 보거나, 클라우드 환경에서 제품을 사용하거나,
SOA Sandbox에서
SOA(Service Oriented Architecture)를 효과적으로 구현하는 방법을 배울 수 있다.
토론
-
developerWorks community에 참여한다.
개발자가 운영하고 있는 블로그, 포럼, 그룹 및 위키를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.
M. Tim Jones는 임베디드 펌웨어 아키텍트이자 Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming(2판이 나왔다), AI Application Programming(2판이 나왔다), BSD Sockets Programming from a Multilanguage Perspective의 저자이기도 하다. Jones의 공학 배경은 정지 위성을 위한 커널 개발에서 시작해 임베디드 시스템 아키텍처와 네트워크 프로토콜 개발에 이르기까지 다양한 분야를 아우른다. Jones는 콜로라도 주, 롱몬트 소재 Emulex 사에서 컨설턴트 엔지니어로 활약한다.