C 设置IDT时x86-64内核崩溃
我目前正在尝试从头开始创建x86-64内核(使用GRUB Multiboot2作为引导加载程序)。我设置GDT很好,但设置IDT时,似乎出现了问题。我通过C 设置IDT时x86-64内核崩溃,c,assembly,x86-64,nasm,osdev,C,Assembly,X86 64,Nasm,Osdev,我目前正在尝试从头开始创建x86-64内核(使用GRUB Multiboot2作为引导加载程序)。我设置GDT很好,但设置IDT时,似乎出现了问题。我通过hlting在我的代码的大多数指令之前和之后对lidt的调用来隔离问题。以下是定义IDT的C和ASM文件: global irq0 global irq1 global irq2 global irq3 global irq4 global irq5 global irq6 global irq7 global irq8 global irq9
hlt
ing在我的代码的大多数指令之前和之后对lidt
的调用来隔离问题。以下是定义IDT的C和ASM文件:
global irq0
global irq1
global irq2
global irq3
global irq4
global irq5
global irq6
global irq7
global irq8
global irq9
global irq10
global irq11
global irq12
global irq13
global irq14
global irq15
global load_idt
global remap_pic
global irq0_handler
global irq1_handler
global irq2_handler
global irq3_handler
global irq4_handler
global irq5_handler
global irq6_handler
global irq7_handler
global irq8_handler
global irq9_handler
global irq10_handler
global irq11_handler
global irq12_handler
global irq13_handler
global irq14_handler
global irq15_handler
extern handle_keyboard_in
%macro pushAll 0
push rax
push rcx
push rdx
push rbx
push rbp
push rsi
push rdi
%endmacro
%macro popAll 0
pop rdi
pop rsi
pop rbp
pop rbx
pop rdx
pop rcx
pop rax
%endmacro
section .text
bits 64
irq0:
pushAll
mov al, 0x20
out 0x20, al
popAll
iret
irq1:
pushAll
in al, 0x60
push ax
call handle_keyboard_in
mov al, 0x20
out 0x20, al
popAll
iret
irq2:
pushAll
mov al, 0x20
out 0x20, al
popAll
iret
irq3:
pushAll
mov al, 0x20
out 0x20, al
popAll
iret
irq4:
pushAll
mov al, 0x20
out 0x20, al
popAll
iret
irq5:
pushAll
mov al, 0x20
out 0x20, al
popAll
iret
irq6:
pushAll
mov al, 0x20
out 0x20, al
popAll
iret
irq7:
pushAll
mov al, 0x20
out 0x20, al
popAll
iret
irq8:
pushAll
mov al, 0x20
out 0xa0, al
out 0x20, al
popAll
iret
irq9:
pushAll
mov al, 0x20
out 0xa0, al
out 0x20, al
popAll
iret
irq10:
pushAll
mov al, 0x20
out 0xa0, al
out 0x20, al
popAll
iret
irq11:
pushAll
mov al, 0x20
out 0xa0, al
out 0x20, al
popAll
iret
irq12:
pushAll
mov al, 0x20
out 0xa0, al
out 0x20, al
popAll
iret
irq13:
pushAll
mov al, 0x20
out 0xa0, al
out 0x20, al
popAll
iret
irq14:
pushAll
mov al, 0x20
out 0xa0, al
out 0x20, al
popAll
iret
irq15:
pushAll
mov al, 0x20
out 0xa0, al
out 0x20, al
popAll
iret
load_idt:
mov edx, [esp + 4]
lidt [edx]
ret
remap_pic:
mov al, 0x11
out 0x20, al
out 0xA0, al
mov al, 0x20
out 0x21, al
mov al, 0x40
out 0xA1, al
mov al, 0x04
out 0x21, al
mov al, 0x02
out 0xA1, al
mov al, 0x01
out 0x21, al
out 0xA1, al
mov al, 0x00
out 0x21, al
out 0xA1, al
ret
#包括
#包括
结构IDT_条目{
无符号短整数偏移量_低轨道;
无符号短整数选择器;
无符号字符零;
无符号字符类型\u attr;
无符号短整数偏移量\u高位;
};
结构IDT_条目IDT[256];
void idt_init(){
extern int load_idt();
extern int remap_pic();
外部内部irq0();
extern int irq1();
外部内部irq2();
extern int irq3();
外部内部irq4();
外部内部irq5();
外部内部irq6();
外部内部irq7();
外部内部irq8();
外部内部irq9();
外部内部irq10();
外部内部irq11();
外部内部irq12();
外部内部irq13();
外部内部irq14();
外部内部irq15();
无符号长irq0_地址;
无符号长irq1_地址;
无符号长irq2_地址;
无符号长irq3_地址;
无符号长irq4_地址;
无符号长irq5_地址;
无符号长irq6_地址;
无符号长irq7_地址;
无符号长irq8_地址;
无符号长irq9_地址;
未签名的长irq10_地址;
未签名的长irq11_地址;
未签名的长irq12_地址;
未签名的长irq13_地址;
未签名的长irq14_地址;
未签名的长irq15_地址;
无符号长idt_地址;
无符号长idt_ptr[2];
重新映射图片();
irq0_地址=(无符号长)irq0;
IDT[32]。偏移量=irq0\地址&0xffff;
IDT[32]。选择器=0x08;/*内核\u代码\u段\u偏移量*/
IDT[32]。零=0;
IDT[32]。类型\u attr=0x8e;/*中断\u门*/
IDT[32]。偏移量\u高位=(irq0\u地址&0xffff0000)>>16;
irq1_地址=(无符号长)irq1;
IDT[33]。偏移量=irq1\U地址&0xffff;
IDT[33]。选择器=0x08;/*内核代码段偏移量*/
IDT[33]。零=0;
IDT[33]。类型\u attr=0x8e;/*中断\u门*/
IDT[33]。偏移量\u高位=(irq1\u地址&0xffff0000)>>16;
irq2_地址=(无符号长)irq2;
IDT[34]。偏移量=irq2\U地址&0xffff;
IDT[34]。选择器=0x08;/*内核代码段偏移量*/
IDT[34]。零=0;
IDT[34]。类型属性=0x8e;/*中断门*/
IDT[34]。偏移量\u高位=(irq2\u地址&0xffff0000)>>16;
irq3_地址=(无符号长)irq3;
IDT[35]。偏移量=irq3地址&0xffff;
IDT[35]。选择器=0x08;/*内核代码段偏移量*/
IDT[35]。零=0;
IDT[35]。类型属性=0x8e;/*中断门*/
IDT[35]。偏移量\u高位=(irq3\u地址&0xffff0000)>>16;
irq4_地址=(无符号长)irq4;
IDT[36]。偏移量=irq4\u地址&0xffff;
IDT[36]。选择器=0x08;/*内核代码段偏移量*/
IDT[36]。零=0;
IDT[36]。类型\u attr=0x8e;/*中断\u门*/
IDT[36]。偏移量\u高位=(irq4\u地址&0xffff0000)>>16;
irq5_地址=(无符号长)irq5;
IDT[37]。偏移量=irq5地址&0xffff;
IDT[37]。选择器=0x08;/*内核代码段偏移量*/
IDT[37]。零=0;
IDT[37]。类型\u attr=0x8e;/*中断\u门*/
IDT[37]。偏移量\u高位=(irq5\u地址&0xffff0000)>>16;
irq6_地址=(无符号长)irq6;
IDT[38]。偏移量=irq6地址&0xffff;
IDT[38]。选择器=0x08;/*内核代码段偏移量*/
IDT[38]。0=0;
IDT[38]。类型\u attr=0x8e;/*中断\u门*/
IDT[38]。偏移量\u高位=(irq6\u地址&0xffff0000)>>16;
irq7_地址=(无符号长)irq7;
IDT[39]。偏移量=irq7地址&0xffff;
IDT[39]。选择器=0x08;/*内核\u代码\u段\u偏移量*/
IDT[39]。零=0;
IDT[39]。类型属性=0x8e;/*中断门*/
IDT[39]。偏移量\u高位=(irq7\u地址&0xffff0000)>>16;
irq8_地址=(无符号长)irq8;
IDT[40]。偏移量=irq8地址&0xffff;
IDT[40]。选择器=0x08;/*内核代码段偏移量*/
IDT[40]。零=0;
IDT[40]。类型\u attr=0x8e;/*中断\u门*/
IDT[40]。偏移量\u高位=(irq8\u地址&0xffff0000)>>16;
irq9_地址=(无符号长)irq9;
IDT[41]。偏移量=irq9地址&0xffff;
IDT[41]。选择器=0x08;/*内核代码段偏移量*/
IDT[41]。零=0;
IDT[41]。类型\u attr=0x8e;/*中断\u门*/
IDT[41]。偏移量\u高位=(irq9\u地址&0xffff0000)>>16;
irq10_地址=(无符号长)irq10;
IDT[42]。偏移量=irq10地址&0xffff;
IDT[42]。选择器=0x08;/*内核\u代码\u段\u偏移量*/
IDT[42]。零=0;
IDT[42]。类型属性=0x8e;/*中断门*/
IDT[42]。偏移量\u高位=(irq10\u地址&0xffff0000)>>16;
irq11_地址=(无符号长)irq11;
IDT[43]。偏移量=irq11地址&0xffff;
IDT[43]。选择器=0x08;/*内核代码段偏移量*/
IDT[43]。零=0;
IDT[43]。类型\u attr=0x8e;/*中断\u门*/
IDT[43]。偏移量\u高位=(irq11\u地址&0xffff0000)>>16;
irq12_地址=(无符号长)irq12;
IDT[44]。偏移量=irq12地址&0xffff;
IDT[44]。选择器=0x08;/*内核代码段偏移量*/
IDT[44]。零=0;
IDT[44]。类型\u attr=0x8e;/*中断\u门*/
IDT[44]。偏移量\u高位=(irq12\u地址&0xffff0000)>>16;
irq13_地址=(无符号长)irq13;
IDT[45]。偏移量=irq13地址&0xffff;
IDT[45]。选择器=0x08;/*内核\u代码\u段\u偏移量*/
IDT[45]。零=0;
IDT[45]。类型\u attr=0x8e;/*中断\u门*/
IDT[45]。偏移量高位=(irq13\U地址&0xffff0000)>>16;
irq14_地址=(无符号长)irq14;
IDT[46
load_idt:
lidt [rdi]
ret