はじめに
仮想化技術について理解を深める中でモヤモヤするのは、そもそもコンピュータの仕組みの理解不足だと感じた。そこで、「コンピュータはなぜ動くのか」という本をきっかけに色々理解を深めてみた。
1. バイナリコードはCPUに依存する
CPUには「命令セットアーキテクチャ」という仕様があり、各命令がどのようなバイナリ(0と1の列)で表されるかが決まっている。
- x86(Intel、昔のMac)
- ARM(Apple Silicon)
同じ処理でも、CPUが違えば命令の形もバイナリ列も異なる。
たとえば、「レジスタに1を入れる」という処理でも:
- x86では
0xB8 0x01 0x00 0x00 0x00
- ARMではまったく異なる命令とバイト列
つまり、バイナリコードは「どのCPU向けか」が明確に決まっている。
2. OSの正体:OSも結局はバイナリ
OS(Operating System)とは、基本的には カーネルというソフトウェア本体 を指す。これはCなどで書かれたプログラムで、最終的に CPUが理解できるバイナリコードにコンパイルされる。
たとえば:
- macOS(Intel用)
- macOS(Apple Silicon用)
- Ubuntu(x86用)
- Ubuntu(ARM用)
など、それぞれ別のバイナリとして存在している。だからこそ、違うCPUにOSを移植するには「命令を理解できるように作り直す」必要がある。
3. コンパイラ言語とインタプリタ言語の違い(CPUとの関係)
コンパイラ言語
- ソースコード → コンパイラ → そのCPU用のバイナリに変換
- CPUが違えば再コンパイルが必要
例:C, C++, Rust, Go
インタプリタ言語
- ソースコード → インタプリタ(バイナリ) が1行ずつ実行
- スクリプト自体はCPU非依存
- ただし インタプリタはCPU依存のバイナリ(Python自身がARM用 or x86用)
例:Python, Ruby, Bash, PHP
4. 仮想化とエミュレーション:CPUの違いを吸収する技術
仮想化(Virtualization)
- CPUアーキテクチャが同じ前提で、仮想マシン上に別のOSをインストール
- 命令はそのまま物理CPUで実行(=高速)
例:
- Intel Mac上にVirtualBoxでWindows(x86)を動かす → 仮想化でOK
エミュレーション(Emulation)
- CPUが異なる場合、命令が通じない
- QEMUなどが 1命令ずつ読み取り、翻訳して実行(=遅いが動く)
例:
- Apple Silicon Mac(ARM)でx86用Windowsを動かす → エミュレーションが必要
5. まとめ:重要なのは「誰がCPUの違いを吸収するか」
項目 | 誰が命令を変換・吸収するか |
---|---|
コンパイラ言語 | コンパイラ(ビルド時) |
インタプリタ言語 | インタプリタ(実行時) |
仮想化 | OSそのまま、変換不要(CPU一致) |
エミュレーション | QEMUなどが命令を変換(CPU不一致) |
6. 補足:OSインストールとISOファイルについて
仮想化環境でOSを動かすには、ISOファイルを使う。これは、
OSインストール用のCD/DVDの中身を、丸ごと1ファイルにしたもの
仮想化の手順(例:Intel Mac)
1. 仮想マシンを作成(名前:Windows)
2. 仮想ハードディスクを作成(例:50GB)
3. WindowsのISOファイルを読み込む
4. 仮想マシンを起動 → インストーラが走る
5. 仮想ディスクにOSをインストール