Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 设置IDT时x86-64内核崩溃_C_Assembly_X86 64_Nasm_Osdev - Fatal编程技术网

C 设置IDT时x86-64内核崩溃

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

我目前正在尝试从头开始创建x86-64内核(使用GRUB Multiboot2作为引导加载程序)。我设置GDT很好,但设置IDT时,似乎出现了问题。我通过
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