EN Voltar

Motivação

A maioria dos projetos de desenvolvimento em sistemas operacionais para aprendizado são baseados em UNIX. A ideia é seguir um caminho diferente e explorar novas perspectivas.

A arquitetura escolhida para essa iteração do projeto foi a x86 (32 bits), pelas razões a seguir:

Vou utilizar adiante os termos "SO" ou "sistema" para "sistema operacional".

Principais objetivos

Nessa primeira iteração, temos como principais objetivos:

  1. Entender como iteragir com hardware
  2. Entender como é estruturado um SO
  3. Testar a linguagem Oberon em desenvolvimento de baixo nível
  4. Testar como o compilador Oberon funciona usando componentes escritos em diferentes linguagens (C e Assembly)

Parte das funcionalidades implementadas está incompleta. A implementação focou apenas em testar diferentes aspectos e técnicas.


Arquitetura x86

Boot

O kernel é compilado com suporte a Multiboot, assim é possível utilizar um bootloader como o Grub.

A implementação usa uma parte escrita em Assembly (boot.asm)

Grub

Execução

O sistema usa uma combinação de interrupções, corrotinas e troca de mensagens para executar as diferentes tarefas:

  1. Desenhar a interface do usuário
  2. Mover o ponteiro do mouse
  3. Processar entradas do teclado
  4. Receber/enviar dados via porta serial

FrugalOS

Interrupções

A arquitetura x86 utiliza uma tabela de interrupções onde é registrada uma função que será invocada quando uma interrupção acontecer. Em "interrupts.asm" essa tabela é populada e todas as chamadas são redirecionadas para a função kernelInterruptHandler, implementadas em "Kernel.ob07".

Troca de mensagens

Cada tarefa pode fazer uma subscrição para uma determinada interrupção. Assim, quando essa interrupção acontecer, a tarefa receberá uma mensagem na sua "caixa de entrada". As mensagens são dispachadas por uma tarefa principal.

Tarefas e Corrotinas

O sistema tem uma tarefa principal que fica executando um loop e aguardando por mensagens recebidas. Essas mensagens são enviadas quando interrupções de temporizador, teclado e mouse acontecem.

A cada mensagem recebida o loop verifica que tipo é essa mensagem e executa a ação correspondente:

  1. KBD_MESSAGE: processa entradas de teclado.
  2. MOUSE_MESSAGE: processa entrada e movimento do mouse.
  3. TICK_MESSAGE: processa eventos do temporizador. Alterna entre as corrotinas responsáveis por desenhar a tela e por atualizar a posição do mouse.

Lições aprendidadas


Download

Os arquivos do projeto podem ser baixados aqui.

No documento README.md na raiz do pacote podem ser encontradas instruções de como compilar e executar o SO.


Referências

  1. Multiboot specification
  2. pcboot
  3. Grub bootable disk
  4. ODDev Demo
  5. Baremetal examples