kernel/memo/architecture/segment

Last-modified: 2006-10-10 (火) 22:21:51

セグメント

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