A CPU muda do modo de usuário para o modo kernel: o que exatamente ele faz? Como isso faz essa transição?

StackOverflow https://stackoverflow.com/questions/2479118

Pergunta

CPU Mudança do modo de usuário para o modo kernel: o que exatamente ele faz? Como isso faz essa transição?

EDITAR:

Mesmo se depende da arquitetura, forneça -me uma resposta. A arquitetura depende de você. Diga -me para a arquitetura que você conhece.

Quero ter uma idéia sobre o que todas as coisas estarão envolvidas.

Foi útil?

Solução

Nota: Isso é relevante para a arquitetura x86. Aqui está uma explicação um tanto simplificada.

A transição é geralmente causada por um dos seguintes:

  • Falha (por exemplo, uma falha de página ou outra exceção causada pela execução de uma instrução)
  • Interromper (por exemplo, uma interrupção do teclado ou acabamento de E/S)
  • Armadilha (por exemplo, uma chamada do sistema)

O que normalmente acontece é que o sistema verifica a tabela de descritores de interrupção (IDT). Cada exceção (interrupção, falha etc.) possui um número associado a ele que é usado para indexar nesta tabela.

A partir desta tabela, a CPU pode determinar o manipulador de interrupção a ser executado.

Como parte da transição, as seguintes mudanças (geralmente) entram em vigor:

  • Mudar para a pilha do kernel
  • EFLAGS são salvos
  • O seletor de segmento de código e o EIP são salvos.
  • Seletor de segmento de pilha e ponteiro de pilha são salvos
  • Comece a executar o manipulador de interrupção
  • Os registros de propósito geral são salvos (trabalho do manipulador)
  • Os seletores de segmento são alterados para os do kernel (trabalho do manipulador)

Agora você está no modo de kernel.

Espero que ajude :)

Outras dicas

Isso depende do sistema, mas o mecanismo usual é que alguma operação de terras do usuário causa uma interrupção de software. Essa interrupção faz com que o processador troca os modos e entre no código do kernel, que verifica o que o programa estava tentando fazer (o sistema chama?) E depois a ação solicitada e volta ao código do modo de usuário. Outros mecanismos além de uma interrupção de software também podem causar a transição; Por exemplo, em um sistema de multitarefa preventivo, uma interrupção do timer pode acionar o agendador a ser executado.

Meu entendimento é que qualquer programa cujo segmento registra os dois LSBs zero estará em execução no modo kernel, enquanto qualquer programa cujo segmento registra os dois LSBs = 1 estará sendo executado no modo de usuário. De fato, os dois LSBs do segmento Rgeisters definem o nível de privilégio (0 mais alto para 3 mais baixo)

Portanto, para fazer com que um Prgram execute no modo kernel, você deve configurar os registros do segmento como 0010 hexadecimal (acredito). Não tenho certeza de como você pode colocar um programa nesse espaço de memória sem substituir outra coisa - em outras palavras, como o vinculador garante isso? Além disso, se você deseja chamar o código do modo kernel do código do modo de usuário, deve descobrir como passar os parâmetros - eles não estão usando o mesmo SOACE de memória, portanto, não pode passar dados por referência de memória. Eu acho que você tem que passar por registros.

Se alguma coisa puder preencher as lacunas acima, eu ficaria muito grato.

No Windows, quando você cria uma calma, as rotinas da biblioteca chamam um ponto de entrada do kernel que reside no espaço de endereço do sistema operacional. Por sua vez, leva a CPU ao modo de supervisor, executando uma instrução específica para esse fim, como Sysenter. O que ele faz é essencialmente definir um pouco no registro dos sinalizadores. Isso permite que o sistema operacional use instruções privilegiadas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top