OSDev
http://osdev.su/

При переключении зачач перестают работать прерывания
http://osdev.su/viewtopic.php?f=6&t=584
Страница 1 из 1

Автор:  Ilyaaa [ 17 июн 2012, 09:40 ]
Заголовок сообщения:  При переключении зачач перестают работать прерывания

Здравствуйте, помогите, тут на днях начал пробовать реализовать многозадачность для своей ОС, но почему то при переключении задач перестают работать прерывания. То есть запускаю операционку - прерывания работают, создаю задачу. После этого сразу как срабатывает функция переключения задач - задача выполняется, но перестают работать прерывания, с чем может быть связанна проблема?
Структура задачи:
Код:
typedef struct task
{
   struct
   {
      struct TSS_t TSS;
      struct GDTgate_t LDT[2];
      int tssIdx;
      int ldtIdx;
      page_directory_t *page_directory;   // Page directory.
   }System;
   
   struct
   {
      int dynamic;
      int nice;
   }Priority;

   struct
   {
      u32int esp, ebp;         // Stack and base pointers.
      u32int eip;            // Instruction pointer.
      u32int kernel_stack;         // Kernel stack location.
   }Address;
   
   struct
   {
      struct task *next;         // The next task in a linked list.
      struct task *back;         // The back task in a linked list.
   }Link;
   
   char name[64];               //Name process
   enum status_t status;            //Status process
   int pid;               // Process ID.
} task_t;

Функция переключения задач:
Код:
void switch_task()
{
   if (!current_task)
      return;

   u32int esp, ebp, eip;
   asm volatile("mov %%esp, %0" : "=r"(esp));
   asm volatile("mov %%ebp, %0" : "=r"(ebp));

   eip = read_eip();

   // Have we just switched tasks?
   if (eip == 0x12345)
      return;

   // No, we didn't switch tasks. Let's save some register values and switch.
   current_task->Address.eip = eip;
   current_task->Address.esp = esp;
   current_task->Address.ebp = ebp;
   
   if (current_task->Link.next)
   {
      // Get the next task to run.
      current_task = current_task->Link.next;
      // If we fell off the end of the linked list start again at the beginning.
   }
   else
   {
      current_task = ready_queue;
   }

   eip = current_task->Address.eip;
   esp = current_task->Address.esp;
   ebp = current_task->Address.ebp;
   
   asm volatile("                   \
         cli;             \
         mov %0, %%ecx;   \
         mov %1, %%esp;   \
         mov %2, %%ebp;   \
         mov %3, %%cr3;   \
         mov $0x12345, %%eax; \
         sti;             \
         jmp *%%ecx       "
                : : "r"(eip), "r"(esp), "r"(ebp), "r"(current_directory->physicalAddr));
}

Автор:  grindars [ 17 июн 2012, 09:57 ]
Заголовок сообщения:  Re: При переключении зачач перестают работать прерывания

Как-то у вас оригинально переключение задач сделано. Весь код на одном и том же уровне привилегий работает, чтоль?

Автор:  Ilyaaa [ 17 июн 2012, 10:02 ]
Заголовок сообщения:  Re: При переключении зачач перестают работать прерывания

Да, пока что все выполняется на уровне ядра... Хотел после того как получится сделать нормально переключение задач реализовывать другие уровни привилегий.

Автор:  Ilyaaa [ 17 июн 2012, 10:03 ]
Заголовок сообщения:  Re: При переключении зачач перестают работать прерывания

Оригинально? Что ж, я в этом новичек, только на днях начал капать как это все устроенно...
Поэтому честно говоря пока что не представляю, как сделать это более оптимально.

Автор:  grindars [ 17 июн 2012, 10:45 ]
Заголовок сообщения:  Re: При переключении зачач перестают работать прерывания

Выведите в задаче регистр eflags (через pushf/pop eax, например) и посмотрите, установлен ли флаг IF.

Вообще, я советую сразу сделать переключение уровней и программную многозадачность: это совсем не сложно, зато быстро разберетесь, что именно происходит.

Автор:  Ilyaaa [ 17 июн 2012, 10:58 ]
Заголовок сообщения:  Re: При переключении зачач перестают работать прерывания

То есть вы предлагаете после переключения задач проверить флаг IF для задачи и если не установлен, то установить его? Я флаг не проверял, но после переключения задач пытался разрешить прерывания:
Код:
asm volatile("sti");
Не помогло.
Можете посоветовать какую-нибудь документацию по переключению уровней?

Автор:  Ilyaaa [ 17 июн 2012, 11:47 ]
Заголовок сообщения:  Re: При переключении зачач перестают работать прерывания

Сейчас проверил в задаче флаг IF после переключения, флаг установлен, но прерывания ни от таймера, ни от клавиатуры не проходят...

Автор:  grindars [ 17 июн 2012, 12:44 ]
Заголовок сообщения:  Re: При переключении зачач перестают работать прерывания

Нет, я предлагал просто на состояние посмотреть.

А вы по таймеру переключаете? Если да, то посылается ли EOI контроллеру прерываний после переключения?

Автор:  Ilyaaa [ 17 июн 2012, 13:06 ]
Заголовок сообщения:  Re: При переключении зачач перестают работать прерывания

Да, по таймеру. Блин, да я забывал EOI контроллеру прерываний отсылать... Спасибо большое, все заработало!!! :D :lol:

Автор:  phantom-84 [ 18 июн 2012, 12:04 ]
Заголовок сообщения:  Re: При переключении зачач перестают работать прерывания

Вообще EOI нужно посылать до переключения, а не после.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/