Interfaces de troca de contexto

Eu quero aprender e preencher lacunas no meu conhecimento com a ajuda desta questão.

Então, um usuário está executando um thread (nível de kernel) e agora chamayield (uma chamada de sistema eu presumo). O planejador agora deve salvar o contexto do thread atual no TCB (que é armazenado no kernel em algum lugar) e escolher outro thread para executar e carregar seu contexto e pular para seuCS:EIP. Para restringir as coisas, estou trabalhando no Linux rodando em cima da arquitetura x86. Agora quero entrar nos detalhes:

Então, primeiro temos uma chamada de sistema:

1) A função de invólucro parayield irá empurrar os argumentos da chamada do sistema para a pilha. Empurre o endereço de retorno e eleve uma interrupção com o número de chamada do sistema pressionado em algum registrador (digamosEAX).

2) A interrupção muda o modo de CPU do usuário para o kernel e pula para a tabela de vetores de interrupção e daí para a chamada real do sistema no kernel.

3) Eu acho que o agendador é chamado agora e agora deve salvar o estado atual no TCB. Aqui está meu dilema. Desde então, o agendador usará a pilha do kernel e não a pilha de usuários para executar sua operação (o que significaSS eSP precisa ser alterado) como ele armazena o estado do usuário sem modificar nenhum registro no processo. Eu li em fóruns que existem instruções especiais de hardware para salvar o estado, mas como o programador obtém acesso a elas e quem executa essas instruções e quando?

4) O planejador agora armazena o estado no TCB e carrega outro TCB.

5) Quando o agendador executa o thread original, o controle retorna à função wrapper, que limpa a pilha e o thread continua.

Perguntas secundárias: O planejador é executado como um encadeamento somente do kernel (ou seja, um encadeamento que pode executar somente o código do kernel)? Existe uma pilha de kernel separada para cada encadeamento de kernel ou cada processo?

questionAnswers(3)

yourAnswerToTheQuestion