OSDev

для всех
Текущее время: 29 апр 2024, 00:00

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




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
СообщениеДобавлено: 13 дек 2014, 12:34 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
Приветствую,

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 дек 2014, 12:47 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Вообще-то thread -- поток, а задача -- это task.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 дек 2014, 14:37 

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 дек 2014, 14:53 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
: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;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 дек 2014, 15:11 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Суди по всему ошибки у вас в фразе.

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

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

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

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

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

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

Да.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 дек 2014, 18:56 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Я одному парню на страницах форума расписывал переключалку, которая используется у меня в ядре. Все сильно упростили, но это даже лучше для понимания сути.


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

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


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

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


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

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