-
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.)
-
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.
-
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).