作って理解するOS x86系コンピュータを動かす理論と実装
技術評論社
著者:林高勲
監修:川合秀実
発刊によせて
はじめに
本書に掲載しているコードについて
イントロダクション
コンピュータが数を数えるしくみと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 入出力ソフトウェアの階層構造
第2部 x86系PCのアーキテクチャを理解する
第6章 コンピュータの基本構成
6.1 CPU,メモリ,外部記憶装置の関係
6.2 電源投入時に行われる処理
6.3 入出力装置(ポート)の役割
6.4 割り込みコントローラの役割
第7章 CPUの基本機能
7.1 8086のレジスタ
7.2 80386のレジスタ
7.3 外部インターフェイス――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 数値演算コプロセッサの機能と使い方
10.9 大容量記憶装置――複数のファイルシステムを管理する
第11章 BIOSの役割
11.1 BIOSが提供するサービス
11.2 ビデオサービスとその使用例
11.3 ディスクサービスとその使用例
11.4 システムサービスとその使用例
11.5 キーボードサービスとその使用例
11.6 その他のサービス
11.7 ACPIによる電源管理と制御例
第3部 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章 モード移行を実現する
25.1 リアルモードへ移行する
25.2 プロテクトモードへ復帰する
25.3 リアルモードへの移行関数を呼び出す
第26章 ファイルの読み出しを実現する
26.1 起動時の割り込み設定を復元する
26.2 ファイルを検索する
第27章 PCの電源を切る
27.1 電断契機を検出する
27.2 電断処理を実装する
付録
仮想環境を構築する方法
A.1 QEMUの利用方法
A.2 Bochsの利用方法
実機での確認方法
B.1 Rufusの利用方法
参考文献
索引