O que impede um programa de montagem de travar o sistema operacional? [fechadas]

17

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:

  1. É possível mexer no registro A da maneira descrita acima?

  2. Caso contrário, o que impede os programas de montagem de modificar os registros usados ​​pelo sistema operacional?

Fluxo
fonte
13
programadores inteligentes ...
Tony Stewart Sunnyskyguy EE75
Existem muitas arquiteturas de computadores agora e existiam no passado, assim como muitos sistemas operacionais foram desenvolvidos. Qual arquitetura / SO você está se referindo exatamente? Em algumas arquiteturas (antigas), não havia possibilidade de interromper o programa do que estava fazendo após o início, isso está correto. Porém, o hardware / sistema operacional moderno incorporou ferramentas de hardware que fornecem apenas a parte da memória do programa no modo "normal" (não superusuário) e não pode acessar a memória fora desse limite. Os registros são gratuitos, pois o SO não armazena nenhuma informação útil nos registros, apenas na memória / no disco.
cyclone125 11/03
2
Em um microprocessador, seu programa é executado no "modo de usuário", os sistemas operacionais são executados no "modo de sistema". Se um programa no modo usuário executasse uma instrução de parada, por exemplo, a máquina não pararia. A parada seria bloqueada e o sistema operacional invocado. Em relação à RAM, o sistema operacional irá criar um ambiente para o programa de modo de usuário para que, através de hardware de gerenciamento de memória, o que o programa usuário vê como endereço de RAM X não seria realmente RAM endereço X.
George White
1
@flux Atualizei meu comentário. A resposta seria: não há resposta "geral" para sua pergunta, pois existem / houve diferentes arquiteturas / sistemas operacionais de computador. Pode ser de diferentes maneiras.
cyclone125 11/03
2
... Há muito tempo, eu escrevia código de máquina bruto. Yee ha !!! :-)
Russell McMahon

Respostas:

32

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.

Dave Tweed
fonte
2
Se bem entendi, o que você está dizendo é: Alguns processadores têm "modo de usuário" e "modo de supervisor". O sistema operacional é executado no "modo supervisor" e coloca o processador no "modo usuário" para executar o meu programa de montagem fictício. No "modo de usuário", há registros e endereços de RAM que o programa de montagem não pode acessar devido ao design deliberado do hardware.
Flux
3
Basicamente, esta resposta descreve arquiteturas modernas "do tipo i386" com MMU e modo protegido. Mas, para ser verdade, existem muitas arquiteturas antigas (i8080, MOS 6502 etc.) e modernas mais simples (AVR, ARM Cortex-M etc.) que não possuem esses recursos e se algum tipo de sistema operacional é usado (por exemplo, antigo CP / M, FreeRTOS modernos, ChibiOS etc.) nada pode impedir o programa do que está fazendo.
cyclone125 11/03
2
@Flux As arquiteturas i386 (e acima) fornecem detalhes para aprender. A arquitetura x86 não possui apenas endereços de memória que podem ser protegidos, mas também endereços de E / S. (Existem instruções diferentes usadas para acesso à memória versus acesso de E / S.) Existem três endereços de memória no i386 +. O endereço segmentado / baseado em seletor usa um registro seletor que faz referência a uma entrada de tabela (GDT ou LDT) para mapear o par em um único endereço linear de 32 bits. As tabelas de paginação convertem o endereço linear de 32 bits em um endereço físico de 36 bits (P-II). A proteção existe nas duas etapas de conversão.
jonk 11/03
4
@flux seu resumo está correto. Um programa em um sistema de memória protegido com um sistema operacional multitarefa adequado não poderá travar o sistema com nenhum fluxo de instruções. Mesmo os inválidos - acabam em um manipulador especial.
pjc50 11/03
Embora existam vários anéis (pelo menos em x86), é muito, muito raro que mais de dois sejam realmente usados.
forest
10

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:

  1. Os dados de estado do processo A (conteúdo do registro, contador de programa etc.) são copiados para o PCB.

  2. Os dados de estado do processo B são copiados do PCB para os registros da CPU

  3. O processo B é executado no processador até que ele termine ou seja antecipado

  4. Os dados de estado do processo B são copiados de volta para o PCB

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

jtst
fonte
4

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:

  1. Um processador que realmente possui hardware de proteção (ou seja, pode ser configurado para se recusar a executar determinadas instruções).

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

MathematicsOrchid
fonte
1

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:

  with open("myFile.txt", "w+") as f:
      # do some really clever things
      f.write("Goodbye cruel world!")

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,

Paul Smith
fonte