Когда создается поток, как определяется начальный контекст?

406
user179659

Как определяется начальный контекст потока (состояние регистров) при создании потока?

Например: текущий контекст потока eax = 0x4, ebx = 0x9000, ecx = 0xfff и т. Д. ... Создается поток, который начинается с 0xbfbfbf. Кажется очевидным, что eip потока будет установлен в 0xbfbfbf, но как насчет других регистров. Они скопированы из текущего потока? Они установлены на 0x00000000? Указатель стека одинаков? Я хочу знать, что происходит с начальным контекстом потока при создании потока. Я проверил книги по Google и ОС и не нашел того, что искал.

Кроме того, это тот же процесс в других ОС, в частности, в Linux и Windows?

1

1 ответ на вопрос

0
David Schwartz

Когда новый поток начинает выполняться, его регистры загружаются из его сохраненного контекста точно так же, как поток, который уже запущен. Поток, который создает поток, может заполнить контекстную структуру нового потока, как ему нравится, прежде чем добавить его в таблицу запущенных потоков операционной системы.

В основном это работает так:

  1. Новая структура задачи выделена.

  2. Поля в этой новой структуре задач заполняются, однако желательно. Это включает регистры, указатель стека и так далее.

  3. Структура задач помечена как готовая к выполнению и добавлена ​​в список задач планировщика.

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

  5. Теперь у потока есть все регистры, стек и указатель инструкций, заполненный для него потоком создания.

Похожие вопросы