Bochs によるプラットフォームのエミュレーション

Bochs は QEMU と同じようにポーティング可能なエミュレーターです。Bochs では、エミュレートされたプラットフォームを使用して、あるオペレーティング・システムを別のオペレーティング・システムのコンテキストで実行するための仮想化環境を提供します。Bochs はハイパーバイザーではなく、むしろ PC 対応のエミュレーターであり、レガシー・ソフトウェアの役に立ちます。この記事では、Bochs によるプラットフォームのエミュレーション、そしてハードウェア・エミュレーションの手法について説明します。

M. Tim Jones, Independent author

author photo - M. Tim JonesM. Tim Jones は組み込みソフトウェアのエンジニアであり、『Artificial Intelligence: A Systems Approach』、『GNU/Linux Application Programming』(現在、第 2 版です) や『AI Application Programming』(こちらも現在、第 2 版です)、それに『BSD Sockets Programming from a Multilanguage Perspective』などの著者でもあります。技術的な経歴は静止軌道衛星用のカーネル開発から、組み込みシステム・アーキテクチャーやネットワーク・プロトコル開発まで、広範にわたっています。また、コロラド州ロングモン所在の Emulex Corp. のシニア・アーキテクトでもあります。



2011年 1月 25日

Tim とつながるには

Tim は developerWorks で人気の高いお馴染みの著者の 1 人です。Tim が書いたすべての developerWorks 記事を閲覧してみてください。また、My developerWorks では、Tim のプロフィールを調べることや、彼やその他の著者、そして他の読者とつながることができます。

Bochs は、劣等 GPL (GNU Public License) の下でライセンスを供与されている x86 PC のエミュレーター兼デバッガーです。このエミュレーション・プラットフォームは、1 つ以上のプロセッサーと各種 PC 周辺機器 (ハード・ディスク、ディスプレイ、CD-ROM ドライブ、そしてその他一般的な周辺機器) を含む、PC プラットフォーム全体をエミュレートします。Bochs は PC プラットフォームを対象としたオペレーティング・システムを実行するために使用できるだけでなく、オペレーティング・システムの開発にも理想的なアプリケーションです (なぜなら、Bochs が提供するデバッグ機能を使えるだけでなく、開発中のオペレーティング・システムがクラッシュしても、それをゲスト内だけに切り離しておくことができるためです)。この Bochs の機能はエミュレーションによって実現されますが、パフォーマンスは犠牲になります。

本題に移る前に、少し回り道をして、エミュレーションと現在一般的に使用されている仮想化手法との違いを説明しておきます。

Bochs の起源

Bochs は市販用の製品として誕生しましたが (Kevin Lawton が開発)、2000年の初めに Mandrakesoft (現在の Mandriva) がその権利を獲得しました。現在は、劣等 GPL の下でリリースされています。

プラットフォームのエミュレーション

Bochs はプラットフォーム・エミュレーターです。つまり実際には、最近よく話題に上る仮想化を行うのではなく、シミュレーションを行います。仮想化では、ハイパーバイザーと仮想マシン (VM) がベアメタル・ハードウェア上で実行されます (ハイパーバイザーが、通常はハードウェア・インストラクションによって VM 間でハードウェアを共有する環境を作り出します)。このプロセスは、ホスト・プロセッサーが直接命令を実行することから、一般に直接実行 (direct execution) と呼ばれます。このタイプの仮想化では、最近のプロセッサー (Intel VT-x (Virtualization Technology for x86) や AMD-V (AMD Virtualization) など) によるサポートが利用されます。一方、エミュレーションは、VM とベースとなるハードウェアおよびオペレーティング・システムとの間のレイヤーとなり、それが要求されているプラットフォーム環境であるかのように錯覚させるのが通常です (図 1 を参照)。

図 1. 仮想化とエミュレーションの比較
仮想化とエミュレーションの比較を した図

エミュレーションでは通常、ゲスト VM のインストラクションも解釈されることになります (仮想化では、ゲストのインストラクション・セット・アーキテクチャーはホストと同じでなければならないため、インストラクションの解釈は行われません)。これは、エミュレーションの興味深い利点となります。つまり、エミュレーションではゲスト VM プラットフォームがホストと全く違っていても構わないという利点です (例えば、IBM® PowerPC® ターゲット上で x86 ゲストを実行するなど)。

エミュレーションが持つ興味深い利点には、環境を完全に制御できることも挙げられます。そのため、マシン全体を一時停止させてその状態を検査することも、オペレーティング・システムのエラー・ツリーをテストするために、あらゆる種類のエラーをエミュレーションに取り込むことも容易になります。こうした機能にはパフォーマンスの犠牲が伴うものの、エミュレーションを行うような環境ではまさに利点となります。さらに、エミュレーターは本当の意味で、ゲストをホストから切り離します。このように、エミュレーターは環境に完全な透過性をもたらすことができます。

その他のエミュレーションの形態

エミュレーションは、システムの振る舞いを模倣するために頻繁に使われている手法です。エミュレーションが使用されている分野は数多くあります。その 1 つは、設計中または開発中のハードウェアを対象としたハードウェア・エミュレーションです。さらには、今では存在しないハードウェアを対象とした (過去に使われていたオペレーティング・システムを実行するための) ハードウェア・エミュレーションもあります。よく使用されているエミュレーションとしては、今ではもう存在しないプロセッサー技術を対象として、テレビ・ゲームを再び使えるようにするためのコンソール・エミュレーションもあります。

エミュレーションのパフォーマンス

エミュレーションをパフォーマンス・アーキテクチャーで使用できる場合もあります。その一例は、Transmeta によって編み出されたコード・モーフィング技術です。Transmeta のプロセッサーは VLIW (Very Long Instruction Word) スーパー・スカラー・アーキテクチャーであり、x86 のコード・シーケンスをエミュレートすることが可能でした。その方法は、コード・シーケンスのエミュレーションまたは動的コンパイル (QEMU の機能と同様) です。Transmeta は 1995年に設立され、2007年後半まではプロセッサーの生産を行っていました。

別の例としては Java 技術もあり、Java バイト・コードがホストのアーキテクチャーに解釈されます。Java 技術は JIT (Just-In-Time) コンパイルを実装して、非効率性にある程度対処します。Transmeta や他の多くのエミュレーション・ソリューション (Bochs と同じようなプラットフォーム・エミュレーションである QEMU など) でも非効率性に対処していますが、Bochs は効率的なエミュレーション (最近のプロセッサーでは最大 100 MIPS (Million Instructions Per Second)) を実現するだけではなく、ポーティングすることも可能です。それは、Bochs は解釈された x86 インストラクションの実行およびプラットフォームのエミュレーションを目的に、純粋に C++ 言語で開発されているからです。


Bochs の実装

ここからは、Bochs が純粋な C++ 実装で実用的なパフォーマンスを実現する仕組みを理解するために、Bochs の内部構造について説明します。この記事ではエミュレーションの側面のうち、CPU (ISA (Instruction Set Architecture) エミュレーション) とデバイスの 2 つに焦点を絞ります。

CPU のエミュレーション

Bochs のエミュレーション手法は他とは異なります。他のソリューションでは直接実行や JIT コンパイルを行えるようになっていますが、Bochs は純粋な CPU ISA エミュレーションを実装します (対称型マルチプロセッシング構成では、最大 8 基の CPU で x86 および x86-64 の CPU エミュレーションもサポートします)。Bochs は本物の CPU のエミュレーションをするだけでなく、CPU のフェッチ・デコード・実行のフローのレベルまでエミュレートします。

フェッチ・ステージでは、Bochs はまず権限を確認してから、オペ・コードをフェッチします。デコード・ステージでは、フェッチした x86 インストラクションを内部表現にデコードします。また、元の x86 システムの「マイクロ演算」を保管してパフォーマンスを改善するために、インストラクション・キャッシュを維持します (後でこのキャッシュから命令をフェッチできるため、デコードのオーバーヘッドがありません)。最後の実行ステージでは、Bochs はその特定のインストラクションの実行に伴う数々の演算を行います (これには、オペランドの実効アドレスを計算してから、特定のインストラクション実行メソッドを間接的に呼び出すという操作も含まれます)。インストラクションの実行が完了すると、それによって影響を受けたレジスターおよびフラグを (必要に応じて) 更新することができます。Bochs がここで行う最適化は、遅延フラグ更新 (lazy flags update) というもので、演算フラグは各ステップで更新されるのではなく、必要になったときにだけ計算されます。

フェッチ・デコード・実行のフロー以外に、Bochs はデバイス割り込みなどの外部イベントや、バイト・スワップおよびその他の必要な機能 (特権レベルのチェックなど) も管理します。Bochs は汎用の x86 CPU の他、MMX 技術を使用したIntel Pentium プロセッサー、Intel の SSE2 (Streaming Single Instruction, Multiple Data Extensions 2)、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 (Network Interface Card) や物理ディスクなど) との通信もエミュレートしなければならない可能性があることを意味します。

図 2. エミュレーションによるデバイスの仮想化
エミュレーションによるデバイスの仮想化を示す図

Bochs を使用する

Bochs とそのユーティリティーを使って各種のゲスト・オペレーティング・システムをエミュレートするのは極めて簡単なことです。これから Plan 9 from Bell Labs オペレーティング・システムを例に、エミュレーションを行う方法を説明します。

Bochs をインストールする

お使いのシステムに Bochs がインストールされていなければ、まずは Bochs をインストールしてください。私が使用しているUbuntu システムには、以下のように apt パッケージ・マネージャーを使用して必要なパッケージをインストールします。

$ sudo apt-get install bochs
$ sudo apt-get install bochs-x

上記のコマンドによって、Bochs IA-32/64 PC エミュレーターと Bochs の X-11 エミュレーターがインストールされます。

Plan 9 をインストールできるように準備する

Bochs で Plan 9 をエミュレートするには、仮想化環境に必要なものが、さらに 2 つあります。その 1 つは、Plan 9 インストール・イメージが含まれる CD-ROM、もう 1 つはインストール先とする VHD (Virtual Hard Disk) です。

最初に、以下のコマンドラインに示すように、Bell Labs サイトから Plan 9 イメージを入手します。

$ wget http://plan9.bell-labs.com/plan9/download/plan9.iso.bz2
$ bunzip2 plan9.iso.bz2

plan9 イメージ・ファイルは ISO フォーマットのファイルなので、ISO 9660 フォーマットを使って解釈することができます (この後すぐに説明するように、CD-ROM ドライブのエミュレーションとして解釈します)。

次のステップでは、VHD を作成します。前にも説明したように、これは、ホスト・オペレーティング・システム上のファイルとなることを思い出してください。Bochs には、このファイルを作成する bximage という特殊なユーティリティーが用意されています。bximage は対話型のユーティリティーで、ファイルの作成および管理方法に関する多数のオプションを指定することができます。リスト 1 に、VHD を作成するためのセッションを記載します。ここに示されているように、bximage を呼び出した後、作成するイメージとして (フロッピー・ディスク・イメージではなく) ハード・ディスク・イメージを指定します。Bochs では多数のイメージ・タイプをサポートすることができますが、実行時に動的に拡張する必要がなければ、パフォーマンスに負担をかけないように、フラットなイメージをリクエストしてください。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
$

Plan 9 をインストールする

CD-ROM イメージとハード・ディスク・イメージが用意できたら、次のステップとなるのは、Bochs 構成ファイルを作成することです。このファイルで Bochs エミュレーションの実行方法を定義するとともに、環境の重要な要素 (ISO ファイル、ハード・ディスク・イメージなど) の検索先を指定します。リスト 2 に記載する bochsrc 構成ファイルで定義している x86 プラットフォームには、128MB の RAM、マウス、デフォルトの Extended Graphics Array ディスプレイ、ハード・ディスク (bximageによって作成した、ata0-master として定義)、CD-ROM (ダウンロードされた plan9.iso ファイルを指す ata1-master として定義)、Bochs 出力のログ・ファイル (bochsout.txt)、そして CD-ROM のデフォルト・ブート・デバイスを指定しています。

リスト 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 構成)。

Bochs に Plan 9 をインストールするには、まず始めに -q オプションを指定して (スタート・メニューを省略するため)、ディスク・イメージ、ISO イメージ、bochsrc といったファイルが置かれているディレクトリーで Bochs を起動します。

$ bochs -q

このコマンドによって、エミュレートされたプラットフォームを表す新しいウィンドウが作成されます (図 3 を参照)。図に示されているように、エミュレーターはディスクと CD-ROM を認識し、CD をブートして Plan 9 オペレーティング・システムのインストールを開始します。

図 3. Bochs の起動 (Plan 9 オペレーティング・システムのインストール)
Bochs の起動 (Plan 9 オペレーティング・システムのインストール)

インストールの進行中には、Plan 9 のさまざまな構成ステップとインストール・ステップが実行されます。図 4 に、ディスクのセットアップ (パーティショニング) を示します。

図 4. Plan 9 オペレーティング・システムのインストール
Plan 9 オペレーティング・システムのインストールの様子を示す図

上記の例で使用されているウィンドウ・システムは、Plan 9 の rio です。rio は興味深いウィンドウ・システムで、他には類のない特性を備えています。例えば、rio のウィンドウは rio 独自のプライベートな名前空間であり、ファイルシステム・インターフェースをオペレーティング・システムで実行中のアプリケーションにエクスポートします (rio ウィンドウ内で rio を実行できるようにするため)。rio は UNIX の X ウィンドウ・システムより前から存在し、その後のウィンドウ・システムの技術的基礎となりました。

長時間にわたるインストールが完了すると、エミュレーション・マシンが停止し、bochsrc ファイルがディスクからブートするように更新されます (boot: disk)。ウィンドウ (図 5 を参照) の最上部には、アクティブな要素 (CD-ROM、マウス) を示す Bochs コントロールがあり、その右側に一連のコントロール (エミュレートされたマシンをリセット、中断、電源オフするためのコントロール) があることに注意してください。

図 5. Bochs のコンテキストで実行中の Plan 9
Bochs のコンテキストで実行中の Plan 9 の様子を示す図

他のオペレーティング・システムを実行する

エミュレーションの利点の 1 つは、他のオペレーティング・システムを短時間で簡単に実行できることです。他のオペレーティング・システムを試してみるには、Bochs サイト (「参考文献」を参照) にアクセスして、ディスク・イメージのリストを調べてください。このリストには、FreeDOS、DLX Linux (10MB Linux イメージ)、OpenBSD、GNU/Hurd、KNOPPIX などが含まれています。図 6 に示されているのは、Bochs でブートしている FreeDOS カーネルです。

図 6. Bochs で実行中の FreeDOS
Bochs で実行中の FreeDOS オペレーティング・システムの様子を示す図

FreeDOS は、Microsoft が MS-DOS の販売中止を発表した後に作成されたプロジェクトです。多くの企業が GPL の下で、このオペレーティング・システムを使用しています。


その他のエミュレーション・プラットフォーム

Bochs はプラットフォーム・エミュレーションに役立つアプリケーションですが、同じような機能を提供するソリューションは他にもあります。なかでも、特によく使用されているのは QEMU です。QEMU は PC 互換のプラットフォーム・エミュレーションを行うだけでなく、その他の多種多様なプロセッサー・アーキテクチャー (ARM、PowerPC など) も提供します。

その他の特化されたプラットフォームには、SPIM (MIPS プロセッサー・シミュレーター) や、歴史的に重要な数々のコンピューティング・システム (Altair、VAX 11/780、IBM 1130、ほか) のプラットフォーム・エミュレーションを行う歴代コンピューターのシミュレーション・プロジェクトもあります。


さらに詳しく調べてください

Bochs は、かつてのオペレーティング・システムを実行できる優れたプラットフォーム・エミュレーターというだけではなく、オペレーティング・システムを開発するにも理想的なプラットフォームです。Bochs は効率的なプラットフォーム・エミュレーションを行うとともに、(フル装備のグラフィカル・デバッガーを含め) 物理ハードウェアでは簡単に行えないデバッグの機能を提供します。ソフトウェアをテストするには本物のハードウェアに勝るものはありませんが、Bochs でなら、さまざまな x86 ホストおよび非 x86 ホストにポーティングできる有用な開発環境を提供することができます。

参考文献

学ぶために

  • Bochs の Web サイトにアクセスして、最新バージョンの Bochs、ニュース、資料、サンプル・ディスク・イメージを調べてください。問題の解決に役立つメーリング・リストにも、ここからアクセスできます。また、バグ・レポートを提供することもできます。
  • Darek Mihocka および Stanislav Shwartsman による記事「Virtualization Without Direct Execution or Jitting: Designing a Portable Virtual Machine Infrastructure」を読んで、Bochs の詳細、そして Bochs が直接実行を使用せずに効率的なプラットフォームを実現する仕組みを学んでください。
  • Transmeta 社 (ウィキペディアの「トランスメタ」ページを参照) は、x86 命令をネイティブ VLIW に変換して実行するためのコード・モーフィング技術を編み出しました。ウィキペディアの VLIW アーキテクチャーに関するページで、VLIW アーキテクチャーとこのアーキテクチャーを使用する CPU アーキテクチャーについての詳細を読んでください。
  • QEMU によるシステムのエミュレーション」(developerWorks、2007年9月) では、さまざまなホストで実行して各種のアーキテクチャーをエミュレートする、移植性のあるオープンソースのエミュレーターについて説明しています。QEMU は、(エミュレーションという手段を使用した) 完全な仮想化ソリューションとなります。
  • How To Write a Computer Emulator」(Marat Fayzullin 著) では、コンピューターのエミュレーターを作成する方法をわかりやすく紹介するとともに、CPU エミュレーションがメモリーなどの他の要素のエミュレーションと併せて実装される仕組みを探っています。
  • Plan 9 オペレーティング・システムは、UNIX の後継の研究用オペレーティング・システムとして 1980年に Bell Labs によって開発されました。Plan 9 はすべてのシステム・インターフェースを特殊デバイスではなく、ファイルとして表します。Plan 9 の開発は、研究用として今でも愛好家コミュニティーのなかで続けられています。Plan 9 のウィンドウ・システム、rio についての詳細は、Rob Pike によるプレゼンテーションで学んでください。Plan 9 のアプリケーションをお気に入りのオペレーティング・システム (Linux など) で試してみたいという方のために、Plan 9 from User Space では重要な多くのコンポーネントのユーザー空間実装を用意しています。
  • developerWorks Linux ゾーンで、Linux 開発者および管理者向けのハウツー記事とチュートリアル、そしてダウンロード、ディスカッション、フォーラムなど、豊富に揃った資料を探してください。
  • さまざまな IBM 製品および IT 業界についての話題に絞った developerWorks の Technical events and webcasts で時代の流れをキャッチしてください。
  • 無料の developerWorks Live! briefing に参加して、IBM の製品およびツール、そして IT 業界の傾向を短時間で学んでください。
  • developerWorks の on-demand demos で、初心者向けの製品のインストールとセットアップから、熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを見てください。
  • developerWorks on Twitter で developerWorks をフォローするか、developerWorks で Linux に関するツイートのフィードに登録してください。

製品や技術を入手するために

  • ご自分に最適な方法で IBM 製品を評価してください。評価の方法としては、製品の試用版をダウンロードすることも、オンラインで製品を試してみることも、クラウド環境で製品を使用することもできます。また、SOA Sandbox では、数時間でサービス指向アーキテクチャーの実装方法を効率的に学ぶことができます。

議論するために

  • My developerWorks コミュニティーに加わってください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、ウィキを調べることができます。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=627556
ArticleTitle=Bochs によるプラットフォームのエミュレーション
publish-date=01252011