【改訂新版】作って理解するOS x86系コンピュータを動かす理論と実装
-
林高勲 著
川合秀実 監修 - 定価
- 4,840円(本体4,400円+税10%)
- 発売日
- 2026.10.26
- 判型
- B5変形
- 頁数
- 1,072ページ
- ISBN
- 978-4-297-15921-4 978-4-297-15922-1
概要
OSさえ作れてしまうほど、コンピュータへの理解が深まる
64ビットモード・UEFIにも対応、300ページ超の大幅増補改訂
現在広く普及している、x86系CPU搭載のコンピュータ。本書はOSの機能を実装しながら、その姿を明らかにしていきます。
第1部:ハードウェア・ソフトウェアの基本概念や、CPUとOSの関係など、コンピュータの核となる理論を体系的に理解
第2部:x86系コンピュータに対象を絞り、レジスタの構成や、機械語命令の使い方などを丁寧に押さえる
第3部:第1部と第2部の知識を活かしながら、BIOS環境で起動する32ビットOSを実装する
第4部:これまでの集大成として、UEFI環境で起動する64ビットOSを実装する
「2進数とは何か?」からマルチタスクOSの実装まで、コンピュータの本質を一冊に凝縮。根気強く取り組めば、時代を超えて通用する確かな基礎が身につく、本格派のOS入門です。
こんな方にオススメ
- コンピュータの原理やOSに関心のあるITエンジニア・情報学科の学生
- 初版の読者で、64ビットモード・UEFI対応を期待していた方
目次
- 本書に掲載しているコードについて
イントロダクション
コンピュータが数を数えるしくみとC言語への応用
- 0.1 コンピュータが数を数えるしくみ
- 0.2 C言語の基礎
- 0.3 C言語の構造とフローチャート
第1部 コンピュータの基礎を理解する
第1章 ハードウェアの基礎
- 1.1 ハードウェアで何ができるのか
- 1.2 ハードウェアに計算させる方法
- 1.3 計算に必要なハードウェア
- 1.4 外部記憶装置のしくみ
第2章 ソフトウェアの基礎
- 2.1 チューリングマシン――問題解決の手順の考察
- 2.2 OSの主な役割
- 2.3 プロセスとは何か
- 2.4 カーネルとは何か
- 2.5 同期処理の必要性とその実現方法
- 2.6 デッドロックの発生要因とその回避方法
- 2.7 スケジューリング――プロセスの実行を制御する手法
第3章 メモリ管理のしくみ
- 3.1 メモリの種類と用途
- 3.2 セクションとメモリの関係
- 3.3 メモリを効率的に利用する手法
第4章 ファイルシステムのしくみ
- 4.1 ファイル情報――属性とデータの管理
- 4.2 ファイル操作――汎用的なインターフェイス
- 4.3 通常ファイルと特殊ファイル
- 4.4 シーケンシャルアクセスとランダムアクセス
- 4.5 ファイルシステムの階層構造
- 4.6 ファイル名――記録データの識別方法
- 4.7 ディレクトリ――論理的グループによるデータ管理
- 4.8 ブロック単位でのデータ管理方法
第5章 入出力のしくみ
- 5.1 入出力デバイスの種類
- 5.2 入出力ソフトウェアの階層構造
- 5.3 デジタル通信の基礎
- 5.4 GUID
第2部 x86系PCのアーキテクチャを理解する
第6章 コンピュータの基本構成
- 6.1 CPU、メモリ、外部記憶装置の関係
- 6.2 電源投入時に行われる処理
- 6.3 入出力装置(ポート)の役割
- 6.4 割り込みコントローラの役割
第7章 CPUの基本機能
- 7.1 8086のレジスタ
- 7.2 80386のレジスタ
- 7.3 64ビットCPUのレジスタ
- 7.4 外部インターフェイス――CPUと周辺機器の接続
第8章 CPU命令の使い方
- 8.1 CPU命令によるプログラムの作成手順
- 8.2 CPU命令とその使用例
- 8.3 リアルモードとプロテクトモードの違い
第9章 アセンブラ(NASM)の使い方
- 9.1 アセンブルの手順
- 9.2 擬似命令とその使用例
- 9.3 プリプロセッサとその使用例
第10章 周辺機器の制御方法
- 10.1 メモリマップ――メモリの配置を確認する
- 10.2 I/Oマップ――接続されている周辺機器を確認する
- 10.3 ビデオ出力――VGAハードウェアを制御する方法
- 10.4 キーボードコントローラ(8042)の機能と使い方
- 10.5 割り込みコントローラ(8259)の機能と使い方
- 10.6 RTC(リアルタイムクロック)の機能と使い方
- 10.7 タイマー(8254)の機能と使い方
- 10.8 APICタイマーの機能と使い方
- 10.9 数値演算コプロセッサの機能と使い方
- 10.10 SSE2の機能と使い方
- 10.11 大容量記憶装置――複数のファイルシステムを管理する
第11章 BIOSの役割
- 11.1 BIOSが提供するサービス
- 11.2 ビデオサービスとその使用例
- 11.3 ディスクサービスとその使用例
- 11.4 システムサービスとその使用例
- 11.5 キーボードサービスとその使用例
- 11.6 その他のサービス
- 11.7 UEFI――BIOSの新しいインターフェイス
- 11.8 ACPIによる電源管理と制御例
第3部 BIOS環境で起動する32ビットOSを実装する
第12章 開発環境を構築する
- 12.1 作業ディレクトリを作成する
- 12.2 アセンブラの使用環境を整える
- 12.3 ソースファイルを作成する
- 12.4 アセンブルを行う
- 12.5 短いコマンドに置き換える
- 12.6 マウス操作で開発環境を開く
- 12.7 動作確認を行う
第13章 アセンブラによる制御構文と関数の記述例
- 13.1 if文を記述する
- 13.2 switch〜case文を記述する
- 13.3 do〜while文を記述する
- 13.4 for文を記述する
- 13.5 関数を作成する
第14章 リアルモードでの基本動作を実装する
- 14.1 「何もしない」ブートプログラムを作成する
- 14.2 BIOSパラメータブロックの領域を確保する
- 14.3 ブートプログラム内にデータを保存する
- 14.4 文字を表示する
- 14.5 文字列を表示する
- 14.6 数値を表示する
- 14.7 コンピュータを再起動する
- 14.8 セクタを読み出す
- 14.9 セクタ読み出し関数を作成する
- 14.10 ドライブパラメータを取得する
- 14.11 BIOSのフォントデータを取得する
- 14.12 メモリの実装状況を確認する
- 14.13 KBC(キーボードコントローラ)を制御する
- 14.14 A20ゲートを有効化する
- 14.15 キーボードLEDを制御する
- 14.16 カーネルをロードする
- 14.17 ビデオモードを変更する
第15章 プロテクトモードへの移行を実現する
- 15.1 セグメントディスクリプタを作成する
- 15.2 割り込みディスクリプタテーブルを作成する
- 15.3 プロテクトモードへ移行する
- 15.4 カーネルを起動する
第16章 プロテクトモードでの画面出力を実現する
- 16.1 文字の表示位置からVRAMアドレスを計算する
- 16.2 プレーンを選択する
- 16.3 表示色とプレーンを制御する
- 16.4 文字を描画する
- 16.5 フォントを一覧表示する
- 16.6 文字列を描画する
- 16.7 カラーバーを表示する
- 16.8 点を描画する
- 16.9 線を描画する
- 16.10 矩形を描画する
第17章 現在時刻を表示する
- 17.1 現在時刻を取得する(RTCの読み込み)
- 17.2 数値を文字に変換する
- 17.3 現在時刻を表示する
- 17.4 RTCへのアクセスタイミングを制御する
第18章 プロテクトモードでの割り込みを実現する
- 18.1 デフォルトの割り込み処理を作成する
- 18.2 割り込みゲートディスクリプタを作成する
- 18.3 ゼロ除算割り込みを実装する
- 18.4 割り込みと例外の違いを確認する
- 18.5 割り込みコントローラを再設定する
- 18.6 RTC割り込みを実装する
- 18.7 デフォルトの割り込み処理を修正する
- 18.8 キーボード割り込みを実装する
- 18.9 タイマー割り込みを実装する
第19章 マルチタスクを実現する
- 19.1 タスクの生成とTSSの関係を確認する
- 19.2 タスクごとのメモリ空間を定義する
- 19.3 協調型マルチタスクの動作を確認する
- 19.4 プリエンプティブなマルチタスクを実現する
第20章 特権状態を管理する
- 20.1 タスクの特権レベルを制限する
- 20.2 コールゲートを実装する
- 20.3 トラップゲートを実装する
- 20.4 システムコールを実装する
- 20.5 同期処理を実現する
第21章 小数演算を行う
- 21.1 FPUの動作を確認する
- 21.2 複数のタスクで小数演算を行う
- 21.3 バラ曲線を描画する
第22章 ページング機能を利用する
- 22.1 ページ変換テーブルを作成する
- 22.2 ページフォルト例外の動作を確認する
第23章 コードを共有する
- 23.1 TSSを作成する
- 23.2 TSSをGDTに登録する
- 23.3 タスクごとのパラメータを設定する
- 23.4 タスクごとのページ変換テーブルを作成する
- 23.5 タイマー処理を修正する
第24章 ファイルシステムを利用する
- 24.1 BPBを作成する
- 24.2 ディレクトリエントリを確認する
- 24.3 メディアをフォーマットする
第25章 PCの電源を切る
- 25.1 電断契機を検出する
- 25.2 電断処理を実装する
第4部 UEFI環境で起動する64ビットOSを実装する
第26章 開発環境を整える
- 26.1 UEFIの実行環境を整える
- 26.2 MAKEツールを導入する
- 26.3 CRC32計算プログラムを作成する
第27章 起動ディスクイメージを作成する
- 27.1 GPTディスクイメージを作成する
- 27.2 ファイルシステムを作成する
- 27.3 何もしないブートプログラムを作成する
- 27.4 起動ディスクイメージを作成する
第28章 文字列を出力する
- 28.1 メイン関数を作成する
- 28.2 文字列出力関数を作成する
- 28.3 数値を出力する
- 28.4 プログラムを終了する
第29章 CPU情報を出力する
- 29.1 レジスタ情報を出力する
- 29.2 GDT/IDT情報を出力する
- 29.3 メモリ領域を確保する
- 29.4 メモリマップを出力する
第30章 グラフィックス出力を実装する
- 30.1 プロトコルを利用する
- 30.2 フォント情報を取得する
- 30.3 画面モードを確認する
- 30.4 ピクセルを描画する
- 30.5 文字を描画する
- 30.6 時刻を描画する
- 30.7 タイマー処理を実装する
- 30.8 画面の解像度を選択する
- 30.9 ブートサービスを終了する
- 30.10 セグメントディスクリプタを再設定する
- 30.11 タイマー割り込み処理を実装する
- 30.12 時刻を描画する
- 30.13 キーボード割り込み処理を実装する
第31章 マルチタスクを実装する
- 31.1 タスクを初期化する
- 31.2 タスクパラメータを設定する
- 31.3 ページングを設定する
- 31.4 特権レベルを変更する
- 31.5 システムコールを実装する
第32章 小数演算を行う
- 32.1 SSE2の動作を確認する
- 32.2 バラ曲線を描画する
- 32.3 ウェイト処理を作成する
付録
仮想環境を構築する方法
- A.1 QEMUの利用方法
- A.2 Bochsの利用方法
実機での確認方法
- B.1 Rufusの利用方法
- 参考文献
- 索引
プロフィール
林高勲
1967年生まれ。北海道出身。都内の大学を卒業後、秋葉原にあるシステムハウスに就職する。当時のエンジニアの常として、回路の設計をしながらテストプログラムの作成とデバッグに明け暮れる。Windows PCの普及とともに広がるネットワーク関連の業務を通して、サーバの構築からデータベース、ウェブアプリの作成までを一通りこなすようになる。主に、組み込み機器の制御など、ハードウェアに近い位置での作業を好むエンジニア。
川合秀実
一般社団法人未踏理事。SecHack365トレーナー。1975年生まれ。小学4年生のときにファミコンの代わりに8ビットのパソコンを与えられ、しかしソフトが買えなかったのでプログラムを作って遊ぶ。そのままプログラミングの専門教育をほとんど受けずに来てしまったので、普通のプログラマにできることができないが、普通のプログラマにはできないことができる。要するに変人プログラマ。若い人にプログラミングを教える機会が多く、教育にもかなり関心を持っている。単著に『30日でできる! OS自作入門』(マイナビ出版)。