『自作エミュレータで学ぶx86アーキテクチャ』サポートページ

このページでは『自作エミュレータで学ぶx86アーキテクチャ』(マイナビ刊)の詳しい目次、正誤情報、開発環境アーカイブなどを提供しています。

本書についての質問はサポートサイトで受け付けています。是非ご利用ください。

書籍情報

自作エミュレータで学ぶx86アーキテクチャ | マイナビブックス

開発環境

本書での開発に使う開発環境アーカイブです。サンプルコードも含んでいます。

サンプルコードはご自由にお使いください。製品等に組み込んで頂いても構いません。開発環境に含まれる各種のプログラムは、同梱してあるライセンスファイルに従って使用してください。ただし、サンプルコードの品質は保証しませんし、サンプルコードや開発環境を使うことによって生じた損害などには、著者、出版社ともに一切責任を負いませんのでご注意ください。

ひとこと概要

C言語をはじめとする高級言語が主流の今、その基礎となる機械語やアセンブリ言語がCPUでどう実行されるかを意識することはめったにありませんが、本書ではそういった“低級言語”を実行するエミュレータの制作を通してx86 CPUの仕組みや、その周りで動くメモリ、キーボード、ディスプレイといった部品とCPUの関わりをしっかり学び、エンジニアとしての“深み”を身につけることを目指します。

目次

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

普段私たちがアプリケーションの記述に使うC言語プログラムと、それがコンパイルされて生成されるアセンブリ言語プログラム、さらにCPUが唯一解釈できると言われる機械語プログラムとは、いったい何者なのでしょうか。また、それぞれどう関連しているのでしょう。

本章では、C言語プログラムがアセンブリ言語プログラムに変換される様子や、アセンブリ言語と機械語との関連性を説明します。読者の皆さんが見慣れているC言語プログラムが、最終的にどのような形に変換されてCPU上で実行されるのか、例を交えて説明します。

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

C言語で鬼門と言われるポインタ。メモリを直接操作したり配列を関数に渡すときなどに使う、C言語の中心的な機能の1つですが、C言語入門者にとっては学習が難しいとされています。本章では、本書を読むのに必要なポインタの知識を、アセンブリ言語と絡めることで従来とは別の視点からわかりやすく説明します。

まず最初はポインタを理解するための基盤となるレジスタとメモリの話をします。レジスタはCPUに内蔵された記憶装置、メモリはCPUの外側に繋がっている記憶装置で、CPUがそれらを読み書きする方法はまったく違うということを学びます。レジスタとメモリがわかった時点で簡単なCPUエミュレータを作り、感覚を養います。本章の中盤からはポインタの復習から始め、アセンブリ言語の世界から見たポインタや、不完全型とポインタの関係を学びます。アセンブリ言語の視点では、ポインタを介したメモリの読み書きも普通の変数の読み書きも、実はとても似ているのだなということがわかります。

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

今まで見てきたさまざまなプログラムは、実際のコンピュータ上でどのように実行されるのでしょうか。ここまでの内容は、主にCPUが理解する機械語と、機械語を作り出すための道具であるアセンブリ言語やC言語の対応関係、アセンブリ言語によるメモリ読み書きの仕組みなどを見てきました。しかし、まだコンピュータ・システムとして、プログラムの動作のはじめから終わりまでを紹介していませんでした。

本章では、ハードディスクドライブ(またはSSD)に書き込まれた機械語プログラムがCPUによってメモリ上に読み出されてから実行されるというプログラム起動時の話から、CPUが実際にプログラムを実行し出力を行うまでの一連の流れを説明します。その中で、C言語におけるローカル変数の定義や関数呼び出しとスタックとの関係に触れます。また、CPUが外界と相互作用するための入出力についても説明し、コンピュータと人間がどのようにやり取りするかを見てみます。

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

CPUがメモリ上の値を使って計算するだけでは、コンピュータはただの箱になってしまいます。前章の最後では、CPUはin/out命令により周辺機器とやりとりし外界と繋がることを説明しました。この機能のおかげでコンピュータは人間の役に立つ道具になっているのです。ただ、in/outで周辺機器を制御できるのは事実なのですが、正しく制御するにはどんなデータをどのタイミングで送ればキーボードからデータを受信できるかとか、HDDにデータを書き込めるかといった、機器固有の仕様をきちんと把握しなければなりません。機器の仕様はメーカーや機器の種類により違いますから、これらを1人のプログラマが把握してプログラムを作るというのは現実的ではありません。

本章では、入出力装置の差を吸収して統一したインターフェースを提供するBIOSと呼ばれる機能について、エミュレータに実装できるレベルまで深く掘り下げて説明します。現代ではあまり利用されなくなったBIOSですが、アセンブリ言語を学ぶ上で役に立つ機能ですので説明します。普通のアプリケーションを作るときはまったく見えなかった、ハードウェアに非常に近い下層の世界を覗くことになります。また、エミュレータの実装だけで閉じるのではなく、作成したプログラムを実機で動かす方法も解説します。そのために、MBRの仕組みを説明し、実際に起動イメージを作ってUSBメモリに書き込み、OSの力を借りずに自作プログラムを実行します。コンピュータの仕組みを学ぶのに、この章の知識が大いに役立つはずです。

正誤表