OSDev http://osdev.su/ |
|
Обработка прерываний http://osdev.su/viewtopic.php?f=6&t=765 |
Страница 1 из 1 |
Автор: | polniy_debil [ 22 июл 2013, 19:07 ] |
Заголовок сообщения: | Обработка прерываний |
Поспрашивал на форумах че-то знают, но не все Вообщем по их советам получается, что нужно делать так: Код: struct IntGate { void * far_addr; int wc:4; unsigned zero2:4; unsigned type:4; unsigned zero1:1; unsigned dpl:2; int p:1; }; #pragma pack(pop) void setInterreputHandler(int num, void (*handler)() ) { IntGate *gate_arr; __asm__("mov %idtr, %[gate_arr]"); IntGate handler_gate = { handler, /*адрес обработчика*/ 0, /*не используем*/ 0, /*должен быть 0*/ 14, /*тип шлюза - 0b1110*/ 0, /*должен быть 0*/ 1, /*с любыми привелегиями*/ 1 /*присутствает*/ } gate_arr[num] = handler_gate; } Что-то мне подсказывает, что я все не так понял) |
Автор: | Nable [ 23 июл 2013, 00:01 ] |
Заголовок сообщения: | Re: Обработка прерываний |
1. Не вижу #pragma pack с push. А это важно. 2. Зачем MSVC? Вот только не надо рассказывать про превосходство MS во всём и вся. Я к тому что обычно для осдева используют чего попроще настраиваемое. Там ещё есть attribute packed. "mov %idtr" - вообще пушка какая-то. Хотя, может какое-то расширение от MS. Описанная выше структура IntGate, кстати, весьма далека от истины. Лучше внимательно самому прочесть доки. Ну или хотя бы wiki: http://wiki.osdev.org/IDT , http://wiki.osdev.org/IDT_problems#Problems_with_IDTs и http://wiki.osdev.org/Interrupt_Service_Routines . И да, у меня сейчас закрадывается ощущение, что я только что покормил тролля. В любом случае, вопросы надо конкретнее формулировать. |
Автор: | polniy_debil [ 23 июл 2013, 09:09 ] |
Заголовок сообщения: | Re: Обработка прерываний |
Nable писал(а): 1. Не вижу #pragma pack с push. А это важно. 2. Зачем MSVC? Вот только не надо рассказывать про превосходство MS во всём и вся. Я к тому что обычно для осдева используют чего попроще настраиваемое. Там ещё есть attribute packed. "mov %idtr" - вообще пушка какая-то. Хотя, может какое-то расширение от MS. Описанная выше структура IntGate, кстати, весьма далека от истины. Лучше внимательно самому прочесть доки. Ну или хотя бы wiki: http://wiki.osdev.org/IDT , http://wiki.osdev.org/IDT_problems#Problems_with_IDTs и http://wiki.osdev.org/Interrupt_Service_Routines . И да, у меня сейчас закрадывается ощущение, что я только что покормил тролля. В любом случае, вопросы надо конкретнее формулировать. 1. Они есть, я не полностью скопировал. 2. GCC отлично поддерживает #pragma pack. Посмотрю про attribute packed. 3. Спасибо. 4. Я не тролль. Я думал, что IDTR это регистр такой Вот и записал его в переменную =))) |
Автор: | Nable [ 24 июл 2013, 00:29 ] |
Заголовок сообщения: | Re: Обработка прерываний |
IDTR - как бы и регистр, но к нему прямого (в смысле через mov) доступа нету, для этого отдельные инструкции lidt/sidt (ну и ещё ряд путей, не будем здесь на них отвлекаться), что довольно таки логично. Правда, не слишком логично и делает меня офигевать тот факт, что адрес в него записывается виртуальный^W линейный, а не физический. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |