C LANGUAGE TECHNOLOGY

仮想化技術とC/C++言語で開発された代表的な仮想化ソフトウェア

悩んでいる人

仮想化技術とC/C++言語で開発された代表的な仮想化ソフトウェアを教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity/Vyper,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

仮想化

仮想化とは,同じハードウェア上で複数のOSやユーザーアプリケーションを動作させる方法です.

仮想化を利用することで,1台のサーバが保持しているCPU,メモリ,ストレージ等のリソースを効率的に配分して活用できるようになります.

これまで何台も必要だった物理サーバの数を減らせるため,低コストで運用することができます.

仮想化の説明は以下の動画がわかりやすいです.

また,本記事では以下のOSの概要の動画を理解していることを前提としています.

仮想マシン(VM:Virtual Machine)

仮想マシン(VM:Virtual Machine)は,コンピュータシステムの仮想化(エミュレーション)です.

仮想マシンは,コンピュータアーキテクチャに基づき,物理的なコンピュータの機能を提供します.

仮想マシンの実装には,専用のハードウェア,ソフトウェア,またはその組み合わせが必要です.

仮想マシンの歴史は以下になります.

1960~1970年代は,高価なメインフレームを簡単に共有するために仮想化技術が開発されました.

この理由として,メインフレームのIBM TSS/360は当時5000万ドルもするためです.

メインフレームでは,同じマシン上で複数のOSを動かすことができ,シングルユーザのシングルタスクOSをタイムシェアリングシステムで動作させます.

※IBM VM System/370は1967年に最初の仮想マシンとなりました.

1980~1990年代は,メインフレームがどんどん安くなったため,流行遅れになりました.

仮想化技術の低迷期に入っていたのですが,2005年に産学で話題になりました.

仮想化の話題の詳細は「Virtual Machine Monitors: Current Technology and Future Trends」の論文で語られています.

  • 産業界(Intel,AMD,Sun Microsystems,IBM)は,仮想化技術を開発
  • 学術界:モビリティ,セキュリティ,管理の問題を解決する研究

現在はコンピュータの進歩により,クラウドサーバのような高性能マシンだけでなく,PC,エッジ端末(スマホ,自動車等)でも仮想化技術が利用されています.

仮想マシンは以下のタイプがあります.

  • システム仮想マシン(System Virtual Machine):Instruction Set Architecture(ISA)レベルの仮想化により,OSのプラットフォームを提供(例:IBM 370VMware Workstation
  • プロセス仮想マシン(Process Virtual Machine):Application Binary Interface(ABI)レベルの仮想化により,単一プログラム(プロセス)のプラットフォームを提供(例:Java VM

システム仮想マシンのVMWare workstationの使い方を知りたいあなたはこちらからどうぞ.

VMware Ubuntu Linux
VMwareでLinux(Ubuntu 22.04 LTS)のインストール【Sambaでファイル共有】

こういった悩みにお答えします. 目次1 VMwareでLinux(Ubuntu 22.04 LTS)のインストール2 Sambaでファイル共有3 まとめ VMwareでLinux(Ubuntu 22. ...

続きを見る

仮想マシン技術は,1台のマシンを複数のマシンとして使用できます.

つまり,1台のマシンで複数のOSを動かすことができます.

仮想マシンは,物理的なコンピュータのようにOSやアプリケーションを動作させるソフトウェアで,ホストマシンを模倣(コピー)したものです.

多くの場合,コードの修正は必要ありません.

ホストマシンと仮想マシンの関係は下図になります.

virtual machine

仮想マシンモニタ(VMM:Virtual Machine Monitor)

仮想マシンモニタ(VMM:Virtual Machine Monitor)は,物理マシン上で複数の仮想マシンを実行できるようにするソフトウェアです.

ここで,仮想マシンモニタと仮想マシンは異なるので注意して下さい.

また,以下の用語を覚えておきましょう.

  • ハイパーバイザ:仮想マシンモニタ
  • ゲストOS:仮想マシンモニタ上のソフトウェア
  • ゲストアプリケーション:仮想マシン上のソフトウェア
virtual machine monitor

仮想マシンモニタ(ハイパーバイザ)の種類と代表的な仮想化ソフトウェアの例は以下になります(主にC/C++言語で開発).

タイプ1とタイプ2の比較は下図になります.

types of vmms

VMMの詳細は以下の動画で学べます.

仮想化のカテゴリ

仮想化のカテゴリは以下になります.

また,仮想化の実装方法は以下になります.

  • ソフトウェア仮想化:ソフトウェアのみで仮想化(ハードウェアによる仮想化支援機構を前提としない)
  • ハードウェア仮想化:ハードウェアによる仮想化支援機構を利用して仮想化

上記の仮想化を組み合わせた代表例は以下になります.

  • 完全仮想化とソフトウェア仮想化:VMWare workstation,QEMU
  • 準仮想化とソフトウェア仮想化:Xen
  • ハードウェア仮想化:Intel VT,AMD-V,AArch64 Virtualization

PopekとGoldbergによるVMMの特徴

PopekとGoldbergによるVMMの特徴は以下になります.

VMMを定義した内容ですので,きちんと理解しておきましょう.

  • Fidelity (類似性):VMM上で動くソフトウェアは実マシン上で動くのと同様に動く(VMMは実マシンとほぼ同様の実行環境を提供する)
  • Performance(性能):ゲストが実行する機械語命令 (machine instruction) の圧倒的大多数はホスト計算機によって直接実行(直接実行できない命令はVMMが対処する)
  • Safety(安全):ハードウェア資源はVMMが管理する(ゲストOSはVMに割り当てられた資源のみを管理する)

リソースの仮想化

仮想化技術の本題であるリソースの仮想化を紹介します.

仮想化技術は,以下のハードウェアを仮想化しますので,それぞれ解説していきます.

  • CPU
  • メモリ
  • I/O

CPUの仮想化

CPUの仮想化は,安全にゲストの命令列を実行できるようにすることで実現します.

ここで,「安全に」とはVMMや他のVMを阻害しないことです.

ゲストの命令列には特権命令も含むことに注意して下さい.

CPU時間をそのままVMに与えてしまうと,ゲストOSが特権命令を実行してしまいます.

結果として,ゲストOSはホスト計算機を占有していると思い込んでいるため, 他のVMやVMMの状態を破壊してしまいます.

そこで,De-Privilegingと呼ばれるゲストOSを非特権モードで実行する手法が開発されました.

De-Privilegingは,ゲストOSの特権命令により,他のVMやVMMの整合性が破壊されるのを防ぎます.

特権命令を実行しようとすると保護例外が発生し,VMMに制御が移ります (VMM は特権レベルで動作).

VMMでは特権命令をエミュレートし,ゲストOSは特権命令が期待通りに実行できたと勘違いします.

特権命令のエミュレート例は以下になります.

  • あるVMがcli(割り込み無効命令)を実行する.
  • 保護例外が発生し,VMMに制御が移ります.
  • 割り込み禁止のVM宛ての割り込みは配信待ちにします.

ここで,実CPUの割り込みが無効ではないことに注意して下さい.

なぜなら,他のVMでは割り込みを待っているかもしれないため,実CPUの割り込みを無効にはできません.

センシティブ(sensitive)命令は,ゲストOSが直接実行するとVMMやホストOSと干渉する可能性がある(システムを破壊する可能性がある)命令(例:I/O命令)のことです.

ハイパーバイザは,特権命令の実行だけを調停すれば良いのではなく,正確にはセンシティブ命令の実行を調停する必要があることに注意して下さい.

また,センシティブではない普通の命令をinnocuous命令と呼びます.

センシティブ命令と特権命令の関係は下図になります.

sensitive instructions

センシティブ命令の例は以下になります.

  • Control-sensitive:システムの状態を参照したり変更したりする命令
  • Behavior-sensitive:CPUの動作モードによって処理内容が異なる命令

Control-sensitiveの例として,割り込みを無効にする命令があります.

ゲストOSがシステム全体の割り込みを制御することができないからです.

他には,CPUの動作モードを参照する命令がありますが,以下のケースでは問題になります.

この理由は,ゲストOSが取得するCPUの動作モードと,システム全体のCPUの動作モードが異なる可能性があるからです.

上記の問題があるため,Behavior-sensitiveというCPUの動作モードによって処理内容が異なる命令があります.

例えば,Intel x86のpopf命令(スタック上の値をフラグレジスタに読み込む命令)です.

フラグレジスタのフラグには割り込み許可フラグがあります.

popf命令を利用して割り込み許可フラグを変更しようとすると,CPUの動作モードによって以下の違いがあります.

  • 特権モード:割り込み許可フラグが変更可能
  • 非特権モード:割り込み許可フラグの変更は無視(無視されるだけで保護例外は発生しない)

popf命令の実行が問題となるケースは以下の場合です.

typical virtualizable cpu

上図に(古典的な意味での)仮想化可能なCPUを示します.

CPUが仮想化可能(virtualizable)であるとは,センシティブ命令が特権命令の部分集合であることです.

上記の包含関係が成立していれば,ゲストOSは非特権モードで動作しているため,ゲストOSはセンシティブ命令を直接実行できません.

センシティブ命令を実行すると保護例外が発生します.

トラップとエミュレートは,古典的なVMMの実装手法です.

古典的なVMMの実装手法において,VMMは特権モード,ゲストOSは非特権モードで動作します.

ゲストのOSおよびアプリは以下の動作になります.

  • innocuous命令は直接実行する.
  • sensitive命令はトラップが起き,VMMに制御が移る.

VMMは以下の動作になります.

  • トラップを起こしたsensitive命令をエミュレートする.
  • ゲストOSが期待している動作を行う.

例えば,CPUの動作モードを参照する場合,実CPUの動作モードは非特権モードでも特権モードを返します.

Intel x86は古典的な意味では仮想化できません.

なぜなら,以下の18種類のセンシティブだが非特権の命令が存在するからです.

※今後も増える可能性があります.

  • センシティブレジスタ命令:クロックレジスタや割り込みレジスタなどのセンシティブレジスタやメモリ配置を読み出したり変更したりする.
    • sgdt,sidt,sldt
    • smsw
    • pushf,popf
  • 保護システム命令:記憶保護システム,メモリまたはアドレス再配置システムを参照する.
    • lar,lsl,verr,verw
    • pop
    • push
    • call far,jmp far,int N,retf
    • str
    • mov(セグメントレジスタ)

CPUの仮想化の詳細は以下の動画で学べます.

メモリの仮想化

各VMは物理メモリを独占していると思って実行しています.

  • 物理メモリは0番地から始まる.
  • 物理メモリは連続している.

実際のシステムでは以下になります.

  • ホスト計算機の物理メモリを分け合って使っている.
  • 物理メモリは0番地から始まるとは限らない.
  • 物理メモリは連続しているとは限らない.

そこで,各VMには0番地から始まる連続したメモリがあると思わせたいので,メモリ仮想化を実現する必要があります.

メモリを仮想化するには2段階のアドレス変換が必要です.

  • 1段目のアドレス変換:仮想アドレス→ゲスト物理アドレス(ゲストOSが両者の対応を管理)
  • 2段目のアドレス変換:ゲスト物理アドレス→ホスト物理アドレス(VMMが両者の対応を管理)

上記のメモリの仮想化に関連する専門用語は以下になります.

  • 仮想アドレス (guest virtual addr; gVA):VM上の仮想アドレス
  • ゲスト物理アドレス (guest physical addr; gPA):VM上の物理アドレス
  • ホスト物理アドレス (host physical addr; hPA):ホスト計算機上の物理アドレス

通常のMMUでは2段階のアドレス変換はできないため,VMMは以下を実装しています.

  • VMware Workstation:Shadow Page Tableを提供
  • Xen:以下の3つのモードを提供
    • Direct Mode:もっとも効率がよいが,ゲストOSの準仮想化には面倒
    • Writable Page Table Mode:完全仮想化よりは効率がよいが,ゲストOSの準仮想化の手間は妥当
    • Shadow Page Table Mode:効率はよくないが,ゲストOSの準仮想化は簡単

メモリの仮想化の詳細は以下の動画で学べます.

I/Oの仮想化

ゲストOSはI/Oデバイスを独占していると思っています.

I/Oデバイスを多重化してゲストOSに見せる必要があるため,I/Oの仮想化が実現されています.

ここで,ゲストOSの見ているデバイスを仮想デバイス(Virtual Device)と呼びます.

I/Oの仮想化の概要は下図になります.

I/O virtualization

I/Oの仮想化は性能への影響が大きいため,重要な研究課題となっています.

しかし,多種・多様なデバイスに対応するため,開発コストが高くなる可能性があります.

VMware WorkstationのI/Oの仮想化では,VMM自身はデバイスドライバを持たない設計です.

例えば,VMware hosted architectureで採用されている手法では,I/OデバイスへのアクセスはすべてホストOSに任せます.

また,仮想化するデバイスを絞り込み,標準的なPCデバイスのみを仮想化しています.

  • PS/2 キーボード,PS/2マウス,フロッピー,IDE/ATA
  • ATAPI CD-ROM,AMD PCNet Ethernet等

XenのI/Oの仮想化は,Split device driver architectureに基づいてデバイスモデルを設計しています.

準仮想化されたデバイスドライバでは,ゲストOS全体が準仮想化されているため,VMwareより過激です.

ドライバドメイン(driver dom)というI/O専用ドメインが実デバイスにアクセスします.

ここで,Xenにおけるドメインとは,仮想マシンモニタの上で動作するOSのことです.

ドメイン0(dom0)がホストOS(特権ドメイン),ドメインU(domU)がゲストOS(一般ユーザ)になります.

また,ドライバドメインは実デバイスにアクセスするためのドライバを持ちます.

通常,ドメイン0がドライバドメインを兼ねます(下図).

※Frontend DriverはゲストOSに対する仮想デバイス,Backend Driverはカーネル内のI/O処理モジュールです.

xen I/O virtualization

I/Oの仮想化の詳細は以下の動画で学べます.

まとめ

仮想化技術とC/C++言語で開発された代表的な仮想化ソフトウェアを紹介しました.

仮想化技術はとても奥が深くて難しいので,何度も読み込みましょう!

仮想化技術を深掘りしたいあなたは,以下を読みましょう!

以下の動画もおすすめです.

完全仮想化,準仮想化のXen,VMのライブマイグレーション,VMのチェックポイントとクローン,コンテナが学べます.

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!

友だち追加

独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , ,