启用中断时QEMU三重故障

时间:2019-08-06 10:19:00

标签: c++ c assembly kernel

我正在使用一个简单的操作系统,并且当前正在尝试加载IDT。在编译过程中没有出现任何错误,但是当我尝试启用中断时,QEMU出现了三重错误。

我已经用iHex查看了EIP寄存器中的地址,但是它似乎是自动生成的代码,因为它在内核代码中不存在。我也曾尝试在我的C ++代码中加载GDT,但没有任何区别,我已经将其加载到引导加载程序中。

IDT安装功能

void idt_install()
{
    /* Sets the special IDT pointer up, just like in 'gdt.c' */
    idtp.limit = (sizeof (struct idt_entry) * 256) - 1;
    idtp.base = (unsigned int) idt;

    /* Clear out the entire IDT, initializing it to zeros */
    memset(&idt, 0, sizeof(struct idt_entry) * 256);

    /* Add any new ISRs to the IDT here using idt_set_gate */



    /* Points the processor's internal register to the new IDT */
    idt_load();
}

kernel_init函数中的相关代码 idt_install();

__asm__ __volatile__ ("sti");

它应该加载IDT并启用中断,但是出现三重错误,QEMU反复重启。这是使用-d int选项运行QEMU的结果。

EAX=000000fa EBX=000b8022 ECX=000b8000 EDX=00000060
ESI=00007e12 EDI=00000000 EBP=0000de88 ESP=0000de70
EIP=00007e4a EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00007c43 00000018
IDT=     000096c0 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000 
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=0000de54 CCO=EFLAGS  
EFER=0000000000000000
check_exception old: 0xffffffff new 0xd
     1: v=0d e=0042 i=0 cpl=0 IP=0008:00007e4a pc=00007e4a SP=0010:0000de70 env->regs[R_EAX]=000000fa
EAX=000000fa EBX=000b8022 ECX=000b8000 EDX=00000060
ESI=00007e12 EDI=00000000 EBP=0000de88 ESP=0000de70
EIP=00007e4a EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00007c43 00000018
IDT=     000096c0 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000 
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=0000de54 CCO=EFLAGS  
EFER=0000000000000000
check_exception old: 0xd new 0xd
     2: v=08 e=0000 i=0 cpl=0 IP=0008:00007e4a pc=00007e4a SP=0010:0000de70 env->regs[R_EAX]=000000fa
EAX=000000fa EBX=000b8022 ECX=000b8000 EDX=00000060
ESI=00007e12 EDI=00000000 EBP=0000de88 ESP=0000de70
EIP=00007e4a EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     00007c43 00000018
IDT=     000096c0 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000 
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=0000de54 CCO=EFLAGS  
EFER=0000000000000000
check_exception old: 0x8 new 0xd

1 个答案:

答案 0 :(得分:0)

好,我刚刚解决了这个问题。我忘记了运行我的install_isrs函数。我不知道为什么花了我几天时间才能意识到,但是如果其他任何人都遇到了这个问题,我只能说要确保您不会丢失一行会破坏整个内核的代码。