Assembly 我需要GDT来构建IDT吗?
我正在Atom-32位板(AT&T组装)上工作,该板上还没有软件 我是否需要构建GDT来构建/使用IDT 这个想法就是使用ISR和APIC定时器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
/*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和一个半活动论坛