OSDev

для всех
Текущее время: 27 апр 2024, 18:38

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Обработка прерываний
СообщениеДобавлено: 22 июл 2013, 19:07 
Аватара пользователя

Зарегистрирован: 22 июл 2013, 18:47
Сообщения: 5
Поспрашивал на форумах че-то знают, но не все :) Вообщем по их советам получается, что нужно делать так:
Код:
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;
}

Что-то мне подсказывает, что я все не так понял)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обработка прерываний
СообщениеДобавлено: 23 июл 2013, 00:01 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
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 .

И да, у меня сейчас закрадывается ощущение, что я только что покормил тролля. В любом случае, вопросы надо конкретнее формулировать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обработка прерываний
СообщениеДобавлено: 23 июл 2013, 09:09 
Аватара пользователя

Зарегистрирован: 22 июл 2013, 18:47
Сообщения: 5
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 это регистр такой :) Вот и записал его в переменную =)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обработка прерываний
СообщениеДобавлено: 24 июл 2013, 00:29 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
IDTR - как бы и регистр, но к нему прямого (в смысле через mov) доступа нету, для этого отдельные инструкции lidt/sidt (ну и ещё ряд путей, не будем здесь на них отвлекаться), что довольно таки логично. Правда, не слишком логично и делает меня офигевать тот факт, что адрес в него записывается виртуальный^W линейный, а не физический.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB