Quando saltamos para o kernel parte de nossa memória virtual de processo, diferente de quando usamos chamadas do sistema? (No Linux)

2

Esta é uma pergunta de acompanhamento do meu anterior pergunta .

Com base na resposta, uma chamada de sistema é um exemplo de quando passamos para a parte do kernel da memória virtual do nosso processo.

  1. Quais são os outros exemplos de um processo normal (não kernel) usando essa parte da memória virtual diferente das chamadas do sistema? como existe alguma chamada de função que salta diretamente para esta parte do kernel ou ..?

  2. Quando entramos nessa seção da memória, o processador automaticamente define o bit do kernel como 1 para que o processo acesse essa parte ou não é necessário definir esse bit?

  3. Toda a execução dentro desta parte do kernel acontece sem qualquer necessidade de mudança de contexto para um processo de kernel?

(Eu não queria fazer essas perguntas de acompanhamento nos comentários, então eu abri outro tópico.)

    
por John P 07.10.2018 / 19:25

2 respostas

2
  1. Os processos em execução no modo de usuário não têm acesso ao espaço de endereço do kernel. Existem várias maneiras de o processador mudar para o modo kernel e executar o código do kernel, mas elas são todas configuradas pelo kernel e ocorrem em contextos bem definidos: para executar uma chamada de sistema, para responder a uma interrupção ou para lidar com uma falha. As chamadas do sistema não envolvem a ligação direta ao código do kernel; eles envolvem um mecanismo específico da arquitetura para solicitar que a CPU transfira o controle para o kernel, para executar uma chamada de sistema específica, identificada por seu número, em nome do processo de chamada. O LWN tem uma série de artigos explicando como isso funciona: Anatomia de uma chamada de sistema primeira parte , < a href="https://lwn.net/Articles/604515/"> parte dois e conteúdo adicional .

    Se um processo tentar acessar a memória no espaço de endereço do kernel, ele mudará para o modo kernel, mas como resultado de uma falha; o kernel irá então matar o processo com uma violação de segmentação ( SIGSEGV ).

    Em x86 de 32 bits, existe um mecanismo para alternar para o modo kernel usando chamadas distantes, chamar portões ; mas o Linux não usa isso. (E eles confiam em descritores de segmento de código especiais em vez de chamar endereços de núcleo.)

  2. Veja acima: você não pode entrar na memória do kernel. Nas circunstâncias descritas acima, ao fazer a transição para o modo kernel, a CPU verifica se a transição é permitida e, em caso afirmativo, alterna para o modo kernel usando qualquer mecanismo apropriado à arquitetura que está sendo usada. No x86 Linux, isso significa mudar do anel 3 para o anel 0.

  3. A transição para o modo kernel não envolve uma mudança de processo, então, sim, tudo isso acontece sem uma alternância de contexto (contada pelo kernel).

por 08.10.2018 / 10:14
0

1 & 2. Não, um programa do usuário não pode simplesmente usar uma instrução de salto para entrar na memória do kernel. Não é permitido fazer isso. A CPU não define automaticamente o "bit do kernel" para permitir que tal salto tenha sucesso ... (talvez alguma CPU tenha tal recurso, mas uma porta Linux segura desativaria esse recurso)

... Na verdade, como você está acessando uma página de uma maneira que você não tem permissão para fazer, você entra no kernel :-). Ele entra de forma controlada, funciona de forma muito semelhante a uma chamada de sistema, mas chamamos isso de "falha de página". A CPU fornecerá detalhes do acesso ao kernel. Com o tipo de acesso que você descreve, o kernel irá tratá-lo como um erro em seu programa :-). Ele enviará um sinal fatal ao seu programa (SIGSEGV).

    
por 08.10.2018 / 00:42