Я пытаюсь понять переключение контекста потока. Сейчас у меня есть абстракция: один поток будет вызывать yield()
, который абстрагируется как:
yield() {
new_thread = schedular.next_thread()
switch(cur_thread, new_thread)
house_keeping()
}
И switch(cur_thread, new_thread)
:
switch(cur_thread, new_thread) {
store all registers into cur_TCB
load TCB of new_thread
ret
}
Он говорит, что все регистры, включая %rip
будет сохранено. Но если я правильно понимаю, после выполнения ret
in switch
, return address
в новом стеке будет вставлено в %rip
.
Итак, мои вопросы: не означает ли это, что сохраненная %rip
для new_thread вообще не используется? (Потому что адрес возврата загружается в него немедленно) Почему нам все еще нужно сохранять% rip во время переключения контекста?