Это зависит от платформы, обычно основано на некотором регистре процессора. Если память обслуживает меня правильно, обычно на x86 с нормальным соглашением о вызовах, это что-то вроде [ebp + 4]
. Но, как вы могли бы сказать, это сильно зависит от процессора и соглашения о вызовах. Например, в PowerPC он хранится в чем-то, называемом «регистром ссылок» ... Подобные вещи можно получить с помощью встроенного asm.
Имейте в виду, что вам придется восстанавливать стек там, где он был также ... Реализация потоков в пространстве пользователя (или ядра в этом отношении) обычно будет хранить указатель стека для каждого контекста, и когда придет время для переключения контекста вы можете сделать что-то вроде инструкции x86 pushad
(сохранить все регистры в стеке), поменять местами указатели стека и восстановить любое другое нужное вам состояние. Затем вы делаете что-то вроде popad
и возвращаетесь туда, где вы были раньше. (возможно с инструкцией ret
; в подпрограмме прерывания это будет iretd
)
Но обратите внимание, что в интерфейсе, подобном pthread_create()
, то, что вы называете "главным потоком", довольно неявно ... Эта подпрограмма создает новый поток и говорит ему начать с какой-то конкретной подпрограммы, а парень возвращается из этого это "основная тема" в вашем случае. Вы можете обнаружить, что эта модель немного меньше головной боли, чем подпрограмма создания потока, явно вставляющая что-то с <eip, esp>
(инструкция возврата ptr, стек ptr) в некоторый список потоков ...