Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Assembly 我需要GDT来构建IDT吗?_Assembly_X86_Osdev - Fatal编程技术网

Assembly 我需要GDT来构建IDT吗?

Assembly 我需要GDT来构建IDT吗?,assembly,x86,osdev,Assembly,X86,Osdev,我正在Atom-32位板(AT&T组装)上工作,该板上还没有软件 我是否需要构建GDT来构建/使用IDT 这个想法就是使用ISR和APIC定时器 /*Change the address of idt_entries table */ fill_interrupt(ISR_Nbr,(unsigned int) isr33, 0x08, 0x8E); static void fill_interrupt(unsigned char num, unsigned int base, unsigne

我正在Atom-32位板(AT&T组装)上工作,该板上还没有软件

我是否需要构建GDT来构建/使用IDT

这个想法就是使用ISR和APIC定时器

/*Change the address of idt_entries table */
fill_interrupt(ISR_Nbr,(unsigned int) isr33, 0x08, 0x8E);


static void fill_interrupt(unsigned char num, unsigned int base, unsigned short sel, unsigned char flags)
{
    unsigned short *Interrupt_Address;

    /*address = idt_ptr.base + num * 8 byte*/
    Interrupt_Address = (unsigned short *)(idt_ptr.base + num*8);

    *(Interrupt_Address) = base&0xFFFF;
    *(Interrupt_Address+1) = sel;
    *(Interrupt_Address+1) = (flags>>8)&0xFF00;
    *(Interrupt_Address+1) = (base>>16)&0xFFFF;

}

基本上,是的。您必须有一个GDT,这样才能有一个段“指向”IDT中断向量。注意,(据我所知)您可以同时加载IDT和GDT,但在加载GDT之前,您不能使用IDT。如果你试图这么做,你最多只能得到三个错误。

解决:),因为有一个BIOS,它已经构建了GDT/IDT,所以我使用sidt和sgdt指令找到了地址,我将ISR添加到sidt

@Alex:一些更新:我发现Atom板上有一个BIOS,所以我检查了IDT和GDT/*读取IDTR*/sidt(idt_ptr)/*读取GDTR*/sgdt(gdt_ptr)”,它们就存在了,好像是BIOS制造的。我试着使用它们(参见上面的函数fill_interrupt),之后我使用了“int$0x20”,PFFFF代码再次崩溃-(……有任何线索、评论或问题吗?@一定是什么?是的,BIOS可能确实加载了GDT和IDT,但根据事实上的IBM PC标准,在它进入引导加载程序之前,您会返回到实模式(没有GDT或IDT)。这块“Atom 32位”主板有什么特别之处吗?它是PC中使用的典型Intel Atom主板吗?我使用的主板是“英特尔嵌入式开发板1-N450“,我如何检查IDT中的ISR/中断设置是否正确?是否有任何寄存器需要查看或测试?我不知道问题出在哪里!!!在担心IDT之前先加载GDT。没有比尝试
int 50
或其他什么更好的方法来测试IDT。而该板基本上是(从操作系统开发人员的角度来看)与标准IBM PC主板相同。您可能想看看。它们有一个非常好的wiki和一个半活动论坛