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/