Я пытаюсь построить IDT, после выполнения кода происходит сбой кода !!
У меня появляется сообщение об ошибке: SingleStep CPU [1] Ошибка: процессор работает
Примечание: я используюmicro Atom с затмением Helios, сборка AT & T
/ ** *********** Новый код ********* /
Новый код после того, как я обнаружил, что BIOS переводит атом в защищенный режим (CR0.PE = 1) и генерирует IDT / GDT:
Идея состоит в том, чтобы просто использовать 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+2) = (flags<<4)&0xFF00;
*(Interrupt_Address+3) = (base>>16)&0xFFFF;
}
/ ********************* Конечный новый код ********************* /
idt_flush:
push %ebp //save the context to swith back
mov %esp,%ebp
cli
mov $idt_ptr, %eax //Get the pointer to the IDT, passed as parameter
lidt (%eax) //Load the IDT pointer
sti
pop %ebp //Return to the calling function
ret
Что не так ???
см. Остальной код:
isr33:
push %ebp //save the context to swith back
mov %esp,%ebp
pop %ebp //Return to the calling function
ret
static void init_idt()
{
int iIndex;
//Link the IDTR to IDT
idt_ptr.limit = sizeof(idt_entry_t)*256-1;
idt_ptr.base = (unsigned int)&idt_entries;
idt_set_gate(0,(unsigned int) isr0, 0x00, 0xEE);
for ( iIndex=1; iIndex<32; iIndex++)
{
idt_set_gate(iIndex,(unsigned int) isr0, 0x00, 0x00);
}
idt_set_gate(ISR_Nbr,(unsigned int) isr33, 0x00, 0xEE);
//idt_flush((unsigned int)&idt_ptr);
idt_flush();
}
static void idt_set_gate(unsigned char num, unsigned int base, unsigned short sel, unsigned char flags)
{
idt_entries[num].base_lo = base&0xFFFF;
idt_entries[num].base_hi = (base>>16)&0xFFFF;
idt_entries[num].sel = sel;
idt_entries[num].always0 = 0;
idt_entries[num].flags = flags;
}
//IDT
struct idt_entry_struct
{
unsigned short base_lo;
unsigned short sel;
unsigned char always0;
unsigned char flags;
unsigned short base_hi;
}__attribute__((packed));
typedef struct idt_entry_struct idt_entry_t;
//IDT register
struct idt_ptr_struct
{
unsigned short limit;
unsigned int base;
}__attribute__((packed));
typedef struct idt_ptr_struct idt_ptr_t;
//ISR number
int ISR_Nbr = 33;