x86 Архитектурасындағы Үзіліс Дескриптор Кестесі (IDT)
Interrupt descriptor table
x86 архитектурасындағы үзіліс дескриптор кестесі (IDT) туралы біліңіз. Үзілістерге жауап беру үшін процессор қолданатын дерек құрылымы. Құрылым, түрлері, қолданылуы.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Тоқтату дескрипторы кестесі (IDT) — x86 архитектурасының үзіліс векторлық кестесін іске асыру үшін пайдаланатын дерек құрылымы. IDT процессорға үзілістер мен ерекше жағдайларға дұрыс жауап беруді анықтау үшін қолданылады. Төмендегі сипаттамадағы мәліметтер нақты x86 архитектурасына қатысты. Басқа архитектураларда ұқсас дерек құрылымдары болуы мүмкін, бірақ олардың жұмыс істеу қағидалары әртүрлі болуы мүмкін. IDT-ны қолдану аппараттық үзілістер, бағдарламалық үзілістер және процессор ерекшеліктері – барлығы бірге үзілістер деп аталатын үш түрлі оқиға арқылы іске қосылады. IDT 256 үзіліс векторларынан тұрады, олардың алғашқы 32-сі (0–31 немесе 0x00–0x1F) процессор ерекшеліктері үшін пайдаланылады.
The interrupt descriptor table (IDT) is a data structure used by the x86 architecture to implement an interrupt vector table. The IDT is used by the processor to determine the correct response to interrupts and exceptions. The details in the description below apply specifically to the x86 architecture. Other architectures have similar data structures, but may behave differently. Use of the IDT is triggered by three types of events: hardware interrupts, software interrupts, and processor exceptions, which together are referred to as interrupts. The IDT consists of 256 interrupt vectors–the first 32 (0–31 or 0x00–0x1F) of which are used for processor exceptions.
Нақты режим
Нақты режимде үзіліс кестесі IVT (үзіліс векторлық кесте) деп аталады. 80286 процессорына дейін IVT жадыда әрқашан 0x0000-ден 0x03ff-ке дейінгі бірдей жерде орналасқан және 256 алыс көрсеткіштен тұрды. Аппараттық үзілістерді бағдарламаланатын үзіліс басқарушысы арқылы кез келген векторға бейімдеуге болады. 80286 және одан кейінгі процессорларда IVT-ның мөлшері мен орналасуын, қорғалған режимдегі IDT (Interrupt Descriptor Table) сияқты, LIDT (Load Interrupt Descriptor Table Register) нұсқаулары арқылы өзгертуге болады, бірақ бұл оның форматын өзгерте алмайды.
In real mode, the interrupt table is called IVT (interrupt vector table). Up to the 80286, the IVT always resided at the same location in memory, ranging from 0x0000 to 0x03ff, and consisted of 256 far pointers. Hardware interrupts may be mapped to any of the vectors by way of a programmable interrupt controller. On the 80286 and later, the size and locations of the IVT can be changed in the same way as it is done with the IDT (Interrupt descriptor table) in protected mode (i. e., via the LIDT (Load Interrupt Descriptor Table Register) instruction) though it does not change the format of it.
BIOS үзілісі
BIOS үзіліс басқарушыларды тіркеу арқылы аппараттық құралдардың бір бөлігіне қарапайым нақты режимде қол жеткізуді қамтамасыз етеді. Олар INT командасымен бағдарламалық үзіліс ретінде шақырылады, ал параметрлер тіркеулер арқылы жіберіледі. Бұл үзілістер жүйе жадының құрылымын анықтау, VGA шығысын және режимдерін конфигурациялау, сондай-ақ жүктеу процесінің басында дискіге қол жеткізу сияқты түрлі міндеттер үшін пайдаланылады.
The BIOS provides simple real mode access to a subset of hardware facilities by registering interrupt handlers. They are invoked as software interrupts with the INT assembly instruction and the parameters are passed via registers. These interrupts are used for various tasks like detecting
the system memory layout, configuring VGA output and modes, and accessing the disk early in the boot process.
Қорғалған және ұзақ режім
IDT – жадта тізбектей сақталатын және векторлық нөмірмен индекстелетін дескрипторлар массиві. Барлық мүмкін жазбаларды пайдалану қажет емес: кестені қолданылған ең жоғары үзіліс векторына дейін толтыру жеткілікті, ал IDT ұзындығы бөлігін сәйкесінше орнату керек. IDTR тіркегі IDT-ның сызықтық базалық мекенжайын және лимитін (байттардағы ұзындығы минус 1) сақтау үшін қолданылады. Үзіліс пайда болғанда процессор үзіліс векторын ену өлшеміне (қорғалған режимде 8, ұзақ режимде 16) көбейтіп, нәтижені IDT базалық мекенжайына қосады. Егер мекенжай кесте шегінде болса, DPL тексеріледі және үзіліс шлюз түріне қарай өңделеді. Дескрипторлар үзіліс қақпалары, тұзақ қақпалары немесе тек 32 биттік қорғалған режимде ғана тапсырма қақпалары бола алады. Үзіліс және тұзақ қақпалары сегментті (GDT немесе LDT-де болатын) және осы сегменттегі ауытқуды көрсету арқылы орындалатын кодты қамтитын жад орнын көрсетеді. Тұзақ және үзіліс қақпаларының арасындағы жалғыз айырмашылық – үзіліс қақпалары процессордың бұғатталатын аппараттық үзілістерді одан әрі өңдеуін тоқтатады, оларды аппараттық тарапынан туындаған үзілістерді өңдеуге қолайлы етеді (керісінше, тұзақ қақпалары бағдарламалық үзілістер мен қателерді өңдеу үшін пайдалы). Тапсырма қақпасы ағымдағы белсенді тапсырма күйінің сегментін ауыстырады, аппараттық тапсырма ауыстыру механизмін пайдаланып процессорды тиімді түрде басқа бағдарламаға, жіпке немесе процеске береді.
The IDT is an array of descriptors stored consecutively in memory and indexed by the vector number. It is not necessary to use all of the possible entries: it is sufficient to populate the table up to the highest interrupt vector used, and set the IDT length portion of the accordingly. The IDTR register is used to store both the linear base address and the limit (length in bytes minus 1) of the IDT. When an interrupt occurs, the processor multiplies the interrupt vector by the entry size (8 for protected mode, 16 for long mode) and adds the result to the IDT base address. If the address is inside the table, the DPL is checked and the interrupt is handled based on the gate type. The descriptors may be either interrupt gates, trap gates or, for 32 bit protected mode only, task gates. Interrupt and trap gates point to a memory location containing code to execute by specifying both a segment (present in either the GDT or LDT) and an offset within that segment. The only difference between trap and interrupt gates is that interrupt gates will disable further processor handling of maskable hardware interrupts, making them suitable to handle hardware generated interrupts (conversely, trap gates are useful for handling software interrupts and exceptions). A task gate will cause the currently active task state segment to be switched, using the hardware task switch mechanism to effectively hand over use of the processor to another program, thread or process.
Қалқалау
Кейбір Windows бағдарламалары IDT-ге шақыруларды (қоңырауларды) ұстайды. Бұл IDT-ге шақыруларды (қоңырауларды) тоқтатып, өз өңдеуін қосатын ядролық режимдегі драйверді жазуды қамтиды. Microsoft бұны ресми түрде ешқашан қолдаған емес, бірақ Windows-тың 64-биттік нұсқаларына дейін оның операциялық жүйелерінде бағдарламалық түрде бұл мүмкіндікке жол берілген. Ал енді, ядролық режимдегі ұстағышты (hook) пайдалануға тырысқан драйвер машинаның жұмысын тоқтатып, қате туралы хабарлама шығарады.
Some Windows programs hook calls to the IDT. This involves writing a kernel mode driver that intercepts calls to the IDT and adds in its own processing. This has never been officially supported by Microsoft, but was not programmatically prevented on its operating systems until 64 bit versions of Windows, where a driver that attempts to use a kernel mode hook will cause the machine to bug check.