Quando exatamente o context_switch () muda o controle para um novo processo?

1

Se eu entendi a troca de contexto corretamente, o processo envolve duas etapas principais:

  1. A MMU é comutada para uma que mapeia o espaço de memória virtual de novos processos para o espaço de memória física.
  2. O estado do processador é salvo para o processo atual e, em seguida, passa para o estado do processador salvo para o novo processo. Presumivelmente, isso inclui configurar o contador de programa para iniciar a execução de onde o processo comutado foi deixado pela última vez.

No kernel, a função que lida com tudo isso é chamada context_switch() ( código-fonte aqui ). Essa função manipula ambas as etapas necessárias, mas depois de definir o estado do processador, ela retorna.

Isso é confuso, porque parece que uma vez que o contador do programa é movido manualmente para um novo lugar, context_switch() não teria a oportunidade de retornar. A única explicação que posso apresentar é que context_switch() é o código que muda para um novo processo e o código para o qual os processos comutados retornam. Em outras palavras, todo processo acaba mudando de seu próprio context_switch() para outros processos ' context_switch() . Mas então não parece claro para mim como isso poderia funcionar em um processo recém-bifurcado. Então, talvez context_switch() seja executado até a conclusão e retorne, e então algo mais salta para a parte correta do processo de destino?

Este pensamento está correto? Em que ponto exatamente context_switch() passa de um processo para outro? Quando context_switch() retorna? Quando muda para um novo processo, onde no estado de execução do novo processo termina? Como isso se encaixa nos processos recém-bifurcados?

Passei os últimos dias lendo as partes relevantes do código-fonte do kernel para tentar descobrir isso, mas temo que não estou mais perto de entender. Espero que alguém aqui possa ajudar.

    
por Sardonic 29.11.2016 / 19:58

1 resposta

1

Observe o comentário na linha 2885 :

/* Here we just switch the register state and the stack. */

context_switch() não carrega o novo ponteiro de instrução (contador de programa) diretamente, ele alterna a pilha - e a pilha contém o endereço de retorno apropriado. Quando a função retorna, ela retorna para a nova tarefa.

Quando forking, o endereço de retorno virtual é o mesmo que em ambos os processos (pai e filho); a diferença é o valor de retorno.

    
por 29.11.2016 / 20:05