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.
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:
- Tratamento de interrupções e exceções - Responder a eventos de hardware e erros de software
- Gerenciamento de processos e threads - Criação, eliminação, sincronização e comunicação
- Escalonamento e controle - Determinar qual processo utiliza o processador e por quanto tempo
- Gerência de memória - Alocação e liberação de espaço na memória RAM
- Gerência do sistema de arquivos - Organização e acesso a dados armazenados
- Gerência de dispositivos de E/S - Comunicação com periféricos
- Suporte a redes - Protocolos e serviços de comunicação
- Contabilização do uso - Monitoramento de recursos utilizados
- 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.
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 operacionalls
: Lista conteúdos e diretóriosrm
: Remove algum arquivo, passando o parâmetro -r é possível remover um diretóriocat
: Concatena e imprime arquivos>
: Aponta a saída de um programa para outro dispositivo ou arquivo|
: Concatena um comando a outrotouch
: Altera a data de modificação de um arquivo
Windows (MS-DOS)
md
: Cria uma pastadel
: 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:
- POST (Power-On Self Test) - Testa a existência dos recursos mínimos para inicializar o sistema
- Boot Loader - Busca por um sistema operacional instalado em algum dispositivo
- Boot Sector - Contém informações iniciais para carregar o sistema operacional na memória
- Carregamento do Kernel - O núcleo do sistema é carregado na memória
- 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.