3

私は長い間これを理解しようとしてきましたが、どこにも行きません。

これが私がやろうとしていることです: IDTR に含まれる値が 0x3A000 の場合、プロテクト モードのどの物理アドレスに割り込みベクトル番号 3 がありますか?

割り込みベクトル #3 のオフセットの各バイトの物理アドレスと、割り込みベクトル #3 のセグメントの各バイトの物理アドレスを計算するのに役立つ式を見つけたいと思います。

私はインターネットを見回してきましたが、IDTRがこれをどのように計算するかについての明確な説明はなく、本当に興味があります.

また、リアルモードでこれと同じ物理アドレスがどのように見つかるかについても興味があります...

誰かがこの種の質問を解決するための一般的な公式を見つけるのを手伝ってくれたら、それは素晴らしいことです!

4

2 に答える 2

5

私は答えを見つけました。Jester とリンクへの Tnx。:D

これは、IDTR (Interrupt Descriptor Table Register) と IDT (Interrupt Descriptor Table) の関係を示すイメージです。(参考:インテルのマニュアル):

ここに画像の説明を入力

また、IDT のエントリがどのように見えるかを示す図も示します (参照: Intel のマニュアル)。

ここに画像の説明を入力

IDT(Interrupt Description Table)のベースアドレス(IDTの開始アドレス)は、ビット16~47、16~47で与えられます。ベクトル #3 のアドレスを取得するには、最初の 2 つのエントリのサイズをベース アドレスに追加する必要があります。オフセットとセグメント セレクターのビットが存在するアドレスを見つけるには、ベクターのアドレスを見つけて、2 番目の画像に従ってバイトを追加する必要があります。つまり、IDT のエントリ内を移動します。

「IDT のベース アドレスは、キャッシュ ライン フィルのパフォーマンスを最大化するために 8 バイト境界に配置する必要があります。制限値はバイト単位で表され、最後の有効なバイトのアドレスを取得するためにベース アドレスに追加されます。制限0 の値は正確に 1 有効なバイトになります. IDT エントリは常に 8 バイト長であるため, 制限は常に 8 の整数倍よりも 1 小さい必要があります (つまり、8N – 1). IDT は線形アドレスのどこにでも存在できます.図 6-1 に示すように、プロセッサは IDTR レジスタを使用して IDT の位置を特定します。このレジスタは、IDT の 32 ビット ベース アドレスと 16 ビット リミットの両方を保持します。- (参考:インテルのマニュアル)

したがって、パフォーマンスを向上させるには、マニュアルに記載されているようにテーブルを調整する必要があります。教育目的で、IDTR に 3A000h が含まれている場合に、オフセット バイトとセグメント バイトの物理アドレスを見つける方法を説明します。

手順:

まず、3A000h をバイナリ形式で書きます。これは、図を使用して数字を理解しやすくするためです。

したがって、3A000h は次のようになります: 0000 0000 0000 0000 0000 0000 0000 0011 1010 0000 0000 0000 注: IDTR は 48 ビット長であるため、48 桁の数字です。

ベースアドレスは、ビット 16 で始まりビット 47 で終わる数値です。

ここに画像の説明を入力

ベースアドレス = 0000 0000 0000 0000 0000 0000 0000 0011 で、それは 3h です。

したがって、最初のエントリは物理アドレス 3 にあります。

3 番目のエントリを取得するには、その前に 2 つのエントリのサイズを追加します。したがって、3 番目のエントリのアドレスは次のようになります。

3+2*8=19=13時間

1 つのエントリは 8 バイト長であるため、2 つのエントリは 8 で乗算されます。

オフセット バイトの物理アドレスを取得するには、図 6.2 を見て、エントリが次のようになっていることを確認する必要があります。

ここに画像の説明を入力

だから写真から読み取る

セグメント セレクタの物理アドレスは次のとおりです。

19+2 と 19+2+1

また

13h+2h および 13h+2h+1h

オフセット バイトの物理アドレスは (割り込みまたはトラップ ゲートであると仮定して): 19、19+1、19+6、19+7 です。

また

13h、13h+1、13h+6h、13h+7h


この種の問題を解決するための一般的な手順:

BaseAddress=IDTR/(2^16) -> 整数除算

制限=IDTR%(2^16)

VectorPhysicalAddress=BaseAddress+(VectorNumber-1)*8

セグメント セレクタ バイトの物理アドレスは、VectorPhysicalAddress+2 および VectorPhysicalAddress+3 です。

オフセット バイトの物理アドレスは、VectorPhysicalAddress、VectorPhysicalAddress+1、VectorPhysicalAddress+6​​、VectorPhysicalAddress+7 です。

于 2013-01-28T23:33:35.333 に答える
0

「インターネットを見回す」のではなく、なぜインテルのマニュアルを読まなかったのか、ちょっと不思議です。確かに、前述のマニュアルはインターネットでも入手できます

Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide, Part 1 のセクション 6.10 INTERRUPT DESCRIPTOR TABLE (IDT)を読むと、IDTR にリニア ベース アドレス (ビット 16 ~ 47) および制限 (ビット 0 ~ 15)。また、マニュアルには、制限は常に 8 の整数倍よりも 1 小さい必要があると記載されていることに注意してください。そのため、あなたの例は有効ではありません (特に賢明なベースアドレスでもありません)。物理アドレスを取得するには、通常のページング メカニズムを使用する必要があります (有効になっている場合)。各割り込みのハンドラは、テーブル内の 8 バイトの記述子によって定義されます。詳細については、マニュアルを参照してください。0x3a0003

リアル モードでは、割り込みベクトルは、物理アドレス 0 から始まる 4 バイトの far ポインターです。

于 2013-01-27T22:36:03.360 に答える