書籍概要

作って理解するOS
x86系コンピュータを動かす理論と実装

著者
発売日
更新日

概要

現在広く普及している,x86系CPU搭載のコンピュータ。
本書はOSの機能を実装しながら,その姿を明らかにしていきます。
第1部ではまず,ハードウェア,ソフトウェアの基本概念や,CPUとOSの関係など,コンピュータの核となる理論を丁寧に解説します。
第2部では,x86系コンピュータに対象を絞り,レジスタの構成や,機械語命令の使い方などを詳細に検討します。
第3部は,いよいよOSの実装パートです。第1部,第2部で得た知識を生かして,マルチタスクなどのOSの機能を楽しみながら実装することができるでしょう。
なおイントロダクションでは,初学者向けの基礎知識を解説。
「2進数って何?」という方でも,x86系コンピュータとOSへの理解を深めることを可能にする一冊です。

こんな方におすすめ

  • x86系CPUを搭載したコンピュータのしくみを知りたい方
  • OSを自分で実装してみたい方

サンプル

samplesamplesample

目次

イントロダクション
コンピュータが数を数えるしくみと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の利用方法

サポート

ダウンロード

(2019年9月18日更新)

本書に掲載しているコードのサンプルファイルをダウンロードいただけます。ZIP形式で圧縮されていますので,展開してからお使いください。展開が終わると「prog」フォルダーが表示されます。

サンプルファイルの利用については,本書P.016「本書に掲載しているコードについて」をあわせてお読みください。

なお,一般的な環境においては特に問題のないことを確認しておりますが,万一障害が発生し,その結果いかなる損害が生じたとしても,小社および著者はなんら責任を負うものではありません。また生じた損害に対する一切の保証をいたしかねます。必ずご自身の判断と責任においてご利用ください。

また,本データは著作権法上の保護を受けています。収録されているファイルの一部あるいは全部について,いかなる方法においても無断で複写,複製,再配布することは禁じられています。

以上のことをご確認,ご了承の上,データをご利用願います。

ダウンロード
prog.zip

正誤表

本書の掲載内容に誤りがございました。ご迷惑をおかけしましたことをお詫び申し上げます。

(2019年10月18日最終更新)

第2刷訂正情報(第3刷で修正予定)

P.439 2つ目のコード(define.s)の後,「メモリ情報を取得する~」の前に,以下のget_mem_info.sについての記述を追加

 この定義を使ってメモリを確保する例を次に示します。

P439

P.449 3つ目のコード内

「loopnz .10L  ; } while (--CX && !ZF);」

loopz .10L   ; } while (--CX && ZF);」

(以下2019年10月9日更新)

第1刷訂正情報(第2刷では修正済み)
P.021 2段落目

1の位値が1つ「あり」となって、
1の位値が1つ「あり」となって、

P.118 1行目

メモリアクセス時ににロック信号を出力
メモリアクセス時ロック信号を出力

P.129 4段落目

このため、リフレッシュが不要となる反面、回路が複雑になるので、アクセス速度や容量などでは、DRAMよりも劣ることになります。
このため、リフレッシュが不要となる反面、回路が複雑になるので、ビット当たりの面積などでは、DRAMよりも劣ることになります。

P.141 1行目

アドレス変換は、すべてのメモリアクセス時にに行われるので、
アドレス変換は、すべてのメモリアクセス時行われるので、

P.423 1つ目(macro.s)のコード

誤

正

画像をクリックすると大きく表示できます。

P.476 2行目

0×000A_0000番地から
0x000A_0000番地から

P.597 「作業内容」の3つ目

小バラ曲線を描画する
バラ曲線を描画する

商品一覧