OSDev

для всех
Текущее время: 10 май 2024, 13:36

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




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

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
phantom-84 писал(а):
pavia писал(а):
а почему в состояние задачи не сохраняешь регистры общего назначения?
Посмотри внимательно, в этом нет абсолютно никакой необходимости.

Всё равно не понимаю. Почему нет необходимости?


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
pavia писал(а):
Всё равно не понимаю. Почему нет необходимости?
Когда переключение происходит по таймеру, сохранение/восстановление большинства регистров происходит в самом обработчике. А когда переключалка вызывается явно, то все регистры сохранять не требуется. Ты же не сохраняешь/восстанавливаешь весь регистровый контекст во время вызова подпрограмм.

Все что действительно нужно, сохраняется. У меня в ядре это fs, gs и некоторые флаги. Все внутренние функции ядра должны вызываться с cs=KCODE, ds=es=ss=KDATA и не разрушать значения всех шести сегментных регистров.


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

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
А хитро. Понял. У тебя не вытесняющая многозадачность, а корпоративная. А зачем тога стеки переключать?
Кажется нашел у себя ошибку осталась придумать как исправить.


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
А что при использовании вытесняющей многозадачности мы сами уже никогда не отдаем управление ядру (а через него и другим задачам)?

Есть и кооператив, но только для высокоприоритетных потоков. Есть и вытеснение с очень большими квантами времени, но тоже только для высокоприоритетных потоков.


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

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Собственно смотрю код
Код:
 
proc SwitchToNext ; cs=KCODE, ds=es=ss=KDATA
  push fs
  push gs
  pushf
  cli
; раскомментируйте, если не хотите получать [current] на входе в подпрограмму
;  mov eax,[current]                   
  mov [eax+TS.stackpointer],esp   ; Сохраняем указатель стека текущей задачи
  mov eax,[eax+TS.next]              ; Берем указатель на описатель следующей задачи
  mov esp,[eax+TS.stackpointer]   ; Загружаем указатель стека следующей задачи
  mov [current],eax                     ; Делаем текущей задачу на которую переключаемся
  popf
  pop gs
  pop fs
  ret


Но вот адрес возврата в стек погружает сама задача что ли?
И ещё вопрос - селекторы каких сегментов хранятся в FS и GS?


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Цитата:
Но вот адрес возврата в стек погружает сама задача что ли?
Естественно, инструкцией call. Перед первым запуском задачи это делается в родительской задаче "вручную", о чем я писал.

Цитата:
И ещё вопрос - селекторы каких сегментов хранятся в FS и GS?
В ядре я их практически не использую, просто сохраняю/восстанавливаю для приложений. В стартовом стековом кадре инициализирую нулями.


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

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Значит при создании новой задачи:
1. Заполняем её описатель
2. Ставим в очередь.
3. Формируем вручную стек - помещаем туда все необходимые значения, ESP ставим указывающим на вершину стека.
4. Делаем call на задачу, при этом адрес возврата помещается в стек новой задачи

При переключении:
1. Запоминаем ESP текущей задачи
2. Берем следующую задачу из очереди
3. Помещаем в регистр ESP его значение для следующей задачи

Таким образом у нас меняется стек, при завершении обработчика управление передается по адресу сохраненному в стеке при создании задачи. Я правильно понял?


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
maisvendoo писал(а):
Значит при создании новой задачи:
1. Заполняем её описатель
2. Ставим в очередь.
3. Формируем вручную стек - помещаем туда все необходимые значения, ESP ставим указывающим на вершину стека.
4. Делаем call на задачу, при этом адрес возврата помещается в стек новой задачи
Нет.
1. Заполняем кадр возобновления (размещаемый под вершиной стека задачи) и структуру задачи (они у меня располагаются последовательно, т.е. стек находится прямо под структурой задачи).
2. Ставим в очередь.
3. Делаем "call SwitchToNext" или просто продолжаем заниматься своими делами, пока переключение не произойдет само (по таймеру или как-то еще).

Цитата:
При переключении:
1. Запоминаем ESP текущей задачи
2. Берем следующую задачу из очереди
3. Помещаем в регистр ESP его значение для следующей задачи
Да. Только я это делал внутри подпрограммы переключения. И не забываем обновить current.

Цитата:
Таким образом у нас меняется стек, при завершении обработчика управление передается по адресу сохраненному в стеке при создании задачи. Я правильно понял?
Т.к. я делал переключение в отдельной подпрограмме, то у меня переключение происходило не при завершении обработчика, а внутри обработчика. Например, представь, что переключение на новую задачу происходит по таймеру, тогда содержимое стека прерванной задачи будет таким:
Код:
XXXX - содержимое стека на момент возникновения прерывания

EFLAGS
CS
EIP

XXXX - результат работы pusha
DS
ES

RRRR - адрес возобновления прерванной задачи (результат работы call SwitchToNext)
FS
GS
EFLAGS

В стеке новой задачи находится только кадр возобновления:
Код:
SSSS - стартовый адрес новой задачи
FS=0
GS=0
EFLAGS для новой задачи

Как видно, код обработчика, вызвавшего переключение на новую задачу, еще не завершился. Он будет завершен только тогда, когда управление будет возвращено прерванной задаче.


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

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

при выходе из SwitchToNext?


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

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


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

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


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

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


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

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