保護モードの割り込みを設定するプロセスは何ですか?保護モードでの割り込みの設定(x86)
Thisリンクは1がすべきと言う:
- 割り込みディスクリプタ・テーブルのためのメイクスペース
- そのスペースがあるCPUに知らせる(GDTチュートリアルを参照:lgdtとして非常に同じように動作LIDT)を
- BIOSのデフォルトを使用しないようにPICに指示してください(PICチップのプログラミングを参照)
- IRQと例外の両方について、ISRハンドラを2つ書きます(割り込みサービスルーチンを参照)
- は(PICの)IRQマスクでサポートされているすべての割り込み
は、第三のステップは、私には意味がありませんを有効にする(私は見
コードを実行したところ、コンパイルは正常に完了し、仮想マシンで実行されましたが、割り込みは1回しか発生しませんでした。私はその後、PICにEOIを送信していないことを認識し、割り込みをさらに発生させないようにしました。ただし、iret
命令の直前にmov al, 0x20
とout 0x20, al
を追加すると、仮想マシンはクラッシュします。ここで
は私のIDTだ:
; idt
idt_start :
dw 0x00 ; The interrupt handler is located at absolute address 0x00
dw CODE_SEG ; CODE_SEG points to the GDT entry for code
db 0x0 ; The unused byte
db 0b11101001 ; 1110 Defines a 32 bit Interrupt gate, 0 is mandatory, privilege level = 0 (0b00), the last bit is one so that the CPU knows that the interrupt will be used
dw 0x00 ; The higher part of the offset (0x00) is 0x00
idt_end:
idt_descriptor :
dw idt_end - idt_start - 1 ; Size of our idt, always one less than the actual size
dd idt_start ; Start address of our idt
は、ここで(メモリ内の絶対位置は0x00にある)私の割り込みハンドラです:
ISR_0:
push eax
add [0x300], byte
mov al, 0x20
out 0x20, al
pop eax
iret
times 512-($-$$) db 0
これは私が保護モードに入り、GDTをロードするために使用するコードですIDTをメモリに格納します。
[bits 16]
switch_to_pm:
cli
lgdt [gdt_descriptor]
lidt [idt_descriptor]
mov eax, cr0
or eax, 1
mov cr0,eax
jmp CODE_SEG:init_pm
[bits 32]
init_pm :
mov ax, DATA_SEG
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ebp, 0x90000
mov esp, ebp
sti
call BEGIN_PM
私の主な機能(0x300の値をチェックする)は次のとおりです。
void main() {
char iii[15];
int * aa = (int *)0x300;
for (;;)
{
setCursor(0, 0);
print(itoab(*aa, iii));
}
}
ところで、メモリダンプを使用して、すべてが正しいアドレスにロードされていることが確認されています。たとえば、0x300はコードを単純化するために使用されるメモリの自由な部分です。
第三のステップは、それらの標準BIOSのマッピングからの割り込み再マッピングの通常の手順を意味する:以下のように
/asm/system.h
に定義されています。通常IRQ 0-7はINT 8-15にマッピングされ、IRQ 8-15はINT 0x70-0x77にマッピングされます。多くのオペレーティングシステムでは、IRQ 0-7がCPU例外用に予約された範囲外のものに再マップされます。 –これは、PIT IRQ 0に接続されているINT 8はINT 8を生成します。INT 0は整数除算のオーバーフロー(ゼロ除算)例外です。 –
ステップ3を実行して、最初の32個のIDTエントリの上にIRQを移動することを強くお勧めします。また、最初の32人のハンドラを置くことを強くお勧めします。問題が発生したかどうかを確認することができます。 [あなたの変数には揮発性のものを使う! –