Executando verificação de segurança...
5

O que é necessário para construir um SO

Suponhamos que eu queira desenvolver um SO baseado em linux ( ou uma distro), no entanto, não tenho nem de longe o conhecimento necessário para fazê-lo - Sendo assim, o que eu precisaria ter para desenvolver um SO padrão, com ambiente gráfico e etc?

Carregando publicação patrocinada...
2

Criar uma distribuição Linux é extraordinariamente mais fácil que desenvolver um SO. Você falou como se estivesse no mesmo patamar, mas é tipo a diferença entre desenhar um boneco stick e pintar a Monalisa.

Para criar uma distro, você só precisa de:

  • Compilar o kernel;
  • Montar um initrd filesystem (ex.: usando BusyBox);
  • Montar um root filesystem (você pode usar debootstrap se quiser fazer uma distro Debian-based).

Sim, o cerne é só isso. O resto é detalhe, como escolher o bootloader (você vai escolher GRUB2), buildar ISO de instalação etc.

Para fazer um protótipo de distro, é papo de 1 dia. Um protótipo de SO vai levar semanas ou meses (dependendo do seu nível de conhecimento atual).

Você pode consultar o Linux From Scratch que ele ensina a fazer esse tipo de coisa. Eu não li, mas é um material bastante recomendado nas comunidades: https://www.linuxfromscratch.org/


Agora se você quiser aprender a desenvolver um SO mesmo (e não uma distro Linux), aí é outros 500 porque você vai ter que desenvolver o kernel.

Minha sugestão é começar estudando a parte teórica em livros como "Operating Systems: Three Easy Pieces" (é gratuito): https://pages.cs.wisc.edu/~remzi/OSTEP/

Você vai ter que aprender assembly também. Eu escrevi um livro gratuito sobre isso: https://mentebinaria.gitbook.io/assembly

Se não souber, aprenda C também. Curso gratuito: https://www.mentebinaria.com.br/cursos/programa%C3%A7%C3%A3o-moderna-em-c/

Tendo a base teórica sobre SO e tendo aprendido assembly e C, você já está preparado para começar seu projeto.

Para aprender a desenvolver um bootloader, leia a spec do UEFI: https://uefi.org/specifications

Para aprender a implementar as partes low level do kernel que dependem da arquitetura, você pode ler o manual da arquitetura. Por exemplo, os manuais da Intel: https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html

Inclusive o manual da Intel tem um volume exclusivamente para falar de implementação de sistema operacional (volume 3: System Programming Guide).

Se quiser que seu SO suporte mais arquiteturas, você vai ter que ler o manual para cada uma delas. Normalmente a galera começa desenvolvendo para uma arquitetura só, porque é mais fácil.

Outra questão são os drivers. Cada hardware que você quiser implementar um driver, você vai ter que ler o manual do hardware para saber como ele se comunica.

E uma dica de material bem conhecido: https://wiki.osdev.org/Expanded_Main_Page

Ah, e se quiser que seu kernel seja UNIX-Like, você tem que seguir o padrão POSIX.


Acho que a dica mais importante que eu posso lhe dar, é aprender com quem já fez antes. Existem vários kernels open source, vários drivers open source, vários bootloaders open source etc. Um monte de gente já fez o que você quer fazer. Leia o código deles e aprenda com eles.

Minha recomendação é ler o código fonte do FreeBSD e não do Linux. Sério, evita o código fonte do Linux... Você vai me agradecer depois. e.e

1

Opa, ótima resposta! Os caminhos apresentados são quase os mesmos que usei, eu comecei meu projeto através do livro "The Little OS Book", mas chega em uma certa parte que as informações tem de ser procuradas nos materiais que você apresentou.

Caso o autor queira um código fonte fácil de ler para ser estudado, tem o meu hobby OS:
https://github.com/AfonsoDolmen/CoffeaOS

Dá uma olhada lá!

2

Resumidamente, ter capacidade de achar as informações necessárias.

Sei que parece estranho uma resposta assim, mas é isso, desenvolver um OS é algo extremamente complicado e exige uma quantidade enorme de conhecimento variado que permite atingir o objetivo. Não só isso, precisa ter uma capacidade pessoal de juntar tudo isso, preencher as lacunas, de pesquisar em cima de cada dificuldade. Entende que a pergunta mostra que a pessoa está muito distante de fazer isso. Quem consegue fazer, não pergunta, só acha as informações, é uma questão de atitude.

Claro que a pessoa poderá ir melhorando e em determinado momento estar capacitado fazer algo minimamente viável.

Dá para usar IA para achar as informações necessárias? Claro que dá, mas a IA entregará informações erradas, ou pior, ruins. As ruins são piores porque funciona, mas não está certo. Se você não é capaz de entender oque é útil e o que não é, então tem que ficar longe da IA.

Claro que existem lugares com toda a informação básica que precisa (não as específicas) e pode ajudar muito, mas ainda não é a solução mágica que alguns querem. Pode ser até que a pessoa se vire bem, mas ela tem que ter uma boa noção de como criar softwares, sem depender de receitas de bolo.

De uma certa forma podemos dizer que precisará de muita ajuda. A não ser que queira fazer um OS bem básico, tem uma quantidade absurda de código a criar, o que pode dedicar sua vida toda e não terá um resultado bom.

Querer fazer algo baseado no Linux, no meu entendimento do que está falando, não é bem fazer um OS, é modificar o Linux ou criar uma distribuição, é outra coisa bem diferente.

Só o kernel do Linux está caminhando para ter 50 milhões de linha de código C, um pouco de Assembly para vários processadores e cada vez mais código Rust. São cerca de 200 mil linhas de código novo por mês (fora o que é apagado ou modificado). Você deve levar anos só para ler uma vez todo o código.

Para fazer uma distribuição Linux, pode ser um pouco mais fácil, mas é bem trabalhoso. Claro que não tanto quanto fazer um OS com todas as ferramentas em volta, mas é algo que quase ninguém faz, especialmente sozinho.

Hoje é possível fazer um OS quase com qualquer linguagem de programação, mas em muitos casos terão limitações e ineficiências. Para um resultado melhor, além de pelo menos um mínimo de Assembly, precisa de uma linguagem que foi criada para uso em nível mais baixo, como C, C++, Rust, Zig ou Carbon quando estiver pronta. E não pode usar a biblioteca padrão, a não ser algo feito só para criação do que chamamos de bare metal.

Quase sempre você preferirá rodar seu OS, se ele for nativo, em um emulador (virtual machine). Criar drivers para uma máquina real é bem mais complicado, fora que pode ter que criar uma variedade muito grande. EM alguns casos é quase impossível. O pessoal do Linux, em grande quantidade de pessoas, não conseguiu criar um driver decente para as placas da Nvidia. Hoje a Nvidia tem um driver pra Linux, mas parece que ele não é tão bom quanto para outras plataformas e não é fácil sequer colocar em uma distribuição.

Se o OS tiver multiprocessamento preemptivo a dificuldade aumenta muito. Tentar ter algo próximo das funcionalidades de um OS popular (na verdade bem menos, só o principal) se prepare para um trabalho para a vida toda. Algo que funcione só o básico é mais viável. Se tentar manter compatibilidade com algo existente, como por exemplo aceitar executáveis do Linux no seu OS, é trabalho para muitas pessoas.

Só de buscar por "OSDev" terá várias sugestões de sites interessantes, talvez indicação de livros (ou tem nos sites). Não acho que é o caso de eu ficar listando aqui, tem listas mais bem curadas do que eu faria. Provavelmente não aparecerá este que é relevante: http://www.osdever.net/.

E se não for um gênio precisa ter bem mais que 12 anos :D

S2


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui).

1

Comentário muito lúcido, só algumas correções para não confundir o amigo: perguntar é essencial na cultura OSDev!

Muitos programadores, como o próprio Linus, leu e até pegou trechos de código fonte do MINIX (OS do Tenenbaum). Um ótimo lugar para encontrar respostas (principalmente iniciante) é o subreddit /osdev. Lá, a comunidade é extremamente ativa e sempre disposta a orientar iniciantes.

Também outro ponto interessante: IA ajuda mas até certa parte. Por exemplo, estruturar a GDT e criar um ponteiro em assembly para carregar toda essa estrutura na memória, você terá de ler o manual Intel. São detalhes que somente se encontra lá, pois cada único bit nessa estrutura que você construirá, importa. Se um bit estiver em um lugar errado, o sistema simplesmente crasha ou reinicia sem nenhum feedback (famoso triple fault)...

Dito isso, é isso kkk.

2

Perguntar com foco, não algo tão genérico. Esse é um dos erros que as pessoas cometiam no Stack Overflow e depois reclamavam.

Começar o Linux em 1990 é bem diferente de começar qualquer coisa hoje.

o subreddit /osdev

Que aparece na primeira página quando se procura pelo assunto, conforme eu indiquei.

2

Primeiro temos que separar "Desenvolver um SO" de "Criar uma distro".

Para desenvolver um SO completo você precisa criar código na mão em baixo nível, term um conhecimento ABSURDO de drivers, de como o sistema operacional funciona por baixo dos panos, controlar cpu, memória, outros dispositivos manualmente. É um trabalho colossal.

Para criar uma distro você consegue basicamente juntando um monte de blocos que já existem e configurar para tudo funcionar certinho. Você precisa juntar o kernel, ambiente gráfico, programas básico e configurar para que eles se entendam é "muito mais fácil".

1

Todos os comentários aqui cobrem todos os fundamentos para começar kkk, mas aqui vai mais uma dica extra:

Comece com uma base (ou não)

Desenvolver um SO é massante e você vai sofrer, pois não há dependências externas, não há stdlibs, então mire baixo. Primeiro, use um bootloader pronto (ou desenvolva o seu, a dor de cabeça é maior rsrs), ele já vai te ajudar a focar diretamente no Kernel.

Mire baixo

Não comece desenvolvendo já pensando em GUI, filesystem, drivers para teclado, mouse e etc. Vá aos poucos.

Primeiro foque em inicializar a pilha do Kernel em Assembly (importante para código C). Funcionou? Estude, entenda e pergunte a IA o porquê disso e como funciona internamente.

Crie drivers simples, como VGA para output de texto e aos poucos, vá escalando. Foque primeiro em algo pequeno para escalar mais tarde, é assim que nasce um SO.

Dica extra para DEBUG

O driver mais importante é o serial, pois você irá utilizar ele para debugar seu sistema. O VGA não é totalmente confiável, já o serial consegue enviar informações de logs para seu terminal (hospedeiro) antes mesmo do seu sistema crashar. Acredite em mim, isso é muito útil ksks.

[edit]
Use ferramentas como gdb para verificar os estados de registradores e flags importantes durante a execução. E objdump para analisar o binário do seu kernel.

É isso! Mantenha os estudos, foque e você vai chegar longe.

1

Meus 2 cents,

Os demais comentaristas (@pilati, @maniero, @andresousa) foram bem completos em suas respostas - entao vou pegar um caminho diferente.

Imaginando que voce apenas quer um Linux para chamar de seu, voce pode criar sua "distribuicao" (inclusive vem dai o tempo "distro", muito usado para referenciar um Linux).

Explicando um pouco: o que costumamos chamar de "Linux" eh a juncao do kernel + programas externos que compoe o ecossistema (p.ex. ambiente grafico eh um programa externo que pode ou nao estar presente em uma distribuicao Linux).

Entao, a "distribuicao" nada mais eh que um nome que damos para reconhecer uma determinada escolha de programas que vao ser "enviados" (distribuidos) juntos como o kernel do Linux (simplilficando, kernel aqui eh o nucleo principal que conversa com o hardware e com os drivers e que permite o uso de perifericos).

Qual o procedimento: voce escolhe uma versao do kernel, qual o sistema de "empacotamento" (como os programas serao instalados) e quais o programas desejados por padrao - e presto ! - nasceu sua "distribuicao".

Logico que eh um pouco mais complexo que isso - mas nao eh nada do outro mundo, ate eh razoavelmente simples de aprender.

Se voce esta interessado nisso, um site que recomendo eh o "LFS - Linux from strach" que ensina passo-a-passo como construir sua distribuicao do zero.

Nada impede que voce crie uma distribuicao derivada, p.ex. o Linux MINT eh baseado/derivado do UBUNTU que por sua vez eh baseado/derivado do DEBIAN.

Um outro site interessante para conhecer distribuicoes eh o DISTROWATCH.

E por fim, existem distribuicoes que sao bem faceis de serem customizadas (p.ex. Arch e Geento).

Agora, se o objetivo for escovar bits e criar um S.O. do zero, da uma acompanhada neste post: Estou desenvolvendo meu próprio OS e troque uma figurinhas com o autor.

Nao esqueca de continuar compartilhando sua trilha nesta jornada.

Saude e Sucesso !


Este post foi favoritado via extensão TABNEWS FAVORITOS

Tem curiosidade sobre IA ? Da uma olhada no meu LIVRO: IA PARA ENGENHEIROS

1

Se tratando de conhecimento, talvez pode ajudar tentar instalar e configurar algumas distros mais manuais, como Arch (sem archinstall) e Gentoo, quando tiver mais confiança dá pra tentar até o Linux from Scratch que é um projeto basicamente educativo devido à complexidade

Mas dependendo da "distro" que quiser fazer algum conhecimento de gerenciamento de pacote já ajuda, além das particularidades de cada distro "mãe" (Debian, Arch etc)