0
如何使用LIDT創建IDT 我使用Intel-Atom 32位(裝配AT & T)。 我用MocroC OSII作爲一個操作系統, 我這樣做,但它不,T工作:如何使用LIDT創建IDT我工作在Intel-Atom 32位(裝配AT&T)
Load_IDT:
push %ebp //save the context to swith back
mov %esp,%ebp
movw $256*8, -6(%esp) //256 ISR possible
movl $IDT, -4(%esp) //IDT is a table of 256*8bytes
lidt -6(%esp)
pop %ebp //Return to the calling function
ret
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>>4)&0xFF00;
*(Interrupt_Address+1) = (base>>16)&0xFFFF;
}
/*Change the address of idt_entries table */
fill_interrupt(ISR_Nbr,(unsigned int) isr33, 0x08, 0x8E);
究竟什麼不行?究竟發生了什麼以及什麼時候(掛起/崩潰/其他的東西,在這個例程中/在調用它之後)?你的代碼在這個例程之後做了什麼?在調用此例程之前是否啓用中斷(EFLAGS.IF = 1)? IDT裏面有什麼? –
@Alex:IF = 1,當涉及到彈出%epb時,它崩潰!!!,並且我有CPU錯誤(我使用Eclipse:Helios) –
必須保持中斷禁用,直到IDT和IDTR正確設置。在完成IDT/IDTR之前,不要將IF設置爲1(使用CLI將其重置爲0)。另外,在啓用中斷之前,確保所有的段寄存器(CS,DS,ES,SS,FS,GS)都加載了有效的保護模式選擇器值(如果不使用寄存器,可以加載0)。從ISR返回通常會從堆棧中恢復它們,如果之前有垃圾,恢復它會導致崩潰。 –