4

Bochsに割り込みハンドラをインストールしようとしていますが、何らかの理由で割り込みハンドラが起動しません。

まず、ブレークポイントを設定します。

00036440222i[CPU0 ] [36440222] Stopped on MAGIC BREAKPOINT
(0) [0x0000000000703044] 0008:00000000c0003044 (unk. ctxt): int3

それから私は実行しようとしint 3ます。

ただし、そうすると、エラーが表示int_trap_gate(): selector nullされます。これは、一部のテーブルのセレクターが null であることを示しているようです。

ただし、GDT を以下に示します。

<bochs:2> info gdt
Global Descriptor Table (base=0x0000000000007c08, limit=23):
GDT[0x00]=??? descriptor hi=0x00000000, lo=0x00000000
GDT[0x01]=Code segment, base=0x00000000, limit=0xffffffff, Execute/Read, Accessed, 32-bit
GDT[0x02]=Data segment, base=0x00000000, limit=0xffffffff, Read/Write, Accessed

IDTも同様です:

<bochs:3> info idt
Interrupt Descriptor Table (base=0x00000000c0101020, limit=2047):
IDT[0x00]=32-Bit Interrupt Gate target=0x0001:0xc0004148, DPL=0
IDT[0x01]=32-Bit Interrupt Gate target=0x0001:0xc0004154, DPL=0
IDT[0x02]=32-Bit Interrupt Gate target=0x0001:0xc0004160, DPL=0
IDT[0x03]=32-Bit Interrupt Gate target=0x0001:0xc000416c, DPL=0
IDT[0x04]=32-Bit Interrupt Gate target=0x0001:0xc0004178, DPL=0
IDT[0x05]=32-Bit Interrupt Gate target=0x0001:0xc0004184, DPL=0
IDT[0x06]=32-Bit Interrupt Gate target=0x0001:0xc0004190, DPL=0
IDT[0x07]=32-Bit Interrupt Gate target=0x0001:0xc000419c, DPL=0
IDT[0x08]=32-Bit Interrupt Gate target=0x0001:0xc00041a8, DPL=0
IDT[0x09]=32-Bit Interrupt Gate target=0x0001:0xc00041b0, DPL=0
IDT[0x0a]=32-Bit Interrupt Gate target=0x0001:0xc00041bc, DPL=0
IDT[0x0b]=32-Bit Interrupt Gate target=0x0001:0xc00041c4, DPL=0
IDT[0x0c]=32-Bit Interrupt Gate target=0x0001:0xc00041cc, DPL=0
IDT[0x0d]=32-Bit Interrupt Gate target=0x0001:0xc00041d4, DPL=0
IDT[0x0e]=32-Bit Interrupt Gate target=0x0001:0xc00041dc, DPL=0
IDT[0x0f]=32-Bit Interrupt Gate target=0x0001:0xc00041e4, DPL=0
IDT[0x10]=32-Bit Interrupt Gate target=0x0001:0xc00041f0, DPL=0
IDT[0x11]=32-Bit Interrupt Gate target=0x0001:0xc00041fc, DPL=0
IDT[0x12]=32-Bit Interrupt Gate target=0x0001:0xc0004208, DPL=0
IDT[0x13]=32-Bit Interrupt Gate target=0x0001:0xc0004214, DPL=0
IDT[0x14]=32-Bit Interrupt Gate target=0x0001:0xc0004220, DPL=0
IDT[0x15]=32-Bit Interrupt Gate target=0x0001:0xc000422c, DPL=0
IDT[0x16]=32-Bit Interrupt Gate target=0x0001:0xc0004238, DPL=0
IDT[0x17]=32-Bit Interrupt Gate target=0x0001:0xc0004244, DPL=0
IDT[0x18]=32-Bit Interrupt Gate target=0x0001:0xc0004250, DPL=0
IDT[0x19]=32-Bit Interrupt Gate target=0x0001:0xc000425c, DPL=0
IDT[0x1a]=32-Bit Interrupt Gate target=0x0001:0xc0004268, DPL=0
IDT[0x1b]=32-Bit Interrupt Gate target=0x0001:0xc0004274, DPL=0
IDT[0x1c]=32-Bit Interrupt Gate target=0x0001:0xc0004280, DPL=0
IDT[0x1d]=32-Bit Interrupt Gate target=0x0001:0xc000428c, DPL=0
IDT[0x1e]=32-Bit Interrupt Gate target=0x0001:0xc0004298, DPL=0
IDT[0x1f]=??? descriptor hi=0x00000000, lo=0x00000000
<...>
IDT[0xff]=??? descriptor hi=0x00000000, lo=0x00000000

IDT エントリには有効な GDT セレクターがあるように思われるため、割り込みを実行したときに何が問題を引き起こすのかわかりません。

<bochs:5> s                   ; step
(0).[36440222] [0x0000000000703044] 0008:00000000c0003044 (unk. ctxt): int3
CPU 0: Interrupt 0x03 occured (error_code=0x0000)
00036440222e[CPU0 ] int_trap_gate(): selector null
CPU 0: Exception 0x0d - (#GP) general protection fault occured (error_code=0x0000)
CPU 0: Interrupt 0x0d occured (error_code=0x0000)
00036440222e[CPU0 ] int_trap_gate(): selector null
CPU 0: Exception 0x0d - (#GP) general protection fault occured (error_code=0x0000)
CPU 0: Exception 0x08 - (#DF) double fault occured (error_code=0x0000)
CPU 0: Interrupt 0x08 occured (error_code=0x0000)
00036440222e[CPU0 ] int_trap_gate(): selector null
CPU 0: Exception 0x0d - (#GP) general protection fault occured (error_code=0x0000)

何が問題ですか?

4

1 に答える 1

3

ここ:

IDT[0x03]=32-Bit Interrupt Gate target=0x0001:0xc000416c, DPL=0

0x0001 はセレクタ値です。その 2 つの最下位ビットはRPLビットです。残りのビットは、セグメント記述子テーブル (GDT または LDT) へのインデックスとして使用されます。そして、これらのビットは 0 です。すべての意図と目的のために、これは NULL セレクターです。

ほとんどの場合、1 ではなく 8 が必要です。

セレクターの正確な使用方法については、CPU のドキュメントを参照してください。

于 2012-05-15T14:44:46.123 に答える