Tenho um projeto de SO, que inicialmente estava sendo escrito em linguagem C. Comecei a encontrar problemas ao tentar programar genericamente (utilizando macros em C), e também na confecção de drivers (usando struct’s e ponteiros de funções). Resolvi então tentar utilizar uma linguagem OO (C++ no caso, afinal não dá pra fazer SO em Java ou C#, principalmente pela falta de ponteiros).
Em mts situações, OO facilita bastante a vida, como no caso dos drivers (usando interfaces). O grande problema tá sendo como modelar o código (usando padrões de projetos). Em linguagens ou ambientes onde tudo está pronto e configurado (gerenciador de memória, garbage collector, sistemas E/S), usar padrões de projetos “em tese” é algo factível, o problema é fazer isso onde não há nada, nem mesmo uma função pra dar “Hello World” na tela.
Aqui está o X da questão…
Como vou imprimir dados na tela, se não há sistema de E/S? Como vou alocar memória com new, sendo q nem gerenciador de memória há?
Não estou me referindo à como implementar isso (eu tenho conhecimento de como desenvolver sistemas de E/S, o gerenciador de memória, criação e escalonamento de threads e processos, etc). Qual seria o “melhor jeito”, ou o “mais elegente” de implementar isso em OO?
Outra questão é com relação à programação genérica. Cada processador implementa um conjunto de recursos, então um código que funciona em processadores x86_64 não vai funcionar em processadores x86. O mesmo pra outras platformas, como SPARC e ARM.
Eu quero deixar bem claro, não espero q ninguém escreva código Assembly ou entenda de arquitetura de SO’s, longe disso, somente como eu poderia modelar algo do gênero. O kernel é basicamente constituído de:
Kernel
—+ Gerenciador de Boot
—+ E/S de Vídeo
—+ Gerenciador de memória
------+ Memória virtual
------+ Heap do kernel
—+ Gerenciador de Interrupções e Exceções
—+ Escalonador de processos e threads
—+ Rotinas de sincronização
—+ Gerenciador de módulos (drivers) e aplicações
NESSE caso, qual seria o melhor padrão para utilizar?
- Inicialmente pela ausência de um gerenciador de memória:
- Variáveis globais somente e DI?
- Singletons estáticos globais?
- Com relação à código genérico / dependente de plataforma:
- Criar uma interface, e implementar uma classe para cada plataforma?
- Criar uma classe base abstrata, deixar os métodos dependentes de plataforma como abstratos e usar herança?
- Criar um container para armazenar os objetos?
- Criar uma classe Registry para armazenar as instâncias dos objetos (lembrando q eu preciso ter acesso global aos objetos criados)?
Já pensei em algumas coisas, mas gostaria de sugestões de outros desenvolvedores.
Desde já obrigado.