Mudando do modo Kernel para o modo Usuário (e vice-versa)

8

Estou lendo o livro de sistemas operacionais da Galvin. Galvin explica, o que são modos de kernel e usuário, privilégios de instrução dados para ambos os modos e também sobre o modo bit. Mas estou interessado em saber como o modo muda de um para outro. Basicamente, quero resolver a seguinte pergunta:

Uma CPU possui 2 modos, privilegiados e não privilegiados. Para alterar o modo de pré-previlegiado para não pré-previlegiado

a) É necessária uma interrupção de hardware

b) É necessária uma interrupção do software.

c) É necessária uma instrução privilegiada.

d) É necessária uma instrução não privilegiada.

Pelo que entendi,

do modo de usuário para o modo de kernel - a interrupção de hardware é necessária [como em E / S de disco]. Agora, se o programa do usuário se cansar de acessar uma memória que está além do seu alcance permitido, ocorre uma armadilha, que é basicamente uma interrupção do software que será gerenciada pelo sistema operacional. Agora, no modo de usuário, não podemos executar nenhuma instrução privilegiada. Portanto, uma instrução não privilegiada, como solicitação de E / S, pode mudar o usuário para o modo kernel. Então eu acho que mudar

de não privilegiado (usuário) para privilegiado (kernel) - Interrupção H / W, Interrupção S / W e instruções sem privilégio.

Agora, vamos ao kernel para o modo de usuário. O sistema operacional pode mudar o kernel para o modo de usuário. Portanto, ele simplesmente executará uma instrução privilegiada para mudar do kernel para o modo de usuário. Ele não precisa gerar interrupção H / w ou S / w. Então eu concluo, para mudar

de previlegado para não previlegiado - uma instrução privilegiada servirá.

Estou certo ?

Além disso, ao executar no modo kernel, todas as interrupções serão desativadas, certo? Portanto, a resposta não pode ser (a) ou (b). Além disso, como o sistema operacional é basicamente um software, ele não pode gerar interrupções H / W.

Além disso, como o próprio sistema operacional lida com interrupções, não faz sentido para mim porque é necessário gerar uma interrupção (e repará-la) para mudar do kernel para o modo de usuário.

Informe-me se estiver errado em algum lugar. Qualquer ajuda sobre isso é apreciada.

avi
fonte

Respostas:

7

Modo de usuário para modo de kernel: Errado! ;-) Sim, as interrupções são processadas no modo kernel, e originalmente a maneira de entrar no modo kernel era por uma interrupção forçada de alguma forma pelo software. No DEC 2020, havia um conjunto de UIOs (Opcodes de Instruções Não Implementados), chamando qualquer um deles que causou uma armadilha no sistema operacional. Eles incluíam instruções de ponto flutuante (se não estiverem no hardware) e outras instruções exóticas, mas também os meios para fazer chamadas do sistema operacional. A família i? 86 possui a intinstrução (interrupção), tradicionalmente usada como você diz. Os membros mais novos da família têm SYSTENT para fazer chamadas de supervisor com mais eficiência. Os meios de ir para o modo supervisor não podem ser privilegiados, mas devem, de alguma forma, ser rigidamente controlados pelo kernel (onde você entra no kernel, quais argumentos você passa ...).

Kernelmode para usermode: Não é necessário que a operação "drop privilégios" seja privilegiada. Se você não tiver privilégios, removê-los não é uma opção. Mas o mecanismo exato é extremamente dependente da arquitetura.

Interrupções desabilitadas no kernel: As interrupções indicam alguma condição que deve ser tratada o mais rápido possível (por exemplo, se os dados recebidos pela rede não forem salvos no cartão antes da chegada do próximo, eles serão substituídos). Assim, as interrupções raramente são desativadas. Nos sistemas Unix originais (e contemporâneos), havia uma CPU, e a maneira mais simples de obter uma região crítica ("ninguém mexe com meus dados enquanto eu os modifico") era apenas para desativar as interrupções. Foram feitos esforços para manter os trechos "interrompidos desativados" o mais curto possível por causa do exposto acima. Nas máquinas com várias CPUs atuais, desabilitar interrupções em uma CPU não faz muito nessa direção; desabilitar interrupções globalmente é extremamente caro na coordenação entre CPUs, por isso não é feito (ou extremamente raramente).

vonbrand
fonte
"Não é necessário que a operação" remover privilégios "seja privilegiada". Então, você quer dizer que, para mudar do modo Kernel para Usuário, uma instrução não privilegiada servirá. Se for uma instrução não privilegiada, mesmo um usuário pode executá-la e mudar do kernel para o modo de usuário? Ou interpretei errado?
avi
Sim, um "usuário normal" simplesmente não pode entrar no modo kernel. Além disso, a remoção de privilégios não pode causar nenhum dano, portanto, não precisa ser privilegiada (por si só). Se fazer isso em alguma máquina significa, por exemplo, registros privilegiados de vibração, ele será privilegiado lá. Mas não precisa ser privilegiado.
vonbrand
Eu não estou acertando. O seu comentário e resposta anteriores se contradizem. No comentário que você disse, 'um "usuário normal" simplesmente não pode entrar no modo kernel', mas em resposta, você mencionou '"Não há necessidade de a operação" privilégios de queda "ser privilegiada"'. O que estou perdendo? : S Para dizer simplesmente, para mudar o Kernel para o modo Usuário, o bit de modo deve ser alterado. O que não pode ser feito no modo de usuário, certo? Portanto, não pode ser uma instrução não privilegiada.
avi
Porra, eu também não entendi por que o modo de usuário para o modo kernel errado? Na sua explicação, nas primeiras linhas que você mencionou o modo usuário para kernel pode ser feito através das instruções INT e, por fim, você mencionou: 'Os meios de acessar o modo supervisor não podem ser privilegiados'. Isso não é tudo que eu mencionei? Interrupção H / W (o que é óbvio, por exemplo, solicitações de E / S), interrupção S / W (instrução INT) e instrução não privilegiada.
avi
Isso pode ser feito com uma interrupção, mas existem outras possibilidades. Não pode ser privilegiado (se fosse, nenhum usuário poderia fazê-lo ;-).
precisa saber é o seguinte