[blog] Kernels monolíticos e microkernels

«in my proudy opinion, as an architecat, we should put a middleware under the application layer»

Sistema operativo e kernel

Antes, uma ligeira digressão: onde termina o sistema operativo e começa o kernel? Conceituá-lo como o núcleo do SO fatalmente amarra esta diferenciação ao sistema. Eu diria quem nem todo kernel é um sistema operativo, mas todo sistema operativo tem um kernel. Devido à hardware-dependência, a discussão sobre a estrutura do SO/kernel não pode ser desvinculada do hardware em que este sistema está implantado. Do ponto de vista do programador da aplicação, um SO provê uma forma de acessar o hardware (abstração), além dos mecanismos para gerenciar recursos que as aplicações demandam.

Para microprocessadores mais simples, as possíveis escolhas arquiteturais podem (e muitas vezes devem) fazer uma diferenciação entre kernel/SO e aplicação. Entretanto se na prática não houver diferenciação entre usuário e supervisor, o sistema todo é um único objeto, e a vantagem advinda desta diferenciação é majoritariamente do ponto de vista de modelagem, manutenção e reuso do software.

Durante o desenvolvimento de um sistema desta natureza, se o programador desejar, a aplicação pode acessar recursos do hardware sem passar pelo sistema operacional, como ilustra a Figura 1. Aliás, o mais simples bare-metal é conceitualmente um sistema operativo.

Figura 1. Sistema operativo baseado em bibliotecas [1]

Em microprocessadores mais complexos, nos quais existe separação entre espaço de supervisor e usuário o acesso ao hardware pela aplicação pode ser limitado por um mecanismo supervisor. Para acessar o hardware as threads da aplicação precisam executar system calls: pedir acesso aos recursos de sistema.

Na Figura 2 (a), o sistema operativo é dito “monolítico” porque é um objeto à parte, entretanto existe ainda uma simbiose entre aplicação e sistema operativo. Perceba que esta simbiose já não ocorre entre aplicação e hardware.

Figura 2. Sistemas operativos (a) monolítico (b) em camadas [1]

Na Figura 2 (b), o SO em camadas é uma arquitetura padrão para sistemas de uso mais generalista, atingido através da definição de camadas de software com o menor acoplamento possível. O layer logo abaixo da camada de aplicação poderia ser um AAL (Application Abstraction Layer), por exemplo. Também, a camada logo acima do hardware poderia ser um BSP (Board Support Package). As representações na Figura 2 entretanto, não dizem nada sobre o kernel.

Kernel Monolítico e Microkernel

Em linhas gerais, dois modelos de kernel constam na literatura: monolítico e microkernel. A diferença crucial entre ambos está no volume de recursos do sistema que correm no espaço do supervisor e no espaço do usuário.

A Figura 3 ilustra conceitualmente as duas abordagens. No microkernel um conjunto menor de abstrações corre em kernel space. Assim, programas de sistema, como o sistema de arquivos, device drivers, etc., estarão também no domínio de usuário e operam como servidores. No domínio do kernel ficam os módulos mais essenciais, o escalonador e a comunicação inter-processos, por exemplo. A função primordial do microkernel é gerenciar recursos, e em menor parte abstrair o hardware. A modularidade é um ponto forte da arquitetura, normalmente descrita como um conjunto de layers com baixo acoplamento, no modelo cliente-servidor.

Figura 3. Kernel Monolítico vs Microkernel [2]

O kernel monolítico por sua vez concentra todos os serviços em uma única unidade de compilação, e somente a aplicação estará a correr no espaço de usuário. Neste tipo de sistema o kernel além de um gerenciador de recursos é também uma extensão da máquina (“extended machine”), porque abstrai completamente o hardware para o usuário.

Kernel + SO

Na Figura 4 uma ilustração conceitual famosa do GNU/Linux (Linus Torvalds é um grande defensor dos monolíticos). As bibliotecas (glibc) e as aplicações estão em user space. No kernel space existe uma parte que é “universal” para todos os Linuxes, e outra que depende da plataforma em hardware.

Figura 4. GNU/Linux [4]

Ainda em domínios de aplicação mais generalistas, o Minix do Prof. Tanembaum é um microkernel raíz. Os layers bem definidos correm a maior parte do sistema no espaço de usuário. Uma alegada vantagem deste tipo de arquitetura é que caso o driver de um dispositivo entre em deadlock, o kernel pode resetar o sistema. Em um sistema com kernel monolítico isto não seria possível porque o sistema estaria trancado já em modo supervisor. Os microkernels são entretanto conhecidos por serem mais lentos – em sistemas de uso generalista, principalmente – além de adicionarem complexidade à comunicação inter-processos, que pode ser eventualmente explorada por código malicioso.

Figura 5. Minix 3 [5]

Outros flavours para microkernel são possíveis. Na Figura 6a, o SO monolítico significa que todos os servidores estão concentrados em um único programa, e as aplicações utilizam-se de clientes para acessar estes serviços concentrados. Na Figura 6b, os servidores estão distribuídos modularmente. Na Figura 6c., uma aplicação especializada (dedicada) interage diretamente com o microkernel, sem um SO propriamente dito.

Figura 6. Sistemas com microkernel: a) SO monolítico com Microkernel b) SO distribuído com microkernel c) Sistema monolítico com microkernel [3]

[1] RANKL, Wolfgang. Smart Card Handbook. 2010

[2] KEN, Yu. RTOS Model and Simulation using System C. 2010

[3] HERDER, Jorrit. Torwards a true Microkernel Operating System. 2005

[4] Anatomy of the Linux kernel – IBM Developer

[5] https://upload.wikimedia.org/wikipedia/commons/7/7d/The_MINIX_3_Microkernel_Architecture.png

Author: Antonio Giacomelli de Oliveira

Engenheiro Eletrônico

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s