OSDev

для всех
Текущее время: 25 авг 2025, 12:50

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




Начать новую тему Ответить на тему  [ Сообщений: 160 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13 ... 16  След.
Автор Сообщение
СообщениеДобавлено: 20 авг 2013, 17:33 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Исправил, да.
Вообще убрал загрузку cr3 ибо пока в ней нет смысла, пока потоки только работают. Всё равно #TS

Сделал в конце main(...) вот такое
Код:
process_t* kern_proc = get_current_proc();

   thread01 = thread_create(kern_proc,
                             &task01,
                             0x4000,
                             true,
                             false);

   thread02 = thread_create(kern_proc,
                           &task02,
                           0x4000,
                           true,
                           false);

   thread03 = thread_create(kern_proc,
                           &task03,
                           0x4000,
                           true,
                           false);

   
   while (1)
   {
      set_kernel_stack_in_tss(init_esp);
   }

   return 0;
}

Всё работает, потоки переключаются! Стоит вызвать ту же функцию именно в переключалке - исключение #TS. Значит это как-то связано с тем, что вызов в обработчике прерывания


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

Зарегистрирован: 31 июл 2013, 09:40
Сообщения: 28
Если непонятна причина исключения, а толковым отладчиком в ядре пока даже не пахнет, надо загнать образ в бочс, а он уже скажет, в чем был косяк


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
maisvendoo писал(а):
Исправил, да.
Да, увидел на скрин-логе. Там же увидел, что у тебя в сегментных дескрипторах установлен бит L, т.е. портится значение 0xCF, фигурирующее в исходниках. Видимо, тоже используется &0xFF вместо &0xF.

sh2ezo, у автора оч. продвинутая отладка.


Последний раз редактировалось phantom-84 20 авг 2013, 18:14, всего редактировалось 1 раз.

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

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
phantom-84 писал(а):
увидел, что у тебя в сегментных дескрипторах установлен бит L, т.е. портится значение 0xCF, фигурирующее в исходниках.

действительно, черт, надо переписать. Видимо очередной привет от JM

Ага, было вот так
Код:
gdt_entries[num].limit_low = (limit & 0xFFFF);
gdt_entries[num].granularity = (limit >> 16) & 0xFF;
 
gdt_entries[num].granularity |= gran & 0xF0;


А надо
Код:
gdt_entries[num].limit_low = (limit & 0xFFFF);
gdt_entries[num].granularity = (limit >> 16) & 0xF;
 
gdt_entries[num].granularity |= gran & 0xF0;


Не затирал старшую тетраду при записи лимита в байт гранулярности
теперь вот
Изображение

Теперь какой-то бред в типе у TSS - 8B вместо проложенный 89


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
Это нормально. Меняется тип с DF_TSS32A (1001b) на DF_TSS32B (1011b).


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

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
phantom-84 писал(а):
Это нормально. Меняется тип с DF_TSS32A (1001b) на DF_TSS32B (1011b).

Да, уже убедился в этом. Из-за доступа при загрузке TR


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
Попробуй опять закомментировать команду LTR.


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

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


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
Может, между прологом и эпилогом переключалки где-то используется ebp в качестве указателя. Или в эпилоге используется leave. Было бы неплохо взглянуть на ассемблерный листинг переключалки.


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

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Там есть leave, это если через ht
Изображение
через дизасемблер eclipse, ht некоректно дизассемблировал пролог
Код:
          switch_task:
002034e8:   push %ebp
002034e9:   mov %esp,%ebp
002034eb:   sub $0x18,%esp
 89          if (multi_task)
002034ee:   mov 0x205070,%eax
002034f3:   test %eax,%eax
002034f5:   je 0x20355d <switch_task+117>
 92             asm volatile ("pushf; cli");
002034f7:   pushf
002034f8:   cli
 95             asm volatile ("mov %%esp, %0":"=a"(current_thread->esp));
002034f9:   mov 0x205dcc,%edx
002034ff:   mov %esp,%eax
00203501:   mov %eax,0x1c(%edx)
100                current_thread = (thread_t*) current_thread->list_item.next;
00203504:   mov 0x205dcc,%eax
00203509:   mov 0x4(%eax),%eax
0020350c:   mov %eax,0x205dcc
101                current_proc = (process_t*) current_proc->list_item.next;
00203511:   mov 0x205ddc,%eax
00203516:   mov 0x4(%eax),%eax
00203519:   mov %eax,0x205ddc
103             }   while ( (current_thread->suspend) || (current_proc->suspend) );
0020351e:   mov 0x205dcc,%eax
00203523:   mov 0x10(%eax),%eax
00203526:   test %eax,%eax
00203528:   jne 0x203504 <switch_task+28>
0020352a:   mov 0x205ddc,%eax
0020352f:   mov 0x14(%eax),%eax
00203532:   test %eax,%eax
00203534:   jne 0x203504 <switch_task+28>
108             asm volatile ("mov %0, %%esp"::"a"(current_thread->esp));
00203536:   mov 0x205dcc,%eax
0020353b:   mov 0x1c(%eax),%eax
0020353e:   mov %eax,%esp
110             set_kernel_stack_in_tss((u32int) current_thread->stack + current_thread->stack_size);
00203540:   mov 0x205dcc,%eax
00203545:   mov 0x18(%eax),%eax
00203548:   mov %eax,%edx
0020354a:   mov 0x205dcc,%eax
0020354f:   mov 0x14(%eax),%eax
00203552:   add %edx,%eax
00203554:   mov %eax,(%esp)
00203557:   call 0x20132a <set_kernel_stack_in_tss>
113             asm volatile ("popf");
0020355c:   popf
115       }
0020355d:   leave
0020355e:   ret


P.S.: Дописываю этот пост. Картинки мелкие делаю - превью, чтобы модеры не ругались

Вобщем переписал я на чистом асме переключалку. Исключение #TS исчезло, на скрине вывожу значение tss.esp0 из трех потоков, оно модифицируется переключалкой
Изображение
Код переключалки на асме
Код:
/*-----------------------------------------------------------------------------
/      Switch task
/----------------------------------------------------------------------------*/
.extern      current_thread
.extern      tss

.global      task_switch

task_switch:

         push   %ebp
         pushf
         cli
         
         /* Save current task's ESP */
         mov   current_thread, %edx
         mov   %esp, 28(%edx)
         
         /* Get next task */
         mov   4(%edx), %ecx
         mov %ecx, current_thread
         
         /* Set new ESP */
         mov current_thread, %edx
         mov 28(%edx), %esp
         
         /* Set TSS kernel stack */
         mov 24(%edx), %eax
         add 20(%edx), %eax
         
         mov $tss, %edx
         mov %eax, 4(%edx)            
         
         popf
         pop      %ebp
         ret

Оставил push ebp/pop ebp в прологе/эпилоге для совместимости, хотя теперь можно и без них. Что же делал leave такого пакостного? У Зубкова
Цитата:
Команда выполняет действия, противоположные команде ENTER. Фактически LEAVE только копирует EBP в ESP, тем самым выбрасывая из стекавесь кадр, созданный последней выполненной командой ENTER, и считывает из стека EBP для предыдущей процедуры, что одновременно восстанавливает и значение которое имел ESP до вызова последней команды ENTER

Ну а команда ENTER создает стековый кадр заданного размера и уровня вложенности. Обе команды появились в 80186

Чем опасно использование EBP указателя и как оно инициирует #TS?

P.P.S.: Это одна из немногих функций на асме полностью написанная мной самостоятельно, да ещё и для интеграции в код на C... Аж даже рад что этот косяк вылез :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 160 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13 ... 16  След.

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


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

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


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

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