セグメント
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)・・・割り込み許可状態にする