Имам ли нужда от GDT, за да създам IDT?

Работя върху Atom-32bit платка (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, 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;

}

person mustapha mekhatria    schedule 03.10.2011    source източник


Отговори (2)


По принцип да. Трябва да имате GDT, за да можете да имате сегмент, към който да "насочите" IDT прекъсващ вектор. Забележете, (доколкото знам) можете да заредите както IDT, така и GDT едновременно, но не можете да използвате IDT, докато не заредите GDT. Ако се опитате да го направите, в най-добрия случай ще получите тройна грешка.

person Earlz    schedule 03.10.2011
comment
@Alex : някаква актуализация: Открих, че има BIOS на платката Atom, така че проверих за IDT и GDT /*Прочетете IDTR*/sidt (idt_ptr) /*Прочетете GDTR*/sgdt (gdt_ptr) и те съществуват, изглежда, че BIOS ги е направил. Опитах се да ги използвам (вижте по-горе функцията fill_interrupt), след това използвах int $0x20, PFFFF кодът отново се срина..... :-(...някаква следа, забележка или въпрос??? - person mustapha mekhatria; 04.10.2011
comment
@трябва какво? Да, BIOS вероятно зарежда GDT и IDT, но от де факто стандарта на IBM PC, вие се връщате обратно в реален режим (без GDT или IDT), преди да удари вашия зареждащ механизъм. Тази 32-битова платка Atom нещо специално ли е? Дали това е типична дънна платка Intel Atom, използвана в персонални компютри? - person Earlz; 05.10.2011
comment
Платката, която използвам, е Intel® Embedded Development Board 1-N450, - person mustapha mekhatria; 05.10.2011
comment
как да проверя дали ISR/прекъсване е добре зададено в IDT? има ли регистри за гледане или тест?, не виждам къде е проблема !!! - person mustapha mekhatria; 05.10.2011
comment
Първо заредете GDT, преди да се тревожите за IDT. И наистина няма по-добър начин да тествате IDT от това да опитате int 50 или каквото и да е. И тази платка е основно (от гледна точка на OS Dev) същата като стандартните IBM PC дънни платки. Може да разгледате osdev.org. Имат много добро wiki и полуактивен форум - person Earlz; 06.10.2011
comment
:10x, след известно проучване открих, че BIOS успя да изгради IDT/GDT, така че точно сега се опитвам да свържа int с моя ISR.... - person mustapha mekhatria; 06.10.2011

Разрешено :), тъй като има BIOS, той вече е изградил GDT/IDT, така че намерих там адрес с помощта на инструкциите sidt и sgdt и добавих своя ISR към sidt

person mustapha mekhatria    schedule 28.10.2011