2011-09-29 30 views
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); 
+1

究竟什麼不行?究竟發生了什麼以及什麼時候(掛起/崩潰/其他的東西,在這個例程中/在調用它之後)?你的代碼在這個例程之後做了什麼?在調用此例程之前是否啓用中斷(EFLAGS.IF = 1)? IDT裏面有什麼? –

+0

@Alex:IF = 1,當涉及到彈出%epb時,它崩潰!!!,並且我有CPU錯誤(我使用Eclipse:Helios) –

+0

必須保持中斷禁用,直到IDT和IDTR正確設置。在完成IDT/IDTR之前,不要將IF設置爲1(使用CLI將其重置爲0)。另外,在啓用中斷之前,確保所有的段寄存器(CS,DS,ES,SS,FS,GS)都加載了有效的保護模式選擇器值(如果不使用寄存器,可以加載0)。從ISR返回通常會從堆棧中恢復它們,如果之前有垃圾,恢復它會導致崩潰。 –

回答

0

解決:),因爲有一個BIOS,它已經建立了GDT/IDT。

相關問題