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

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

紙版発売
電子版発売

B5変形判/736ページ

定価4,048円(本体3,680円+税10%)

ISBN 978-4-297-10847-2

電子版

→学校・法人一括購入ご検討の皆様へ

書籍の概要

この本の概要

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

こんな方におすすめ

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

この書籍に関連する記事があります!

手を動かしながらOSのしくみを理解しよう
OS(オペレーティングシステム)は,プログラマの方はもちろんのこと,コンピュータを用いるすべての人々の仕事に,もはや欠かすことのできないソフトウェアです。

本書のサンプル

本書の紙面イメージは次のとおりです。画像をクリックすることで拡大して確認することができます。

サンプル画像1

サンプル画像2

サンプル画像3

目次

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

著者プロフィール

林高勲(はやしたかのり)

著者。
1967年生まれ。北海道出身。都内の大学を卒業後,秋葉原にあるシステムハウスに就職する。当時のエンジニアの常として,回路の設計をしながらテストプログラムの作成とデバッグに明け暮れる。Windows PCの普及とともに広がるネットワーク関連の業務を通して,サーバの構築からデータベース,ウェブアプリの作成までを一通りこなすようになる。主に,組み込み機器の制御など,ハードウェアに近い位置での作業を好むエンジニア。


川合秀実(かわいひでみ)

監修者。
一般社団法人未踏理事。SecHack365トレーナー。1975年生まれ。小学4年生のときにファミコンの代わりに8ビットのパソコンを与えられ,しかしソフトが買えなかったのでプログラムを作って遊ぶ。そのままプログラミングの専門教育をほとんど受けずに来てしまったので,普通のプログラマにできることができないが,普通のプログラマにはできないことができる。要するに変人プログラマ。若い人にプログラミングを教える機会が多く,教育にもかなり関心を持っている。単著に「30日でできる! OS自作入門」(マイナビ出版)。