Соберите сборку IDT (ТАБЛИЦА ПРЕРЫВАНИЯ ПРЕРЫВАНИЯ) AT & T intel 32 bit - PullRequest
0 голосов
/ 01 октября 2011

Я пытаюсь построить 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;

Ответы [ 2 ]

2 голосов
/ 01 октября 2011

Можете ли вы объяснить, почему вы устанавливаете значения селектора в записях IDT на 0?Разве они не должны быть несколько более значимыми?

Я не помню подробностей (и мне сейчас лень проверять документацию), но установите байт доступа в записях IDT на 0x8E, а не0 или 0xEE.Это должно работать.Вы можете сделать его более сложным позже.

Наконец, isr33 () - это функция C или функция сборки?Сохраняет и восстанавливает ли регистры сегментов и регистры общего назначения?Покажите нам функцию.

Пока не разрешайте прерывания.Сначала убедитесь, что ваш isr33 работает правильно, когда вызывается через INT 33.Зачем?Увидев вышесказанное, я ожидаю проблем с настройкой и обработкой PIC, и любое аппаратное прерывание может просто привести к сбою вашего кода, если PIC не запрограммирован правильно.

0 голосов
/ 14 ноября 2011

Решено, так как я использую плату N450 Atom, у нее уже есть BIOS, BIOS делает IDT и GDT, все, что мне нужно сделать, это только сейчас, где они находятся, читая их адреса с: sidt (для IDT) и sgdt (для GDT).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...