#freeze セグメント Linuxはセグメントを積極的には使っていない。 ●セグメント(プロテクトモード) グローバルディスクリプタテーブル(GDT)という「引き出し」をつくり、 その先頭物理アドレスをグローバルディスクリプタテーブルレジスタ(GDTR)にロードする。 「引き出し」には"00h","08h","10h","18h","20h"・・・というインデックスがつけられており それを「セレクタ値」と呼ぶ。 「引き出し」の中には「セグメントベース(セグメントの先頭のリニアアドレス)」、「リミット値」、 「属性」の情報が収められている。 CS,DS,ES,FS,GS,SSといったセグメントレジスタ(セグメントセレクタ)にセレクタ値を ロードすることによってセグメントを使うことが出来る。 CSレジスタはJMP命令やCALL命令、割り込みなどによって別のコードセグメントに移行するときに 変更される。 メモリアクセスの命令ではオフセットアドレスだけを指定する。 GDTに収められる情報にはいくつか種類がある。 1.セグメントディスクリプタ(セグメントを指す情報) 2.ゲートディスクリプタ(動作レベルの異なるコードを実行するための情報) ・・・「セグメントベース」にセレクタ値、「リミット値」にオフセットが設定されており そのセレクタ値、オフセットが示すコードを実行する。 3.TSS(Task Status Segment)ディスクリプタ ・・・「セグメントベース」にTSSの先頭アドレスが設定されている。 ○ゲートディスクリプタ(コールゲート) セレクタ値:オフセットの形式でcall命令で呼び出すが実際にはセレクタ値のみが使用され、 オフセットは使用されない。 ○TSSディスクリプタ タスク切り替えの際に使用する。 jmp命令、call命令でセレクタ値を指定する。 jmp先、call先がTSSであると検出するとタスクの切り替えを行う。 ●割り込み 割り込みディスクリプタテーブル(IDT)という「引き出し」をつくり、 その先頭物理アドレスを割り込みディスクリプタテーブルレジスタ(IDTR)にロードする。 「引き出し」には割り込み番号が付けられている。 「引き出し」の中には「オフセット」、「セレクタ値」、「種類」の情報が収められている。 種類は「トラップゲート」、「割り込みゲート」、「タスクゲート」 「割り込みゲート」は割り込みフラグを割り込み禁止にし、 「トラップゲート」は割り込みフラグを変更しない。 CLI(Clear Interrupt Flag)・・・割り込み禁止状態にする STI(Set Interrupt Enable Flag)・・・割り込み許可状態にする