自作エミュレーターで作るX86アーキテクチャ

コンピューター書籍の紹介です。表紙は怪しいのですが、中身はちゃんとした本です。C言語でエミュレーターをコーディングしつつ、X86のアセンブラ(マシン語)の動く仕組みが理解できるという本です。

対象読者は、Cの基本的なプログラミングを知っていてコンパイラによって生成されたマシン語がどのようにX86の中で動いているかというのが知りたい人、となります。

Cについては、ポインタの概念、使い方と関数ポインタについて説明があるので普通の使い方を知っていれば、本を読み進むことで合わせて理解することができます。

マシン語については、16進数、レジスタ、メモリのアドレッシングについてエミュレータを作りながら説明があるのでその都度都度で必要な知識が身につくようになっています。実際のコーディングはマシン語となりますが、人が扱う時にはアセンブラが併記されており理解しやすいです。

具体的な目次は以下の通りです。

Chapter 1 C言語とアセンブリ言語

1.1 C言語から機械語へ

1.2 機械語とアセンブリ言語

1.3 機械語へ飛び込む

1.4 アセンブリ言語を少し詳しく

1.5 基本のmov命令

1.6 インクリメント専用のinc命令

1.7 16進数入門

1.8 2の補数入門

Chapter 2 ポインタとアセンブリ言語

2.1 レジスタ

2.2 メモリ

2.3 初めてのエミュレータ

2.4 ポインタの復習

2.5 ポインタへ飛び込む

2.6 構造体とポインタ

2.7 不完全系とポインタ

2.8 関数ポインタ

Chapter 3 CPUがプログラムを実行する仕組み

3.1  プログラムの配置

3.2 エミュレータのorg対応

3.3 プログラムの実行

3.4 エミュレータのModR/M対応

3.5 無条件分岐命令

3.6 call命令とスタック

3.7 エミュレータのcall対応

3.8 ローカル変数とスタック

3.9 フラグレジスタと条件分岐命令

3.10 エミュレータの条件分岐命令対応

3.11 プログラムの繰り返し

3.12 デバイスアクセス

Chapter 4 BIOSの仕組みと実機起動

4.1 BIOS

4.2 BIOSの実装

4.3 割込み

4.4 ブートセクタ

4.5 PBRを見てみよう

4.6 実機で動かしてみよう

Appendix

A 開発環境のインストールと構成

B ASCIIコード表

目次を見て分かるように第1章は機械語のイントロです。第2章はコンピューターの仕組み、アセンブラとC言語の割とハードに近い低水準のポインタや構造体の仕組みの部分の説明です。高級言語だとこの辺りは言語仕様で直接見えないようになっていますが、C言語はもとはOSを書くために使われていた言語ですので、この辺りの操作もできる言語になっています。この背景を知らないといろんな型の整数があったり、構造体のメモリの確保の仕方など、ハード由来の仕様の意味がよく分からないと思います。

第3章が一番面白い部分で、これまでの説明とC言語のポインタ、関数ポインタを駆使しつつエミュレータを作っていきます。まずは、簡単なmov命令で一つのレジスタに値を代入するシンプルなプログラムが実行できるような実装をします。以下のコードが実行できるような簡単なエミュレータをまず作成します。

BITS 32
  org 0x7c00
  mov eax, 41
  jmp 0

これを実行するために

  1. 読み込まれた機械語のコードのファイルをどこから読みだすか
  2. mov命令の実装(この場合はeax レジスタに値を入れる)
  3. jmp命令の実装

を行います。

次にこのmov命令を拡張して、各レジスタに値を代入する、メモリから、もしくはメモリへアドレッシングを指定して操作する命令を実装します。

これができると後は、命令を追加していきます。インクリメント、デクリメントや条件分岐を実装していくとほぼ実際のX86(ただし32ビットのリアルモードですが。)と同じ命令が実装できます。レジスタ内の数の操作はエミュレータなので簡単に実装できます。それぞれ段階を追って実装していくのでこうした動作をエミュレートするために必要なCでのコーディングとCPUのレジスタ、メモリ間のデータのやり取りの両方が理解できます。

この辺りは以前紹介したCPUの創りかたを読むと、電子回路、ICでどのようにこの条件分岐やmovを実装しているのかが分かって面白と思います。電子回路的には、メモリに値を入れるか、レジスタに入れるかは、回路のつなぎ方を変えているだけで、命令のデコーダの部分がハード的な実装は難しいんだと思います。

最後のBIOSのところは、既存のBIOSを呼び出すのと、実機を操作する上で知っておくとよいブートセクタ、PBRの仕組みです。この辺りは今となってはレトロな部分で直接触ることはないかもしれませんが、こうした原理や基本的なことを知っていると深い部分でコンピュータの動作原理が分かるのではないでしょうか。

外見はちょっと本屋で手に取るには勇気が必要なのですが、ページ数も200頁弱で薄い割には内容が濃く、本を見ながら自分で手を動かしてコードを書いてみるとCとアセンブラ、x86に対する理解が深まるという優れた本だと思います。

日本ブログ村のランキングに参加しています。よろしければクリックいただけるとありがたいです。
にほんブログ村 科学ブログへ

コメント

タイトルとURLをコピーしました