KDOC 194: 『32ビットコンピュータをやさしく語る はじめて読む486』
DONE この文書のステータス
- 作成
- 2024-07-19 貴島
- レビュー
- 2024-07-21 貴島
概要
32ビットコンピュータをやさしく語る はじめて読む486は、CPUの仕組みをやさしく解説した本。
メモ
- プログラム中の繰り返し処理を行っている部分では、最初の1回目の実行でプログラムがキャッシュメモリに保持されるので、残りの繰り返しは高速に実行される
- 容量が大きければ大きいほどヒット率は高くなるが、容量を倍にしたからといってヒット率が倍になるわけではない
- 入出力のタイミングだけでなく、一定時間で強制的にタスクを切り替える方式を「プリエンプティブなマルチタスク」という。一定時間ごとにハードウェア割り込みを発生させる回路を利用して、割り込みのタイミングでタスクの実行権をとりあげて(プリエンプション)、次のタスクに切り替える
- MS-DOSはメモリ割当機能を持っている。しかし、メモリ保護や仮想記憶の機能は持っていない。それらはMMUというハードウェアを利用する
- メモリ保護機能を理解するには、まずアドレス変換機能を知らなければならない
- 見かけの番号と実際の番号を変換することをアドレス変換という
- オペレーティングシステムがタスクを切り替えるときには、タスクの状態の保存・復元と同時に、MMUに設定するアドレス変換表も保存・復元する
- 仮想記憶では、対応した物理メモリが割り当てられるかのフラグを保持している
- UNIXなどのプロテクトモード専用OSでは、いったんプロテクトモードに移行すると2度とリアルモードに戻ることはない
- 8ビットCPUのメモリモデルを保ちながら、さらに多くのメモリを扱えるようにすることを狙って、セグメント機構が導入された
- セグメントオーバーライドプリフィックスは一種のマシン語命令で、次に実行されるメモリアクセスを行う命令で使われるセグメントレジスタの種類を変更する働きをもつ
- ディスクリプタテーブルは、「ディスクリプタ」と呼ばれる一種の設計図を格納する棚のようなもの
- グローバルディスクリプタテーブル(GDT)とはシステム中に1つだけ存在するディスクリプタテーブルで、オペレーティング・、システムや複数のタスクとして実行されるアプリケーションソフトウェアなど、すべてのプログラムから共通に参照されるセグメントを定義するためのディスクリプタテーブルである
- CPUにアドレス変換を行わせるためには、あらかじめディスクリプタテーブルのアドレスを設定しておかなければならない。これは、オペレーティングシステムが起動時に行う。CPUにディスクリプタテーブルのアドレスを設定するには、CPUのGDTR(グローバルディスクリプタテーブルレジスタ)を使う。このレジスタにディスクリプタテーブルのリニアアドレスをロードしておくことによって、CPUがディスクリプタテーブルを参照できるようになる
- 16ビットセグメントでも32ビット命令を実行できるが、32ビット命令にはすべてサイズプリフィックスをつけなければならない。このため、命令のバイト数も多くなり、命令の読み込みや実行速度も遅くなる
- プログラム実行中の動作レベルのことをCPLと呼ぶ。CPLは、プログラムの置かれているセグメントの特権レベル(DPL)で決まる
- アプリケーションソフトウェアは、オペレーティングシステムによって自分に与えられたセグメントだけをアクセスできる。ほかのセグメントをアクセスはできない
- I/Oポートの特権レベルのことをIOPLと呼ぶ
- オペレーティングシステムは、アプリケーションからの呼び出し口として、起動時にコールゲートを作成しておかなければならない
- オペレーティングシステムは、呼び出し口のセレクタ値とオフセットアドレスを組み合わせてゲートディスクリプタを作成し、ディスクリプタテーブルにセットする
- 割り込みコントローラは複数の割り込み要因から送られてくる割り込み要求信号を調停して優先度の高いものを1つ選んで486に伝える役割を持つ。また、486に割り込み要因を伝える役割がある。486が割り込みを受け付けると割り込みコントローラは割り込み要因に対応する「割り込み番号」をデータパスを通じて486に送る
- 486内部のフラグレジスタの第9ビットは割り込み許可フラグと呼ばれ、ハードウェア割り込みの受け付けをコントロールする役割がある
- CLI(Clear Interrupt Flag)命令は、割り込み許可フラグを0にリセットする。割り込み許可フラグがリセットされた状態では「割り込み禁止状態」となり、ハードウェア割り込みを受け付けなくなる
- トラップは「ソフトウェア割り込み」と呼ばれ、マシン語命令の「INT命令」および「INTO命令」が割り込み要因となって発生する
- 「INT 21H」という命令を実行すると、割り込み番号21H番のソフトウェア割り込みを実行することになる
- フォールトは、マシン語命令を実行しているときに検出された例外状態が割り込み要因となって発生する割り込みのこと。トラップはINT命令を実行するとかならず発生するが、フォールトは決まった命令で発生するわけではない
- アボートは、フォールトはマシン語命令を実行しているときに検出された例外状態が割り込み要因となって発生する割り込みのこと。フォールトよりも致命的なエラーが起こったときに発生する
- 割り込みは、ハードウェア割り込み、トラップ、フォールト、アボートなどの種類がある。いずれの割り込みでも、割り込み番号によって対応する割り込み処理ルーチンを選択している
- CPU内部のレジスタIDTRに値を設定すると、その値が割り込みディスクリプタテーブルの先頭のリニアアドレスとなる。IDTRに値を設定するにはアセンブラでLIDT命令を使う
- 486はタスク状態の保存・復元に使用するデータ領域の構造をTSS(Task State Segment)という形式に規程している
- 「jmp 0048:0000」 タスク切り替え。切り替え先TSSをディスクリプタから取り出す
- 「jmp 0008:0300」 コードセグメントへのジャンプ。セグメント0008のオフセットアドレス0300へジャンプ
- 現在のTSSを常に保持しているのがCPU内のレジスタであるTR(Task Register)
- タスクゲートとはゲートの1種で、アプリケーションソフトウェアによるタスク切り替えを原則禁止にしながらも、一部を条件付きで許可するための仕組み
- タスクゲートはディスクリプタテーブル中にセグメントディスクリプタなどと混在して作成したり、割り込みディスクリプタの方に作成できる。486は割り込みが発生したときに割り込みディスクリプタテーブルから取り出したディスクリプタがトラップゲートや割り込みゲートであればゲートの指すアドレスに制御を移すが、TSSディスクリプタであればタスク切り替えを実行する
- 割り込みやフォールトの発生によって割り込みゲートやトラップゲートが呼び出される場合には、それだけではタスクは切り替わらない。タスクは切り替わらずに同じタスクのなかで割り込み処理ルーチンのプログラムが実行される
- 割り込みルーチンのコードセグメントには、一般に高い特権レベルを持たせる。オペレーティングシステムの特権レベルは最高レベルの0である。アプリケーションソフトウェアを実行中に割り込みが発生したときやオペレーティングシステムを呼び出したときには一時的に特権レベルが高くなることになる
- タスクごとにメモリ空間を分離したり仮想記憶を実現したりといったメモリ管理を行うために、メモリを区画分けして区画を単位として属性を設定する。1バイトごとに属性を設定して管理するのは現実的ではない。
- メモリを任意の大きさに区分けする方法がセグメント方式である
- メモリを「ページ」と呼ばれる固定長の単位に区分けする方法がページング方式である
- ページディレクトリテーブルやページテーブルのなかに置かれているPTEは、ページング機構による一連のアドレス変換の手順のなかで、ページ番号つまりページ先頭のアドレスを取り出すための役割を持っている
- ページディレクトリテーブルもページテーブルも、メモリ上のページである。つまりページング機構の働きにより、本来のメモリアクセスに加えてさらにメモリ上の2つのページがアクセスされることを意味する。メモリアクセスのたびにメモリ上のページテーブルを読み込んでいたのでは実行速度が非常に遅くなってしまう。そこで486にはTLB(Traslation Lookaside Buffer)と呼ばれるPTE専用のキャッシュメモリが搭載されている
- セグメントだけでなく、I/Oポートについても、アプリケーションソフトウェア、あるいはデバイスドライバソフトウェアなど、実行するプログラムごとに異なったアクセス権を設定しなければならない
- I/Oの仮想化の実現方法は、仮想記憶とよく似ている。オペレーティングシステムは、TSSのI/O許可マップの設定でI/Oポートへのアクセスを禁止状態にしておく。アプリケーションソフトウェアがI/Oポートをアクセスすると、486が保護機能を働かせてフォールトを発生させる。フォールトによって呼び出されたオペレーティングシステムが、排他制御やエミュレーションを行う
- WindowsはDOSエクステンダーの1つ。DOSエクステンダーとしての働きは、Windowsに内蔵されたDPMI機能によって実現されている
関連
なし。