「はじめて読む486」を読んだ
- 作者: 蒲地輝尚
- 出版社/メーカー: アスキー
- 発売日: 1994/09
- メディア: 単行本
- 購入: 20人 クリック: 165回
- この商品を含むブログ (84件) を見る
世間では機械学習・ディープランニングが盛り上がっている中、低レイヤの勉強がマイブームになっている。
この本はIntel486のアーキテクチャについて解説した本で、1994年に書かれた20年以上も前の本ではあるが、名著だと評判なので読んでみた。
(会社の図書スペースにたまたま置いてあったというのもある)
年齢のせいか、1回読んだ本の内容を忘れることが多くなってきたと感じるので、1回読んだ後に再度読み直して、要点をまとめてみた
1. プロローグ
32bitサポート
486では32bitサポートされ、16bit CPUの8086よりも大きなデータサイズを扱えるようになった。
- 16bitCPUの64KBの壁
- 16bitの限界 = 2^16 bit = 64KB
- 連続して扱える領域は64KBまでに制限される→配列の最大サイズに影響を与える
- 16bitCPUの640KBの壁
- 8086ではアドレスを20bitで表すため、利用できるメモリサイズの限界は1MB
- 360KBをシステムで利用するので、アプリケーションが使えるのは1MB - 360Kb = 640KB
- 32bit CBUではより大きなデータサイズ、メモリを扱うことができるようになる(物理的な制限は4GB)
2. 486の履歴書
- 8086から486までのCPUの発展
- プロテクトモードは286から導入された
- 32bitサポートは386から
- 486DX
- 386のアーキテクチャをそのまま引き継ぎ、性能を大幅に向上させた
- キャッシュメモリ
- 486の性能向上に最も寄与している
- CPUの近くに高速なメモリを置いて、一部のデータをキャッシュすることで高速なメモリアクセスを実現した
- 高速な分、高価なのでデータサイズは小さい(486では8KB)
- 書き出しのときにキャッシュだけでなく、本来のメモリにも書き込むライトスルー方式を採用している
- これに対して、キャッシュに書き込むのとは別のタイミングで本来のメモリに書き込むライトバック方式という方法がある
- ライトバック方式は書き込みの速度を上げることができるが、データの一貫性を保つのが難しい
- 486SX
- 486DXの廉価版
- 実態は486DXと全く一緒で浮動小数点演算機能を無効にしたもの
- 無効にした分、検査が不要になり、製造コストを下げることができた
- 486DX2 / ODP
- 「クロックダブラー」を用いて高速化を実現
- CPU内部においてクロック速度を2倍にする
- 低速な外部システムに引きずられることがなくなる
3.オペレーティング・システム
- プロセス管理
- Windows 3.1はイベント駆動
- アプリケーション側でイベント待ちのときに他のタスクに切り替える
- お行儀の悪いアプリケーションが暴走すると、システム全体が引きずられて停止状態になることがある
- Windows NTやOS/2はプリエンプティブマルチタスク
- 一定時間ごとのハードウェア割り込みを利用して、割り込み時にタスクの実行権を取り上げ、他のタスクに切り替える
- 他のタスクに影響されなくなる
- Windows 3.1はイベント駆動
- メモリ管理
4.プロテクトモード
5.セグメント
6.保護
- セグメントリミット
- すべての命令に先立ち、メモリのオフセットアドレスがリミット値を超えないかチェックする
- リミット値はセグメントディスクリプタにセットされている
- セグメント属性
- 特権レベル
7.割り込み
8.タスク
9.ページング
- ページング方式
- メモリを固定長に分割して扱う方式
- セグメント方式はメモリを任意の大きさで区分けする
- 論理空間におけるページ(論理ページ)を物理メモリのページ(物理ページ)に対応付けてアドレス変換を行う
- 論理ページと物理ページの対応はタスクごとに独立している
- メモリを固定長に分割して扱う方式
- 仮想記憶
- 物理メモリに紐付けられていない論理ページアクセスした際にページフォルトを発生させ、使用されてない論理ページに対応する物理ページをディスクに退避し(ページアウト)、空いた物理ページにディスクから読み込む(ページイン)
- 実際の物理メモリよりも大きなメモリ空間を扱うことができる
- 486ではセグメント方式とページング方式を組み合わせてメモリ管理をしている
- ページング機構
- PTE
- ページングに使用されるメモリ上のデータ構造
- ページ番号
- PTEの上位20bitに記述され、下位12bitを0で埋めるとページの先頭アドレスになる
- Pビット
- PTEに対応するページがメモリに存在するか
- Aビット
- 読み書きすると1がセットされる。OSがページアウトの対象を選定するときに用いる。
- Dビット
- 書き込み時に1をセットする。ページアウトの際にディスクに書き込むかを判定するのに用いる
- TLB
- PTE専用のキャッシュメモリ。486では32個のPTEを格納できる。
10.セキュリティ
- 要求者特権レベル
- 本来そのセグメントにアクセスしようとしたプログラムの特権レベル
- 特権レベルの乗っ取りを防ぐ
- 本来そのセグメントにアクセスしようとしたプログラムの特権レベル
- コンフォーミングセグメント
- 特権レベルを移行することなく、特権0のプログラムをアプリケーションから呼び出せるしくみ
- コードセグメントの一種
- 特権レベル移行時のオーバーヘッドを気にする必要がなくなる
- コンフォーミングセグメント呼び出し時は動作レベルが変化しない = CPUの動作レベルとセグメントの特権レベルが異なる
- LDT(ローカルディスクリプタテーブル)
- I/O許可マップ
- タスクごとにIOポートのアクセス制限をする
- TSS内にI/O許可マップを保持する
このあと「11.仮想8086モード」、「12.DOMエクステンダーとDPMI」、「13.486応用プログラミング」と続くが、疲れてきたので割愛。
CPUの挙動の理解が深まる良い本だった。
この本を読み終わった後に、以下の記事などでIntel CPUの歴史を追ってみたりもした。
@IT:PCエンサイクロペディア:第7回 PCのエンジン「プロセッサ」の歴史(1)〜i8088からIntel386までの道のり 1. IBM PCシリーズに採用された86系16bitプロセッサたち
@IT:頭脳放談:第27回 RISCの敗因、CISCの勝因