OSDev
http://osdev.su/

Переключение тредов по прерыванию от таймера
http://osdev.su/viewtopic.php?f=6&t=1027
Страница 1 из 1

Автор:  achesnokov [ 13 дек 2014, 12:34 ]
Заголовок сообщения:  Переключение тредов по прерыванию от таймера

Приветствую,

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

Автор:  SII [ 13 дек 2014, 12:47 ]
Заголовок сообщения:  Re: Переключение тредов по прерыванию от таймера

Вообще-то thread -- поток, а задача -- это task.

Что же касается стеков, то в случае использования защищённого режима потоки обычно работают в режиме пользователя (3-е кольцо защиты на IA-32), а системный код -- в режиме системы (0-е кольцо), и у них физически разные указатели стека. Так что перед возвратом управления из системы в поток пользовательского режима нужно просто установить требуемый указатель стека пользовательского режима. Если память не изменяет, он находится в TSS текущей задачи (даже если аппаратная многозадачность не используется, TSS всё равно присутствует -- точно так же, как имеются дескрипторы сегментов, даже если ОС и задачи работают в плоской модели). Но подробностей не помню, ибо давным-давно под IA-32 не пишу.

Автор:  achesnokov [ 13 дек 2014, 14:37 ]
Заголовок сообщения:  Re: Переключение тредов по прерыванию от таймера

Согласен, в ядре речь скорее о переключении задач. Задачи работают на 3-м уровне привилегий, ядро на нулевом. Прерывание может произойти как в момент работы кода на нулевом уровне привилегий так и на 3-м. В случае прерывания без переключения уровня привилегий стек не переключается, в случае прерывания с переключением уровня привилегий стек переключается. Для переключения стека берутся новые SS:ESP из TSS текущей задачи. Стеки в первом и втором случае нарисованы на картинке: Изображение

SS,ESP прерванной задачи помещается в стек перед флагами. При выполнении IRET с переключением уровня привилегий SS, ESP берутся из стека.

Для переключения задач нужно заменить лежащие в стеке SS,ESP, EFLAGS, CS, EIP регистрами другой задачи, правильно я понимаю?

Автор:  pavia [ 13 дек 2014, 14:53 ]
Заголовок сообщения:  Re: Переключение тредов по прерыванию от таймера

:lol: Честно вопрос смешон. Хотя я бы и сам не отказался бы от кода.

1) С течением времени Intel менял механизм переключения контекста задач. Около 5-7 вариантов
2) Добавлялись регистры.
3) Переключение контекста задач в 0 кольце отличается от 3 кольца.

Том 3А стр 232 глава EXCEPTION AND INTERRUPT HANDLING
Мне как-то эти картинки не очень понятны поэтому расписал структурой.
Код:
Type
 StackFrame=record
            RetIP:Dword;
            EAX:DWord;
         DS:DWord;
             case integer of
             0: IntStackFrame0: record
                EIP:DWord;
               CS:DWord;
               EFlags:DWord;
                end;
             1: IntStackFrame3: record
                EIP:DWord;
               CS:DWord;
               EFlags:DWord;
                ESP:DWord;
               SS:DWord;
                end;   
             end;   
            end;     


DS, EAX нужны для написания кода
поэтому я их собственноручно заношу в стек и вызываю подпрограмму сохранения состояния и загрузки..
Отсюда и 3 дополнительных поля вверху мой структуры.
Код:
  RetIP:Dword;
  EAX:DWord;
  DS:DWord;

Автор:  pavia [ 13 дек 2014, 15:11 ]
Заголовок сообщения:  Re: Переключение тредов по прерыванию от таймера

Суди по всему ошибки у вас в фразе.

Как я писал выше существует несколько способов переключения
1) программный
2) аппаратный
TSS - это одна из разновидность аппаратного переключения задач.

Цитата:
В случае прерывания без переключения уровня привилегий стек не переключается, в случае прерывания с переключением уровня привилегий стек переключается.

Нет. Стек не переключается. Старый для 3 кольца сохраняется, а для 0 создаётся новый поверх старого 0.

achesnokov писал(а):
SS,ESP прерванной задачи помещается в стек перед флагами. При выполнении IRET с переключением уровня привилегий SS, ESP берутся из стека.

Если вы не используете TSS, то из стека иначе из TSS.
Т.е если ручное переключение, то из стека если автоматическое то из TSS.

achesnokov писал(а):
Для переключения задач нужно заменить лежащие в стеке SS,ESP, EFLAGS, CS, EIP регистрами другой задачи, правильно я понимаю?

Да.

Автор:  phantom-84 [ 13 дек 2014, 18:56 ]
Заголовок сообщения:  Re: Переключение тредов по прерыванию от таймера

Я одному парню на страницах форума расписывал переключалку, которая используется у меня в ядре. Все сильно упростили, но это даже лучше для понимания сути.

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