アセンブリ言語でLDTを定義しています。
この参考書ではLDTを2つ作成し
それぞれに入っているコード・データセグメントディスクリプタ
はメモリ空間の0x00・・・~0xFF・・・(つまり、すべて)を指すように設定されています。
CS_TASK_0 equ(.cs_task_0 - LDT) | 4 DS_TASK_0 equ(.ds_task_0 - LDT) | 4
上記のコードでセグメントセレクタを求めることができるようですが
(認識が間違っているかもしれないので一応・・・)
・セレクタを使ってセグメントディスクリプタを指定できる。 ・セレクタとはそのテーブルのインデックスである。 ・LDTは1つのタスクに1つずつ存在する。 タスクごとのLDTは全くの別のテーブルとして扱われる。 ・GDTとLDTは全くの別物(用途)でそれぞれ別のテーブルである。
と、言ったことを踏まえると
TASK_0のコードディスクリプタにアクセスしたいなら
そのタスクのLDTの範囲を指定したうえで
セレクタ(インデックス)が・・・
上から2番目なので(0からカウントするから・・・)
1
となると思ったのですが
CS_TASK_0 equ(.cs_task_0 - LDT) | 4 DS_TASK_0 equ(.ds_task_0 - LDT) | 4
なぜこのような処理で求める必要があるのでしょうか?
私のLDTの概念に対する理解がどこかで間違えているのだと思うのですが・・・
分からないのでお願いします。
GDT先頭アドレスをベースにするのが規格として決まっていて
それらを利用してLDTなどのインデックスが求められるなら
順番はベース以外重要じゃないってことなのか?
あなたの回答
tips
プレビュー