Sistema Operacional para PCs e Dispositivos Móveis:
Projetando um Sistema Operacional para PCs e Dispositivos Móveis: Como Começar com um Setup Econômico
Criar um sistema operacional do zero é um dos projetos mais interessantes e desafiadores da computação. O desenvolvimento envolve programação de baixo nível, arquitetura de computadores, gerenciamento de memória, drivers, sistemas de arquivos, segurança e interfaces gráficas.
Embora pareça um trabalho reservado às grandes empresas de tecnologia, é perfeitamente possível criar um sistema operacional experimental ou educacional utilizando um computador comum, ferramentas gratuitas e emuladores.
O segredo está em começar pequeno.
Neste artigo, vamos apresentar um caminho prático para desenvolver um sistema operacional que possa evoluir para diferentes tipos de hardware, desde PCs antigos até computadores modernos e, posteriormente, dispositivos baseados em ARM.
1. Primeiro passo: definir o objetivo do sistema
Antes de começar a programar, é importante responder a uma pergunta:
O que esse sistema operacional deverá fazer?
Criar um SO completo, capaz de competir com Windows, Linux, Android ou macOS, é um projeto gigantesco. Para um desenvolvedor independente, o melhor caminho é dividir o projeto em etapas.
Sistema operacional educacional
Uma primeira versão pode ter apenas:
- Bootloader;
- Kernel;
- Gerenciamento básico de memória;
- Teclado;
- Tela;
- Shell;
- Sistema simples de arquivos;
- Escalonador de tarefas.
O objetivo não é substituir o Windows ou o Linux, mas entender como um sistema operacional funciona internamente.
2. Criar um sistema para computadores antigos
Outra possibilidade é desenvolver um sistema extremamente leve para computadores antigos.
Nesse caso, o objetivo seria reduzir:
- consumo de RAM;
- uso de CPU;
- quantidade de processos;
- espaço ocupado no armazenamento;
- tempo de inicialização.
Entretanto, existe uma diferença importante:
Criar um sistema do zero é muito mais trabalhoso do que criar uma distribuição Linux leve.
Se a intenção for simplesmente recuperar um computador antigo para uso cotidiano, uma distribuição Linux minimalista normalmente será uma escolha mais prática.
Projetos como antiX, Tiny Core Linux e outras distribuições leves podem servir como referência para estudar otimização de sistemas.
3. E quanto aos celulares?
Aqui existe um desafio adicional.
Um sistema operacional para PC não pode simplesmente ser instalado em qualquer celular.
Smartphones utilizam diferentes:
- processadores;
- bootloaders;
- controladores;
- telas;
- modems;
- GPUs;
- câmeras;
- sistemas de armazenamento;
- mecanismos de segurança.
Por isso, desenvolver um SO para smartphones exige inicialmente escolher um modelo específico de aparelho.
Uma estratégia muito mais realista é começar com uma placa de desenvolvimento ARM, um computador de placa única ou um dispositivo cuja documentação de hardware esteja disponível.
Depois que o kernel funcionar em uma plataforma, pode-se trabalhar na portabilidade para outras arquiteturas.
4. Escolhendo a arquitetura
As arquiteturas mais interessantes para um projeto desse tipo são:
x86/x86-64
É uma excelente opção para começar no mundo dos PCs.
Você poderá testar o sistema em:
- computadores antigos;
- computadores modernos;
- máquinas virtuais;
- QEMU;
- VirtualBox, dependendo do projeto.
Para um primeiro SO de hobby, x86 ou x86-64 é provavelmente o caminho mais simples.
ARM
ARM é extremamente importante em:
- smartphones;
- tablets;
- sistemas embarcados;
- Raspberry Pi;
- dispositivos IoT.
Porém, ARM não significa automaticamente compatibilidade entre todos os dispositivos. Cada plataforma pode exigir diferentes drivers e mecanismos de inicialização.
RISC-V
RISC-V é uma arquitetura aberta que vem ganhando espaço no desenvolvimento acadêmico, embarcado e experimental.
Ela é particularmente interessante para quem deseja estudar arquitetura de processadores e desenvolver sistemas de baixo nível.
5. Use QEMU antes de comprar hardware
Uma das melhores decisões para economizar dinheiro é utilizar um emulador.
O QEMU permite executar sistemas operacionais experimentais sem precisar instalar imediatamente o código em um computador físico.
Isso possibilita testar:
- bootloader;
- kernel;
- memória;
- interrupções;
- teclado;
- armazenamento;
- sistemas de arquivos;
- processos;
- drivers.
Assim, você pode fazer dezenas ou centenas de testes sem correr o risco de danificar o sistema operacional do computador principal.
6. O que você precisa para começar?
Um setup econômico pode ser bastante simples.
Hardware
Um computador relativamente comum já pode servir para desenvolvimento.
Não é necessário possuir uma máquina extremamente potente.
Por exemplo:
PC principal
- processador Intel ou AMD;
- 4 GB de RAM ou mais;
- SSD ou HD;
- Linux, Windows ou outro sistema compatível com as ferramentas utilizadas.
Computador antigo para testes
Pode ser utilizado posteriormente para testar compatibilidade com hardware real.
Placa ARM/RISC-V
Pode ser adicionada quando o projeto estiver mais avançado.
7. Ferramentas gratuitas
Grande parte do ambiente de desenvolvimento pode ser construída com software livre.
GCC
O GCC é um dos compiladores mais importantes para desenvolvimento de sistemas.
Em projetos de sistemas operacionais, normalmente utiliza-se um cross-compiler, permitindo gerar código para uma arquitetura diferente da máquina utilizada para desenvolvimento.
Binutils
As ferramentas GNU Binutils incluem programas importantes como:
- assembler;
- linker;
- objcopy;
- objdump.
Elas são fundamentais para trabalhar próximo ao hardware.
QEMU
É utilizado para executar e testar o sistema operacional virtualmente.
GDB
O GDB pode ajudar a investigar problemas no kernel, permitindo acompanhar a execução do código e analisar registradores e memória.
Make
O Make pode automatizar a compilação de diferentes partes do projeto.
8. Estrutura básica do sistema operacional
Um sistema operacional pode ser dividido em várias camadas.
Uma estrutura inicial poderia ser:
MEU SISTEMA OPERACIONAL
│
├── Bootloader
│
├── Kernel
│ ├── Gerenciamento de memória
│ ├── Processos
│ ├── Interrupções
│ └── Escalonador
│
├── Drivers
│ ├── Teclado
│ ├── Vídeo
│ ├── Disco
│ └── Rede
│
├── Sistema de arquivos
│
├── Shell
│
└── Interface gráfica
Essa organização permite desenvolver o projeto gradualmente.
9. Bootloader: o primeiro código executado
O bootloader é responsável por iniciar o processo de carregamento do sistema.
Simplificando:
BIOS/UEFI
↓
Bootloader
↓
Kernel
↓
Inicialização do hardware
↓
Sistema operacional
Em um projeto educacional, você pode começar criando um programa extremamente simples que inicialize e mostre uma mensagem na tela.
Por exemplo:
MEU SO
Inicializando...
Kernel carregado!
Parece simples, mas chegar até esse ponto já significa compreender uma parte importante do processo de inicialização de um computador.
10. Kernel: o coração do sistema
Depois do bootloader vem o kernel.
O kernel será responsável por tarefas fundamentais como:
- gerenciamento de memória;
- processos;
- interrupções;
- comunicação com hardware;
- controle de dispositivos;
- escalonamento;
- segurança;
- sistema de arquivos.
Uma combinação bastante utilizada em projetos educacionais é:
C + Assembly
O C facilita o desenvolvimento da maior parte do kernel, enquanto Assembly pode ser utilizado em determinadas operações específicas de baixo nível.
11. Criando o primeiro escalonador
Quando o sistema começa a executar várias tarefas, surge a necessidade de um scheduler, ou escalonador.
Uma estratégia simples para começar é o:
Round-robin
Imagine três tarefas:
Tarefa A
Tarefa B
Tarefa C
O sistema executa pequenos intervalos de cada uma:
A → B → C → A → B → C
Isso permite estudar os fundamentos da multitarefa.
Posteriormente, podem ser implementados algoritmos mais sofisticados.
12. Sistema de arquivos
Depois do kernel e dos processos, outro passo importante é criar suporte para armazenamento.
O sistema poderá evoluir para trabalhar com:
- arquivos;
- diretórios;
- permissões;
- dispositivos de armazenamento;
- leitura e gravação.
No começo, entretanto, não é necessário criar um sistema de arquivos completamente novo.
Para fins educacionais, pode-se começar com uma estrutura extremamente simples e posteriormente estudar formatos existentes.
13. Interface gráfica
Depois que o sistema funcionar em modo texto, chega o momento de criar uma interface gráfica.
Uma possível evolução seria:
Terminal
↓
Modo gráfico
↓
Janelas
↓
Mouse
↓
Gerenciador de janelas
↓
Aplicativos
Para computadores antigos, uma interface minimalista pode fazer uma grande diferença no consumo de recursos.
14. Projetos Open Source para estudar
Você não precisa aprender tudo sozinho.
Existem projetos excelentes para estudar arquitetura de sistemas operacionais.
ReactOS
É um projeto de código aberto que busca implementar um sistema operacional compatível com a arquitetura e APIs do Windows.
É interessante para estudar compatibilidade, drivers e componentes de um sistema operacional de desktop.
xv6
O xv6 é um sistema operacional educacional baseado em conceitos do Unix e é amplamente utilizado para ensinar fundamentos de sistemas operacionais.
É especialmente interessante para quem quer entender:
- processos;
- memória;
- chamadas de sistema;
- arquivos;
- interrupções.
Linux
O próprio kernel Linux é uma das maiores fontes de conhecimento disponíveis publicamente.
Entretanto, devido ao tamanho e à complexidade do projeto, ele não é necessariamente o melhor ponto de partida para quem está escrevendo o primeiro kernel.
15. Uma estratégia muito mais inteligente
Em vez de tentar criar tudo de uma vez, podemos estabelecer 100 etapas.
Por exemplo:
Fase 1 — Boot
- Bootloader
- Kernel
- Mensagem na tela
- Entrada pelo teclado
- Interrupções
Fase 2 — Kernel
- Gerenciamento de memória
- Heap
- Processos
- Scheduler
- Threads
Fase 3 — Hardware
- Teclado
- Mouse
- Vídeo
- Disco
- USB
Fase 4 — Sistema
- Sistema de arquivos
- Shell
- Usuários
- Permissões
- Aplicativos
Fase 5 — Interface
- Modo gráfico
- Janelas
- Mouse gráfico
- Menu
- Área de trabalho
E assim sucessivamente até chegar a uma versão muito mais completa.
16. O projeto pode ter dois objetivos
Uma ideia interessante seria criar um sistema operacional com duas versões.
MeuSO Lite
Voltado para computadores antigos.
Características:
- baixo consumo de RAM;
- interface simples;
- inicialização rápida;
- poucos serviços;
- aplicativos básicos.
MeuSO Desktop
Voltado para computadores modernos.
Características:
- interface gráfica;
- multitarefa;
- rede;
- navegador;
- gerenciamento de arquivos;
- suporte a aplicações.
A mesma base poderia evoluir de maneira modular.
17. E o custo?
A parte mais interessante é que o desenvolvimento inicial pode praticamente não exigir investimento em hardware.
Você pode começar utilizando:
| Recurso | Custo inicial |
|---|---|
| Linux/Windows | R$ 0, dependendo da licença |
| GCC | Gratuito |
| QEMU | Gratuito |
| GDB | Gratuito |
| Binutils | Gratuito |
| Git | Gratuito |
| Editor de código | Gratuito |
| Computador existente | R$ 0 |
| Hardware adicional | Opcional |
Ou seja, o maior investimento inicialmente será tempo de estudo e desenvolvimento.
18. É possível criar um SO para PC e celular?
Sim, mas é importante entender que portabilidade não significa que o mesmo código funcionará automaticamente em qualquer aparelho.
Uma arquitetura interessante seria:
MEU SO
│
Kernel Core
│
┌───────────┼───────────┐
│ │ │
x86 ARM RISC-V
│ │ │
PC Dispositivo Placa
móvel/ARM
O núcleo do sistema poderia compartilhar componentes, enquanto cada arquitetura teria sua própria camada de hardware.
Esse conceito é chamado de portabilidade e é fundamental em projetos que pretendem funcionar em diferentes plataformas.
19. O melhor primeiro projeto
Se você está começando agora, não tente criar imediatamente um sistema com navegador, Wi-Fi, Bluetooth, aplicativos e interface gráfica.
Comece com:
Bootloader
↓
Kernel
↓
Tela
↓
Teclado
↓
Memória
↓
Processos
↓
Sistema de arquivos
↓
Shell
↓
Interface gráfica
Quando essa estrutura estiver funcionando, o projeto poderá crescer.
Conclusão
Criar um sistema operacional próprio é um dos melhores projetos para quem deseja compreender profundamente como os computadores funcionam.
Você aprenderá conceitos de:
- programação em C;
- Assembly;
- arquitetura de computadores;
- memória;
- processadores;
- processos;
- threads;
- drivers;
- sistemas de arquivos;
- redes;
- segurança;
- interfaces gráficas.
E o melhor: é possível começar praticamente sem gastar dinheiro, utilizando ferramentas gratuitas, QEMU e o computador que você já possui.
A estratégia mais eficiente não é tentar criar um "novo Windows" imediatamente. É construir uma pequena base funcional e evoluir o projeto passo a passo.
Um kernel que simplesmente inicializa e escreve "Meu SO iniciado!" já é o começo de um verdadeiro sistema operacional.
🚀 Próximo passo
Sim. Vamos montar a primeira versão real do MeuSO, começando pelo caminho mais simples: x86 32-bit + GRUB + kernel em C + Assembly + QEMU.
A ideia é chegar a:
PC
↓
GRUB
↓
Bootloader
↓
Kernel MeuSO
↓
Tela: "MEUSO iniciado!"
↓
QEMU
1. Estrutura do projeto
Crie esta estrutura:
meuso/
├── boot/
│ └── boot.s
├── kernel/
│ └── kernel.c
├── linker.ld
├── grub.cfg
└── Makefile
2. Criar as pastas
No Linux/Ubuntu/Debian:
mkdir -p meuso/boot
mkdir -p meuso/kernel
cd meuso
3. Bootloader — boot/boot.s
Crie:
nano boot/boot.s
Coloque:
.set ALIGN, 1<<0
.set MEMINFO, 1<<1
.set FLAGS, ALIGN | MEMINFO
.set MAGIC, 0x1BADB002
.set CHECKSUM, -(MAGIC + FLAGS)
.section .multiboot
.align 4
.long MAGIC
.long FLAGS
.long CHECKSUM
.section .text
.global _start
.type _start, @function
_start:
mov $stack_top, %esp
call kernel_main
halt:
cli
hlt
jmp halt
.section .bss
.align 16
stack_bottom:
.skip 16384
stack_top:
Esse código prepara uma pequena pilha e chama o nosso kernel.
4. Kernel — kernel/kernel.c
Agora:
nano kernel/kernel.c
Coloque:
#include <stdint.h>
void kernel_main(void)
{
volatile uint16_t* video =
(uint16_t*)0xB8000;
const char* texto =
"MEUSO iniciado com sucesso!";
uint8_t cor = 0x0F;
for (int i = 0; texto[i] != '\0'; i++)
{
video[i] =
((uint16_t)cor << 8) |
texto[i];
}
while (1)
{
__asm__ volatile ("hlt");
}
}
Aqui temos nosso primeiro kernel.
Ele escreve diretamente na memória de vídeo VGA.
5. Linker
Crie:
nano linker.ld
Use:
ENTRY(_start)
SECTIONS
{
. = 1M;
.text :
{
*(.multiboot)
*(.text)
}
.rodata :
{
*(.rodata)
}
.data :
{
*(.data)
}
.bss :
{
*(COMMON)
*(.bss)
}
}
O linker informa como as diferentes partes do kernel devem ser organizadas na memória.
6. Configuração do GRUB
Crie:
mkdir -p iso/boot/grub
nano grub.cfg
Coloque:
menuentry "MeuSO" {
multiboot /boot/meuso.bin
boot
}
Agora copie:
cp grub.cfg iso/boot/grub/grub.cfg
7. Makefile
Crie:
nano Makefile
Use:
CC = i686-elf-gcc
AS = i686-elf-as
LD = i686-elf-gcc
CFLAGS = -m32 -ffreestanding -O2 -Wall -Wextra
LDFLAGS = -m32 -T linker.ld -ffreestanding -O2 -nostdlib
all: meuso.iso
boot.o:
$(AS) boot/boot.s -o boot.o
kernel.o:
$(CC) $(CFLAGS) -c kernel/kernel.c -o kernel.o
meuso.bin: boot.o kernel.o
$(LD) $(LDFLAGS) -o meuso.bin boot.o kernel.o -lgcc
meuso.iso: meuso.bin
mkdir -p iso/boot
cp meuso.bin iso/boot/meuso.bin
grub-mkrescue -o meuso.iso iso
run: meuso.iso
qemu-system-i386 -cdrom meuso.iso
clean:
rm -rf *.o *.bin *.iso iso/boot/meuso.bin
Importante: as linhas de comando do Makefile precisam começar com uma tabulação.
8. Instalar as ferramentas
Em Ubuntu/Debian:
sudo apt update
Depois:
sudo apt install build-essential qemu-system-x86 grub-pc-bin xorriso
Para compilar corretamente para x86 32-bit, também precisamos de um cross-compiler i686-elf-gcc.
Você pode verificar:
i686-elf-gcc --version
Se aparecer a versão do compilador, está pronto.
9. Compilar
Dentro da pasta:
cd meuso
Execute:
make
Se tudo estiver correto, será criado:
meuso.iso
A estrutura ficará aproximadamente:
meuso/
├── boot/
│ └── boot.s
├── kernel/
│ └── kernel.c
├── iso/
│ └── boot/
│ ├── grub/
│ │ └── grub.cfg
│ └── meuso.bin
├── boot.o
├── kernel.o
├── meuso.bin
├── meuso.iso
├── grub.cfg
├── linker.ld
└── Makefile
10. Executar no QEMU
Agora:
make run
O QEMU deverá abrir uma máquina virtual.
Você deverá ver:
MEUSO iniciado com sucesso!
🎉 Esse já é um sistema operacional inicializando de verdade.
11. Testar diretamente pelo QEMU
Também podemos executar:
qemu-system-i386 -cdrom meuso.iso
Para sair do QEMU:
Ctrl + Alt + G
e depois fechar a janela.
12. Próxima evolução do MeuSO
Agora começa a parte realmente interessante.
A versão 0.1 terá somente:
MeuSO 0.1
│
├── Bootloader
├── Kernel
└── Vídeo VGA
Podemos evoluir para:
MeuSO 0.2
├── Teclado
└── Shell
MeuSO 0.3
├── Gerenciamento de memória
└── Heap
MeuSO 0.4
├── Interrupções
└── Timer
MeuSO 0.5
├── Processos
└── Scheduler
MeuSO 0.6
├── Sistema de arquivos
└── HD
MeuSO 0.7
├── Mouse
└── Interface gráfica
MeuSO 0.8
├── Janelas
└── Desktop
MeuSO 0.9
├── Rede
└── Internet
MeuSO 1.0
├── Aplicativos
├── Interface gráfica
├── Arquivos
├── Rede
└── Segurança
Eu recomendo que o próximo passo seja o MeuSO 0.2: criar teclado + terminal (shell). Assim você poderá iniciar o sistema no QEMU e digitar comandos dentro do seu próprio sistema operacional, em vez de apenas mostrar uma mensagem na tela.

