OSDev

для всех
Текущее время: 01 июл 2025, 21:59

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




Начать новую тему Ответить на тему  [ Сообщений: 160 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 16  След.
Автор Сообщение
СообщениеДобавлено: 14 авг 2013, 15:08 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Я сделал это :)
Изображение
phantom-84, Спасибо :)

потоки четко переключаются и стек никуда не ползет. Поднял частоту прерываний таймера с 50 до 1000 Гц - норм


Последний раз редактировалось maisvendoo 14 авг 2013, 15:34, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 авг 2013, 15:34 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
Ага, текст точь-в-точь что и на первой картинке :lol:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 авг 2013, 15:35 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
phantom-84 писал(а):
Ага, текст точь-в-точь что и на первой картинке :lol:

Переделаю тест, чтобы в фиксированные места экрана выводился счетчик из каждого потока, сделаю видео ;)

Собственно вот
Изображение

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

А вот так с мьютексами
Изображение


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 авг 2013, 16:14 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
maisvendoo писал(а):
Мешанина из-за несинхронизированного доступа потоков к общему ресурсу - видеопамяти.
Если выводить в разные места напрямую, то все будет в порядке. У тебя произошла мешанина из-за того, что ты выводишь текст в позиции курсора. Если отключить на время перемещение реального курсора, сделав для каждого потока свой виртуальный курсор, то все будет работать и без блокировок.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 авг 2013, 16:20 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Кусор я позиционирую независимо от вывода в видеобуфер, помоему, вот код вывода символа
Код:
/*------------------------------------------------------------------------------
//   Put character on screen
//----------------------------------------------------------------------------*/
void put_char(char c)
{
  u8int attrib_byte = (background_color << 4) | (text_color & 0x0F);
 
  u16int attrib_word = attrib_byte << 8;
 
  u16int* location;
 
 
  if ( c == 0x08 && cur_x ) /* Backspace */
  {
    cur_x--;
  }
  else if (c == 0x09) /* TAB */
  {
    cur_x = (cur_x + 8) &~(8-1);
  }
  else if (c == '\r') /* Return */
  {
    cur_x = 0;
  }
  else if (c == '\n') /* Enter */
  {
    cur_x = 0;
    cur_y++;
  }
  else /* Other symbols */
  {
    location = video_memory + (cur_y*width + cur_x);
    *location = c | attrib_word;
    cur_x++;
  }
 
  if (cur_x > width)
  {
    cur_x = 0;
    cur_y++;
  }
 
  scroll();
 
  move_cursor(cur_x, cur_y);
   
}


Хотя действительно можно обойтись без вызова этих функций совсем, но это уже не так важно сейчас. Главное - заработавший планировщик и можно идти дальше :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 авг 2013, 16:33 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
Но вывод-то ты осуществляешь в позиции курсора. А если выполнять вывод в позиции воображаемого курсора, причем иметь свой воображаемый курсор для каждого потока, то все будет работать синхронно. Позицию воображаемого курсора можно сохранять в структуре потока, в вершине стека или наоборот на самом дне стека.

maisvendoo писал(а):
Главное - заработавший планировщик и можно идти дальше :)
Точно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 авг 2013, 16:49 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Да, для демонстрации надо этим озадачится, канеш, так как собираюсь продолжить блог по разработке ОС.

P.S.: Ну у меня прям камень с души :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 авг 2013, 18:06 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Хм, действительно можно даже не делать call switch_task, а просто поместить в стек точку входа в функцию потока. И задачи запускаются и переключаются по прерыванию. Крутой алгоритм :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 авг 2013, 18:28 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
а дайте пожалюйста образ мем детекторы,
у меня он есть только 64-битный, на 32-битных машинах не работает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 авг 2013, 18:36 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
scuter писал(а):
а дайте пожалюйста образ мем детекторы

Алгоритм определения объема доступной памяти что-ли?

По теме. Приведу код который получился в итоге
Переключение задач
Код:
void switch_task(void)
{
   if (multi_task)
   {
      /* Выключаем прерывания */
      asm volatile ("cli");

      /* Запоминаем указатель стека текущего потока */
      asm volatile ("mov %%esp, %0":"=a"(current_thread->state.esp));

      /* Идем по кольцевой очереди в поисках активного потока */
      do
      {
         current_thread = (thread_t*) current_thread->list_item.next;
         current_proc = (process_t*) current_proc->list_item.next;

      }   while ( (current_thread->suspend) || (current_proc->suspend) );

      /* Устанавливаем каталог страниц для нового процесса */
      asm volatile ("mov %0, %%cr3"::"a"(current_proc->page_dir));
      /* Устанавливаем указатель стека новой задачи */
      asm volatile ("mov %0, %%esp"::"a"(current_thread->state.esp));

      /* Снова разрешаем прерывания */
      asm volatile ("sti");
   }
}


Создание нового потока
Код:
thread_t* create_thread(process_t* proc,
                         void* entry_point,
                         size_t stack_size,
                         bool kernel,
                         bool suspend)
{
   void* stack = NULL;

   /* Запрещаем прерывания */
   asm volatile ("cli");

   /* Выделяем память под описатель потока */
   thread_t* tmp_thread = (thread_t*) kmalloc(sizeof(thread_t));

   /* Зануляем память описателя */
   memset(tmp_thread, 0, sizeof(thread_t));

   /* Инициализируем поток  */
   tmp_thread->id = next_thread_id++;
   tmp_thread->list_item.list = NULL;
   tmp_thread->process = proc;
   tmp_thread->stack_size = stack_size;
   tmp_thread->suspend = suspend;/* */
   tmp_thread->state.eip = (u32int) entry_point;

   /* Выделяем память под стек потока */
   stack = kmalloc(stack_size);
        /* Инициализируем указатель стека */
   tmp_thread->state.esp = (u32int) stack + stack_size - 16;
   
   /* Ставим поток в очередь */
   list_add(&thread_list, &tmp_thread->list_item);

   /* Наращиваем счетчик потоков текущего процесса */
   proc->threads_count++;   

   /* Заполняем стек потока */
   u32int eflags;

   asm volatile ("pushf; pop %0":"=r"(eflags));

   /* Создаем указатель на стековый кадр для удобного заполнения */
   u32int* esp = (u32int*) (stack + stack_size);

   esp[0] = eflags;
   esp[-1] = 0x1;
   esp[-2] = 0x2;
   esp[-3] = (u32int) entry_point;

   /* Включаем прерывания */
   asm volatile ("sti");
   /* Возвращаем указатель на поток для последующего управления им */
   return tmp_thread;
}


Собственно сами функции потоков
Код:
void task01(void)
{
   while (1)
   {
      print_text_XY(0, 10, "I'm task #1");
      print_dec_XY(13, 10, count01);
      count01++;
   }
}

void task02(void)
{
   while (1)
   {
      print_text_XY(0, 11, "I'm task #2");
      print_dec_XY(13, 11, count02);
      count02 += 2;
   }
}

void task03(void)
{
   while (1)
   {
      print_text_XY(0, 12, "I'm task #3");
      print_dec_XY(13, 12, count03);
      count03 += 3;
   }
}


Инициализация планировщика и main() изменений не претерпели


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 160 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 16  След.

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


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

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


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

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