Entendendo os Modos de Acesso do Sistema Operacional

O sistema operacional é dividido em dois modos básicos, sendo estes o modo Kernel e o modo Usuário. Esta divisão permite que os aplicativos sejam executados com segurança.

Kernel - imagem do wikipedia

Arquitetura em Camadas do Sistema Operacional

Em uma divisão de camadas do sistema em auto-nível seria uma sequência como:

  • Usuário - Camada superior onde o usuário interage com o sistema
  • Aplicativo - Programas e software que o usuário utiliza
  • Kernel - Núcleo do sistema operacional que gerencia recursos
  • Hardware - Componentes físicos do computador

Modos de acesso

Os modos de acesso referem-se aos privilégios de execução de um processo, determinando quais operações podem ser realizadas por cada tipo de software.

Modo Usuário

O processador entende um conjunto de instruções. Cada instrução pode ficar no modo Kernel ou no modo Usuário. Do lado do aplicativo, é possível apenas trabalhar com o conjunto de instruções que está do modo usuário.

No modo usuário:

  • Os processos têm acesso limitado aos recursos do sistema
  • Não podem acessar diretamente o hardware
  • Precisam solicitar ao kernel quando necessitam executar operações privilegiadas
  • Não podem modificar configurações críticas do sistema

Modo Kernel

O modo Kernel é composto pelo modo usuário e também por outro conjunto de comandos que são restritos apenas ao uso interno. Os processos, quando são executados, consultam o Kernel e verificam se o comando pertence ao modo usuário e não tem privilégios, comparado a um estagiário.

No modo Kernel:

  • Acesso completo aos recursos do hardware
  • Capacidade de executar qualquer instrução do processador
  • Controle total sobre o sistema operacional
  • Gerenciamento direto da memória e dispositivos

A linguagem de programação Assembly é a linguagem que interpreta uma série de comandos e envia os comandos para o processador, sendo frequentemente usada para implementar partes do kernel.

As rotinas do sistema operacional podem fazer chamadas a respeito de x comandos.

Veja como é a definição do kernel do linux.

Funções do Núcleo do Sistema Operacional

O núcleo do sistema operacional (kernel) é responsável por diversas funções essenciais:

  1. Tratamento de interrupções e exceções - Responder a eventos de hardware e erros de software
  2. Gerenciamento de processos e threads - Criação, eliminação, sincronização e comunicação
  3. Escalonamento e controle - Determinar qual processo utiliza o processador e por quanto tempo
  4. Gerência de memória - Alocação e liberação de espaço na memória RAM
  5. Gerência do sistema de arquivos - Organização e acesso a dados armazenados
  6. Gerência de dispositivos de E/S - Comunicação com periféricos
  7. Suporte a redes - Protocolos e serviços de comunicação
  8. Contabilização do uso - Monitoramento de recursos utilizados
  9. Auditoria e segurança - Proteção contra acessos não autorizados

Instruções Privilegiadas e Não Privilegiadas

O que são e como funcionam?

O processador se comunica com o sistema operacional através de funções, que podem ser executadas basicamente em dois modos: kernel e usuário.

O modo kernel é conhecido como privilegiado por ter acesso completo ao computador, a todas as partes do hardware. Já o modo usuário, que limita as ações para garantir a segurança e não comprometer nenhuma parte do próprio sistema. Neste modo, é mais difícil de um aplicativo violar a privacidade de outro.

Este mecanismo garante que nenhuma parte da memória será violada por outro aplicativo.

Como se faz uso deste mecanismo?

O processador executa todas as operações em modo kernel, mas para isso, é necessário que as rotinas enviadas em modo usuário sejam carregadas e validadas e consideradas seguras. Se algum dos passos falhar, o sistema envia uma exceção e nega a execução da operação.

Por exemplo, se desejo salvar um arquivo, uso uma linguagem de alto-nível como Java, Ruby e mando salvar, o sistema, em modo usuário tenta salvar, se o arquivo comprometer a integridade do SO de alguma forma, então o sistema lançará uma exceção, e não permitirá a alteração. A linguagem que programou esta execução também receberá uma exceção mapeada para linguagem, que é resultado da exceção lançada pelo modo kernel.

Desta forma, foi enviado um comando do modo usuário, passado para o kernel, o qual se recusa a executar, e responde para a linguagem que deve tratar o erro.

As chamadas ao sistema são chamadas de “system calls” ou seja, chamada ao sistema.

System Calls: A Ponte Entre Usuário e Kernel

System call é uma chamada do sistema, como sua própria tradução indica. Em uma chamada ao sistema, o sistema operacional recebe um comando e possíveis parâmetros. Como resposta, recebe um outro código, que pode indicar sucesso, falha ou até mesmo o resultado do próprio comando.

No processo de receber o comando, o sistema identifica o aplicativo que fez a chamada e verifica a sua permissão para execução do comando. Dada a permissão executa e retorna o resultado.

System Calls Diagram

Proteção do Kernel

O kernel do sistema operacional pode ser protegido pelos mecanismos e modos de acesso através do modo usuário. Neste modo, todos os comandos não privilegiados podem ser executados. Todos os aplicativos são executados no modo usuário, e enviam as instruções para o modo kernel que avaliam a segurança e garantia da execução protegida de cada “system call”.

Esta forma de chamadas identifica se o aplicativo possui permissão para executar o comando.

Instruções Privilegiadas

Por que as rotinas do sistema operacional possuem instruções privilegiadas?

Como é o sistema operacional que controla tudo, apenas ele tem o poder de dizer o que está certo ou errado. Assim ele mesmo é responsável por qualquer situação de risco para o hardware ou software. Usar o modo kernel, o sistema pode administrar a memória de forma transparente, e também deve saber a hora de cada evento acontecer. No modo kernel, ações delicadas são realizadas e é seguro ao máximo para não falhar.

Para gerenciar uma memória, liberar o espaço de memória utilizado por um aplicativo, não deve ser uma tarefa realizada pela programação do programador, mas sim pela observação do sistema operacional. Operações deste tipo, são delicadas e devem ser executadas com segurança. Para evitar erros e intenções maliciosas, apenas o sistema operacional consegue fazer isso, e só realmente faz se estiver seguro.

Exemplos de instruções que devem ser executadas apenas no modo kernel:

  • Desabilitar todas as interrupções
  • Alterar a data e hora do sistema
  • Realizar um desvio para uma instrução dentro do programa e acessar diretamente posições do disco

Comandos em Sistemas Operacionais

Unix/Linux

  • ps: Lista processos do sistema operacional
  • ls: Lista conteúdos e diretórios
  • rm: Remove algum arquivo, passando o parâmetro -r é possível remover um diretório
  • cat: Concatena e imprime arquivos
  • >: Aponta a saída de um programa para outro dispositivo ou arquivo
  • |: Concatena um comando a outro
  • touch: Altera a data de modificação de um arquivo

Windows (MS-DOS)

  • md: Cria uma pasta
  • del: Remove algum arquivo

Comandos interativos

Os comandos interativos são eficientes e auxiliam muito no desenvolvimento de software. A interface de comandos com o Linux é muito mais fácil e compreensível que o cmd default do Windows. Para estudar e conhecer mais os comandos no Linux, existe um comando chamado “man” que abre o manual de um determinado comando. Por exemplo: “man ls” vai abrir a especificação do funcionamento do comando “ls”.

Processo de Inicialização do Sistema Operacional

Quando o computador é ligado, não existe nada na memória, então o primeiro programa a ser chamado é chamado boot, que fica gravado na memória ROM.

O processo de inicialização segue estas etapas:

  1. POST (Power-On Self Test) - Testa a existência dos recursos mínimos para inicializar o sistema
  2. Boot Loader - Busca por um sistema operacional instalado em algum dispositivo
  3. Boot Sector - Contém informações iniciais para carregar o sistema operacional na memória
  4. Carregamento do Kernel - O núcleo do sistema é carregado na memória
  5. Inicialização de Serviços - Carregamento de drivers e processos essenciais

Arquiteturas de Sistemas Operacionais

Arquitetura Monolítica vs. Arquitetura em Camadas

A arquitetura monolítica é composta por módulos que se comunicam livremente, enquanto a arquitetura em camadas classifica as funções em níveis hierárquicos.

Vantagens da Arquitetura Monolítica:

  • Desempenho geralmente superior
  • Comunicação direta entre componentes
  • Implementação mais simples

Desvantagens da Arquitetura Monolítica:

  • Difícil manutenção à medida que o sistema cresce
  • Menor isolamento entre componentes
  • Falhas podem comprometer todo o sistema

Vantagens da Arquitetura em Camadas:

  • Melhor organização do código
  • Isolamento de funções
  • Facilidade de manutenção e evolução
  • Maior segurança por hierarquia de privilégios

Desvantagens da Arquitetura em Camadas:

  • Possível redução de desempenho
  • Maior complexidade de implementação
  • Potencial overhead na comunicação entre camadas

Em 1968 foi programado o primeiro sistema operacional em camadas implementando este conceito. Como vantagem, este sistema consegue isolar as funções do sistema operacional e cria uma hierarquia dos modos de acesso, aumentando a segurança.

Máquinas Virtuais

Uma das grandes inovações na arquitetura de sistemas operacionais é o conceito de máquinas virtuais.

Vantagens do modelo de máquina virtual:

  • Permite executar instruções sobre um computador virtual, sem prejudicar o hardware real
  • Isolamento entre diferentes sistemas operacionais
  • Melhor aproveitamento de recursos de hardware
  • Facilidade para testes e desenvolvimento
  • Recuperação rápida de falhas

Modelo Cliente-Servidor (Microkernel)

O modelo cliente-servidor na arquitetura micro-kernel funciona com um núcleo mínimo, onde a maioria dos serviços são implementados como processos servidores.

Vantagens:

  • Maior modularidade
  • Facilidade de extensão
  • Melhor isolamento de falhas
  • Maior segurança

Desvantagens:

  • Potencial overhead na comunicação entre cliente e servidor
  • Problemas com acesso a certas partes diretas do hardware
  • Possível redução de desempenho em algumas operações

Programação Orientada a Objetos em Sistemas Operacionais

A programação orientada a objetos (OOP) é considerada um caminho natural para o projeto de sistemas operacionais devido às suas características e benefícios. Embora nem todos os sistemas operacionais modernos sejam projetados inteiramente com base na OOP, muitos incorporam alguns de seus princípios.

Razões para usar OOP em Sistemas Operacionais:

  • Modularidade: A OOP permite projetar sistemas complexos de maneira modular, dividindo-os em componentes menores e mais gerenciáveis, chamados de objetos.

  • Abstração: Permite a criação de abstrações em diferentes níveis, o que ajuda a simplificar a complexidade do sistema operacional.

  • Encapsulamento: Agrupa dados e comportamentos relacionados em um único objeto, protegendo a integridade dos dados.

  • Herança: Facilita a reutilização de código e a criação de hierarquias de classes.

  • Polimorfismo: Permite que objetos de diferentes classes sejam tratados como objetos de uma classe comum.

  • Reutilização de código: Reduz a quantidade de código duplicado e melhora a eficiência do desenvolvimento.

Considerações Finais

A compreensão dos modos de acesso do sistema operacional é fundamental para entender como os sistemas modernos funcionam. A divisão entre modo kernel e modo usuário permite que o sistema operacional mantenha sua integridade enquanto oferece flexibilidade aos aplicativos.

Através dos mecanismos de proteção, system calls e arquiteturas adequadas, os sistemas operacionais conseguem equilibrar desempenho, segurança e usabilidade, permitindo que usuários executem suas tarefas sem comprometer a estabilidade do sistema.

Jônatas Davi Paganini

Jônatas Davi Paganini

Developer and writer passionate about PostgreSQL, TimescaleDB, and building better systems. Currently sharing knowledge about time series databases and system architecture.