Primeiro de tudo, eu sou iniciante, portanto, se essa pergunta parecer boba, aponte as suposições incorretas.
Pelo que entendi, o trabalho de um sistema operacional é gerenciar o hardware e o software que é executado no sistema operacional. Além disso, pelo que entendi, os programas de montagem permitem controlar o hardware quase diretamente. Em um programa de montagem, pode-se ler e gravar dados em registradores e ler e gravar dados em RAM.
Dada essa liberdade de mexer com registros e RAM, não seria possível que os programas de montagem afetassem o sistema operacional? Suponha que um sistema operacional esteja usando o registro A para armazenar informações cruciais e que eu execute um programa montado nesse sistema operacional. Se o programa gravar com sucesso o lixo eletrônico no registro A, o sistema operacional será certamente afetado.
Questões:
É possível mexer no registro A da maneira descrita acima?
Caso contrário, o que impede os programas de montagem de modificar os registros usados pelo sistema operacional?
fonte
Respostas:
No final, todos os programas são código de máquina, independentemente de o idioma de origem ser o assembler ou um idioma de alto nível.
O importante é que existem mecanismos de hardware que limitam o que um determinado processo pode fazer, incluindo registros "bagunçados" que podem afetar outros programas ou o próprio sistema operacional.
Isso começou com uma distinção simples entre os modos de operação "usuário" e "supervisor" e, desde então, evoluiu para uma arquitetura de segurança com vários "anéis" de privilégio.
Aqui está um exemplo muito genérico para torná-lo um pouco mais concreto:
No "modo de usuário", um processo não pode acessar a memória que não foi atribuída ao seu ID do processo. A memória atribuída a outros processos e o próprio sistema operacional está bloqueado. Isso inclui os valores dos registros usados por esses outros processos. Isso é imposto pelo hardware da MMU.
Portanto, no "modo de usuário", um processo não pode acessar os registros de controle da MMU.
E, obviamente, no "modo de usuário", um processo não pode mudar o modo para "modo de supervisor", exceto por meio de um mecanismo muito bem definido que envolve a chamada de uma função do sistema operacional.
O sistema operacional obtém o controle se o processo tentar quebrar alguma dessas regras. Quando isso acontece, o sistema operacional pode simplesmente interromper o processo ofensivo, nunca executando mais nenhuma das suas instruções.
fonte
Muitos sistemas operacionais multitarefa usam uma estrutura de dados chamada PCB ( Process Control Block ) para cuidar do problema de substituição do registro. Quando você executa seu código, o sistema operacional cria um novo processo para acompanhá-lo. O PCB contém informações sobre seu processo e espaço alocado para armazenar o conteúdo do registro. Digamos que o processo A esteja em execução no processador e seu código esteja no processo B. O que acontece quando você executa o código é algo como isto:
Os dados de estado do processo A (conteúdo do registro, contador de programa etc.) são copiados para o PCB.
Os dados de estado do processo B são copiados do PCB para os registros da CPU
O processo B é executado no processador até que ele termine ou seja antecipado
Os dados de estado do processo B são copiados de volta para o PCB
Os dados de estado do processo A são copiados de volta para a CPU e continuam em execução
Se o sistema operacional estiver executando como processo A, você poderá ver como salvar seus registros antes da execução do programa e copiá-los de volta para a CPU assim que o programa terminar, impedindo que os programas do usuário mexam no que está acontecendo em outros processos.
Para evitar que os processos do usuário gravem dados do SO na memória, a maioria das plataformas usa segmentação de memória. Basicamente, usando memória virtual, o espaço de endereço que um processo vê pode ser mapeado para qualquer intervalo arbitrário de endereços físicos. Desde que os espaços de memória física dos processos não se sobreponham, é impossível que um processo substitua os dados de outro.
Obviamente, sistemas operacionais diferentes fazem as coisas de maneira diferente, portanto, isso não se aplica a todos os casos. Além disso, na maioria das plataformas, os processos do SO são executados em um modo diferente dos processos do usuário e existem alguns meandros.
fonte
Depende da plataforma que você está falando.
Em um processador mais básico, o processador apenas executa as instruções que o programa diz para executar.
Em um processador mais sofisticado, existem (pelo menos) dois modos. Em um modo, o processador faz o que o programa pede. No outro modo, o próprio processador se recusa a executar determinadas instruções.
O que impede um programa de travar todo o sistema? Com o primeiro tipo de processador, a resposta é "nada". Com um processador básico, um único programa não autorizado pode de fato travar todo o sistema. Todos os primeiros computadores domésticos de 8 bits, e muitos dos de 16 bits, se enquadram nessa categoria.
Em um PC moderno, o processador possui hardware de "proteção". Basicamente, o sistema operacional é executado em um modo especial que permite fazer qualquer coisa, enquanto os programas normais são executados em um modo em que o processador permite apenas determinadas ações (com base nas configurações que o sistema operacional definiu no processador). Coisas como acessar apenas determinados registradores ou acessar somente intervalos de memória específicos.
Obviamente, é ruim permitir que um único programa invasor travar todo o sistema. (Também existem implicações graves de segurança ao permitir que um programa não autorizado acesse os dados que deseja.) Para evitar isso, você precisa de duas coisas:
Um processador que realmente possui hardware de proteção (ou seja, pode ser configurado para se recusar a executar determinadas instruções).
Um sistema operacional que realmente usa essas instalações para se proteger. (Não é bom ter um chip com circuito de proteção se o sistema operacional nunca o usar!)
Praticamente qualquer sistema operacional de desktop moderno que você pode nomear (Windows, Linux, Mac OS, BSD ...) é um sistema operacional em modo protegido, executado em um processador com hardware de proteção. Se você está desenvolvendo o desenvolvimento incorporado em algum microcontrolador de 8 bits, provavelmente não possui nenhum hardware de proteção. (Ou qualquer sistema operacional, para esse assunto ...)
fonte
P. O que impede um programa de montagem de travar o sistema operacional?
A. Nada.
No entanto, muitos programadores muito inteligentes tentaram muito ao longo dos anos para torná-lo cada vez mais difícil. Infelizmente, para todo programador inteligente, existem muitos outros que, entre eles, são mais criativos, mais ambiciosos e, às vezes, mais sortudos que os inteligentes. Toda vez que um programador inteligente diz que ninguém deve, faria ou poderia fazer algo, alguém por aí encontrará uma maneira de fazê-lo. O Microsoft Windows (por exemplo) existe há quase 35 anos e ainda temos o BSoD (Blue Screens of Death), que são apenas instruções que causaram um travamento no sistema operacional.
Vamos começar com um pouco de terminologia. Tudo o que é executado em um computador faz isso em código de máquina. O bit que lê as teclas pressionadas ou o movimento do ponteiro do mouse, o bit que muda a cor de um pixel na tela ou lê um byte de um arquivo e o bit que calcula se sua bala atinge o bandido ou o que decide se o seu pedido de cartão de crédito for aceito, todos serão executados como uma sequência de instruções do código da máquina. Alguns trabalhos são tão comuns e são realizados com tanta frequência que faz sentido reunir as instruções necessárias para fazê-los e fazer com que todos usem esse conjunto. O conjunto desses trabalhos que permitem ou ajudam outras pessoas a usar o computador costumam ser chamados de sistema operacional, mas não há nada inerentemente diferente entre eles e outros programas. São apenas sequências de instruções de código de máquina.
O que torna os sistemas operacionais mais complicados (e, portanto, propensos a travamentos) é que eles precisam dar conta de coisas nas quais você normalmente não precisa pensar. Tome o mais simples dos trabalhos como exemplo. Quero escrever uma mensagem no final de um arquivo. Em um idioma de alto nível, você escreveria algo como:
Vamos ignorar todos os detalhes sobre como os estados físicos são acessados e alterados, ou como são interpretados como bits e bytes, ou como esses bytes são transferidos para e da memória e da CPU, e confiar que tudo o que é tratado pelos programas que o sistema operacional fornece Por trás das cenas. Vamos pensar sobre como você anexa ao final de um arquivo. 1) Descubra onde está o final do arquivo, 2) escreva algo nessa posição. O que poderia dar errado? Na verdade, bastante. Pense no que mais está acontecendo no computador enquanto você faz coisas inteligentes. Se qualquer outra coisa que estiver sendo feita por outra pessoa (incluindo o próprio sistema operacional) alterar o arquivo em que você está trabalhando de alguma forma, esse trabalho realmente simples de repente se torna muito mais complicado. O arquivo é mais longo, o arquivo é mais curto. O arquivo não está mais lá. O disco está cheio,
fonte