Quais seriam os conhecimentos necessários pra criar um sistema operacional?

Sempre tive a curiosidade em saber o que é necessário para criar um sistema operacional do zero, sem se basear em alguma base, como o linux, gostaria de saber o que seria necessário entender e estudar para tal.

Todo conteúdo aqui muito bom, e acho que vai gostar da Wiki de OS Dev. Não a use como um provedor de receita de bolo. Se tem uma coisa que não dá para fazer assim é sistema operacional. E mesmo que fizesse, pra que?

Ainda:

Espero ter ajudado.


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

Acho que o principal conselho está na página "[*Beginner Mistakes*](https://wiki.osdev.org/Beginner_Mistakes)": > *No one who isn't already a seasoned developer with years of experience in several languages and environments should even be considering OS Dev yet. A decade of programming, including a few years of low-level coding in assembly language and/or a systems language such as C, is pretty much the minimum necessary to even understand the topic well enough to work in it.* Em tradução livre: > Qualquer um que não seja um desenvolvedor com anos de experiência em várias linguagens e ambientes não deve ser considerado um desenvolvedor de Sistemas Operacionais. Uma década de programação, incluindo alguns anos escrevendo código de baixo nível em Assembly e/ou uma linguagem de sistemas como C, é o mínimo necessário para começar a entender do assunto o suficiente para trabalhar nele. Pois é, isso é o pré-requisito básico. Depois ainda tem essa ["pequena" lista de coisas](https://wiki.osdev.org/Required_Knowledge) (sendo que cada item é um mundo à parte). Como pode ver, não é uma tarefa simples.
Isso é bem legal :) Mas nesse conselho, e na lista que você destacou aqui tem uma falha. Ela é boa e mostra coisas importantes, mas são coisas um pouco avançadas sob certo ponto de vista. Antes de tudo isso precisa de algo mais básico ainda, e eles consideraram que nem precisava falar, até porque eles imaginam que as pessoas chegam lá pelo Google.
desenvolvimento de sistemas operacionais é realmente complexo, então quanto mais informações de referência melhor. Alem disso posso citar: [jubalh/awersome-os](https://github.com/jubalh/awesome-os) [dreamos82/Osdev-Notes](https://github.com/dreamos82/Osdev-Notes) Alem do livro do minix

1 – Conhecer a História dos Sistemas Operacionais

Pesquisar a fundo a história dos sistemas seria o primeiro passo para você criar um novo sistema operacional, você pesquisar a história dos sistemas operacionais existentes e a história dos computadores em geral.

Você pode começar estudando a história da criação do Linux. Eu tenho um vídeo falando sobre isso.

E eu recomendo que você conheça também a história da criação do Unix que eu também tenho um vídeo falando sobre isso e recomendo também que você conheça os sistemas anteriores e a história dos sistemas operacionais em geral, assim você vai entender de onde veio cada sistema e como nós chegamos onde nós estamos agora no mercado de sistemas operacionais atual.

Recomendo também a história da criação dos sistemas operacionais da Microsoft, tanto o Windows quanto o MS-DOS, existem livros com histórias da criação da Microsoft e biografias do Bill Gates que contam essa história da criação dos sistemas da Microsoft, eu recomendo também o filme piratas do vale do silício que conta a história da Microsoft e da Apple.

É interessante conhecer também a história de outros sistemas como a história dos sistemas operacionais da Apple. Em qualquer biografia do Steve Jobs fala sobre a história do sistema, como que ele criou a Apple e o Mac OS X.

Então você entender e se situar e esse seria o primeiro passo, depois disso eu recomendo que você estude arquitetura de sistemas operacionais.

2 – Estudar Arquitetura de Sistemas Operacionais

Você pode procurar livros de arquitetura de sistemas operacionais. Existem muitos livros ótimos, em qualquer biblioteca de faculdade de análise de sistemas ou de ciência da computação existem vários livros para você conhecer, tem muitas opções mas o que eu recomendo é o livro do Andrew Tanenbaum: sistemas operacionais modernos.

Ele é dividido em duas partes, na parte teórica você vai entender o funcionamento de um sistema operacional, você vai entender como funciona internamente a arquitetura de um sistema.

O Tanenbaum é o cara que criou o sistema operacional Minix que foi uma das inspirações para o Linus Torvalds criar o Linux, então por isso eu recomendo que você leia o livro dele mas existem também outros livros ótimos para a parte teórica mas o dele é o que se aprofunda mais na parte prática porque ele é acompanha o código fonte do sistema operacional Minix.

Analisando as parte do código você vai entendendo na prática em um sistema operacional como funciona o que ele ensina na parte teórica, e assim você você vai estar mais preparado para passar para os próximos passos.

No primeiro passo você vai entender a história dos sistemas operacionais, do mercado de softwares, e de como o mundo da informática chegou até o ponto que nós estamos hoje.

No segundo passo é você estudar arquitetura de sistemas operacionais.

E depois vem o terceiro passo, seria complicado você ir direto para o código-fonte porque você não vai entender nada se você não souber programação a fundo. Ao ler a parte teórica do livro do Tanenbaum ou de outro livro de sistemas operacionais você vai entender a fundo como funciona um sistema operacional internamente.

3 – Aprender a programar em C

Se você baixar esse código do Minix não precisa necessariamente do livro. Na internet tem muito conteúdo disponível sobre arquitetura de sistemas operacionais.

Eu estou falando do Minix por que é um sistema operacional muito mais simples do que o Linux mas você poderia pegar o código do Linux que é disponibilizado e começar a estudar a partir dele.

Mas, o Minix é um sistema operacional muito mais simples para se entender por não ser tão grande e tão complexo quanto o Windows e o Linux.

E para entender o código de qualquer sistema operacional você precisa aprender a programar em C.

4 – Estudar o código-fonte e a estrutura de algum sistema operacional

Você pode se basear no código fonte do Minix ou de outro sistema operacional Open Source como o Linux ou algum sistema BSD.

Para poder estudar o código do sistema operacional Minix, você pode ir analisando cada parte do código junto com o livro de sistemas operacionais do Tanenbaum.

Temos aqui um paradoxo, você só vai ser capaz de estudar e entender o código após você aprender a programar em C em nível avançado. Só o conteúdo que é ensinado na maioria dos cursos de programação em C e também nas faculdades não será o suficiente para isso.

Por outro lado, estudar um código-fonte tão avançado e complexo quanto o código fonte de um sistema operacional é um das melhores formas de aumentar o seu nível de conhecimento em programação, mesmo que você não pretenda criar um sistema operacional comercial.

Outra coisa que você pode fazer e que pode ajudar bastante é você pegar algum sistema operacional qualquer, pode ser o Linux, o Windows ou qualquer outro e você começar a entender a estrutura dele, você entra lá na estrutura de diretórios começa a ver como funciona e como tudo se encaixa, você pode entrar em cada pasta e vai vendo quais arquivos estão lá e ver o nome de cada um, qual a função de cada um, o que acontece se você fizer alguma alteração em algum arquivo de configuração.

No Windows Você tem o registro do Windows que você pode entender o funcionamento mas a fundo do sistema. Eu lembro que quando eu comecei a estudar sobre isso, eu usava o Windows 98 antes de ir para o Linux e eu ficava abrindo as pastas Windows, System, System32 e ficava vendo arquivo por arquivo, eu abria cada um dos arquivos para ver para que serve e de vez em quando eu abria o registro(regedit) e ficava analisando as configurações, como tudo funciona o que acontecia se alterar alguma coisa, e ia entendendo a fundo o funcionamento do Windows mesmo sem ter acesso ao código fonte e depois eu fui fazer a mesma coisa com Linux.

E você pensou que já tinha terminado…?

Não, na verdade ainda nem começou, e vamos para o próximo passo.

5 – Aprender a programar em Assembly

Mais tarde você vai precisar aprender a programar também na linguagem assembly, mas antes disso você pode começar pela maior parte do código que é feito em C e também porque a linguagem C é mais fácil de entender do que Assembly.

Para aprender Assembly, você pode procurar algum livro, tutoriais na internet sobre o essa linguagem de programação ou então procurar algum curso.

6 – Começar o Desenvolvimento do seu Sistema Operacional

Então aprender C é o 3º passo, ler e analisar o código do minix é o 4º e a partir daí o 5º passo é aprender assembly e o 6º passo é você começar a executar na prática, você pegar os códigos do Minix, testar, estudar, fazer alterações no código fonte ver o que acontece, fazer testes, compilar o sistema e fazer a instalação no seu computador para analisar o funcionamento.

Então esse é o 6º passo, colocar a mão na massa… e isso é só você que pode fazer.

E se você quiser simplificar esse processo, eu recomendo que antes de você criar um novo sistema operacional do zero, você começar tentando criar por exemplo uma nova distribuição Linux.

Não precisa ser comercial mas para você aprender a estrutura do sistema e para isso você pode tentar remasterizar uma distribuição Linux que já existe ou então você realmente criar uma nova distribuição do zero, eu recomendo que você pesquise sobre o Linux from Scratch, vai te ajudar nesse processo.

Fonte: http://ninjadolinux.com.br/como-criar-um-sistema-operacional-em-6-passos/

Só pra complementar, seguem links do conteúdo citado: - [Página oficial do Minix](http://www.minix3.org/) e o respectivo [código fonte](https://github.com/Stichting-MINIX-Research-Foundation/minix) - [Código fonte do Linux](https://github.com/torvalds/linux) - [Livro do Tanenbaum](https://www.amazon.com.br/Sistemas-operacionais-modernos-Andrew-Tanenbaum/dp/8543005671)
Cara, muito obrigado! O passo a passo parece até um sol que iluminou o caminho!
Se não quiser usar C, você pode usar Rust tambem, vai te dar muito mais segurança pra construir o kernel sem ter bugs de memoria, e com o sistema de unsafe, da pra fazer literalmente tudo, até colocar assembly dentro do rust, e o rust tambem compila pra várias arquiteturas, claro, vc vai ter várias versoes do mesmo codigo pra arquiteturas diferentes porque não é tudo igual. Rust é uma boa alternativa ao C pra fazer kernels e bootloaders. Pra configurar um projeto Rust pra baremetal não é muito complicado, recomendo o site https://os.phil-opp.com/ para mais detalhes sobre isso. Atenção, NÃO USE ESSE SITE COMO RECEITA DE BOLO, use como uma fonte de informação, um guia de como começar um kernel em rust, introduzindo alguns conceitos de coisas que existe por baixo dos panos que os kernels interagem e implementam pra fazer as coisas funcionar, mas nao ensina como criar um sistema inteiro.

Não é preciso muito para criar um sistema operacional.

Você pode ter 5, 10, 30 anos de experiência na computação, mas se você não tiver nenhuma experiência com o low-level, a nível de programação de drivers, Assembly, C e etc, você não conseguirá chegar a lugar nenhum.

Programar um sistema operacional do zero é não ter nenhuma biblioteca, framework, utilitário, intelisense, absolutamente nada.

É desenvolvimento às cegas, guiado somente por tua inteligência. Precisa saber o avançado de programação de baixo nível, em C, assembly e demais outras linguagens. Além de estudar a arquitetura do computador no geral, entender como as instruções do processador funciona, quais você deve enviar, como você deve gerir a memória, etc.

E o mais importante: por que você quer construir um sistema operacional do zero? Dificilmente terá um motivo, a não ser que seja por puro divertimento ou curiosidade. Pergunte a si mesmo se essa vontade de aprender esse conhecimento é válida para isso ou se poderia gastar seu tempo com algo mais apropriado.

Tem um doido que compilou C# para EFI, usando o bflat. Não vi ninguém indo a fundo com isso, nem acredito que seja uma boa ideia.

Saindo um pouco do muito que já foi falado, não vou te falar que precisa 2 encarnações como programador(dos bons!) pra fazer essa tarefa. Mas vou tentar te deixar mais animado com a ideia.

Primeiro você precisa entender que sistema operacional é diferente de kernel, e linux não é sistema operacional, é kernel(estou falando isso porque você mencionou ele na pergunta). Logo, pra construir um sistema operacional, você não precisa obrigatóriamente conhecer o abismo do assembly, mas vai precisar ser um bom programador C/C++ e conhecer MUITO bem o kernel que vai usar(obviamente, linux!). O sistema operacional precisa fazer chamadas ao kernel, então terá que prover uma boa integração entre os dois sistemas. Isso é o básico. Vai precisar implementar varias bibliotecas para o sistema, o proprio sistema de arquivos, etc.

Caso vá fazer um sistema completo com kernel e tudo, então terá que usar assembly para varias funções do kernel, incluindo o bootloader. Assembly é o MAXIMO! recomendo aprender, e não é tão dificil como todo mundo fala, vai por mim e experimenta! Outra dica é conferir o fonte de sistemas antigos e ver como eram legais e até 'faceis', na verdade, eles tem bem menos arquivos do que se imagina! Dê uma olhada no fonte do MS-DOS e procure o livro do MINIX. Se você quer experimentar algo prático e didatico, escreva seu MINIX!

E pra inspirar você, vou te falar que conheci um cara no Twitter que construiu o proprio sistema operacional e kernel!! tudo em Assembly! e ele é brasileiro, dev junior e tudo mais! Inclusive eu fiquei de escrever um escalonador para o projeto dele e perdi o contato com o amigo(por conta do meu trabalho) então não sou ainda contribuidor do projeto, mas por ser brasileiro e muito legal, vou compartilhar/promover aqui: https://github.com/hexagonix/Doc

Eu acompanho o desenvolvimento de um SO lá no Github. O cara que tá programando ele é brasileiro, e o projeto se chama Gramado OS.

Este SO está sendo feito praticamente em C e Assembly, e além de saber estas linguagens, também é preciso ter um conhecimento profundo de como o computador funciona.

Segue o repositório. https://github.com/gramado/gramado

Olá! Compreendo a sua curiosidade - criar um sistema operacional do zero é um desafio e tanto! Mas é um projeto que requer um vasto conhecimento em várias áreas. Aqui estão alguns dos conhecimentos fundamentais:

Linguagem de Programação: Você precisa ter um domínio muito forte em uma ou mais linguagens de programação de baixo nível, como C ou Assembly. A razão para isso é que um sistema operacional precisa ser capaz de interagir diretamente com o hardware, o que linguagens de alto nível normalmente não permitem.

Arquitetura de Computadores: Entender como os computadores funcionam em um nível fundamental é crucial. Isso inclui conhecimentos sobre processadores (como eles executam instruções, interagem com a memória, etc.), dispositivos de entrada/saída, e a hierarquia de memória (cache, RAM, etc.).

Sistemas Operacionais: Obviamente, para criar um sistema operacional, você precisa entender como os sistemas operacionais atuais funcionam. Isso inclui coisas como gerenciamento de processos e threads, escalonamento, sincronização, gerenciamento de memória e sistemas de arquivos.

Estruturas de Dados e Algoritmos: Conhecimento profundo de estruturas de dados e algoritmos é fundamental, pois é necessário para implementar várias funcionalidades de um sistema operacional, como gerenciamento de memória e escalonamento de processos.

Programação de Baixo Nível e Linguagem Assembly: Você precisa entender a programação de baixo nível e a linguagem assembly, pois muitos aspectos de um sistema operacional exigem controle direto do hardware do computador.

Sistemas Distribuídos: Com a crescente popularidade da computação em nuvem, o entendimento de sistemas distribuídos também é benéfico. Isso inclui compreender como lidar com problemas de concorrência, consistência e tolerância a falhas.

Criar um sistema operacional do zero é um projeto gigantesco e complexo que normalmente é realizado por uma equipe de engenheiros experientes ao longo de vários anos. No entanto, se o seu objetivo é aprender, há vários projetos e tutoriais menores na internet que podem ajudá-lo a entender alguns dos conceitos fundamentais, como a construção de um kernel simples. Boa sorte na sua jornada!

Cara, eu sei que a curiosidade bate em relação a construir essas coisas complexas e talz. Vou te dar uma dica, apenas entenda como funciona e não como CONSTRUTUI. Jovem, não foi apenas UMA pessoa que construiu o núcleo do Linux, ou a kernel do windows, não foi só uma pessoa. Isto envolve um time de engenheiros, matemáticos e especialistas em diversas áreas da computação. Então o conselho que eu dou é: Entenda, não construa.

Mas se quer mesmo entender o que é preciso pra desenvolver um SO lá vai:

  • Muito Assembly. Linguagens de baixo nível como assenbly e C vão te ajudar a arquiterar todo o sistema e construtir a relação software e hardware
  • As temidas: Estrutura de dados: Pilha, fila, lista encadeada, Árvore binária de busca, grafos, e tudo qualquer tipo de estrutura de dados existente.
  • Cálculo Diferencial e Integral: Deve estudar também muita matemática, para o seu SO ficar mais performático e que se comporte de uma maneira mais adequada em diferentes dispositivos.
  • Tomar muito café com energético kkkk
  • Design, afinal você não vai querer uma interface totalmente zoado pro seu usuário né? Então experiência do usuário também é uma boa para levar em consideração em seu conhecimento.
  • E por último e não menos importante: Seja solteiro, pois tu não terás TEMPO, porque pra criar um SO sozinho tem que ser corno, porque tu não vai ver mais sua esposa / namorada kkk, nem sua mãe, vai viver me um porão trancafiado, igual aqueles caras de filme de terror. KKKKK brincadeira.

Bons estudos abraço, e boa sorte com a jornada ao conhecimento.

Posso dizer que hoje há 0 (zero), isso mesmo ZERO cursos que ensina esse tópico no Brasil. Profissionais que sabem isso com maturidade, poucos. Vamos lá quando falamos em: -FIFO -LIFO -Semáforos -Algoritmos Avançados -Entradas e Saídas -Bibliotecas -Variáveis de ambiente And so on.... Isso são só alguns tópicos que eu me lembro meramente iniciais para sistemas operacionais, O que temos são cursos que ensinam a subir serviços, apertar botão, cursos de redes. Esse video do Akita sobre Git exemplifica o que digo: -https://www.youtube.com/watch?v=6Czd1Yetaac

Uma frase do Carl Sagan que eu gosto muito é: se você quiser fazer uma torta de maçã do nada, terá primeiro que inventar o universo.

O pessoal já recomendou um monte de tópicos para estudar e materiais de estudo então não vou ser redundante aqui (veja o comentário do @maniero). Mas gostaria de complementar aqui dando uma noção mais "vida real".

Entenda primeiro que existem sistemas operacionais e sistemas operacionais. Tem gente que adora especular que isso é uma ciência de foguetes, que você precisa abdicar de sua vida social, que vai demorar décadas ou que você vai precisar de uma equipe de 895 engenheiros... Mas vale lembrar que a primeira versão do MS-DOS foi desenvolvida em 6 semanas. Isso aí, 1 mês e não 10 anos. O Super Mario foi um projeto muito mais complexo de desenvolver do que o MS-DOS.

Há muito misticismo quando se fala de sistemas operacionais porque a galera não tem a menor ideia, ou uma ideia bem superficial, de como um sistema operacional funciona. Sim, desenvolver S.O. no nível de um Linux ou Windows atual é uma tarefa irrealista para qualquer ser humano sozinho.

Mas gente, e a primeira versão do Linux que foi desenvolvida pelo Torvalds sozinho e em poucos meses? E o Minix que foi desenvolvido pelo Tanenbaum sozinho?

Como qualquer outro projeto de qualquer natureza, um S.O. pode ser desenvolvido seguindo a metodologia de MVP. Não precisa ser absurdamente complexo, absurdamente portável, absurdamente seguro, absurdamente performático e absurdamente compatível com milhares de hardwares na versão 0.0.1.

Só o que importa é que seja bem feito, tendo um bom alicerce você levanta um prédio sem problema nenhum. Mas se o alicerce for ruim o prédio desaba. :smile:


Dito isso, além do já mencionado por outras pessoas aqui, se quiser desenvolver um S.O. também sugiro estudar o código de outros S.O. e focar em uma arquitetura específica (na primeira versão). Alguns projetos que você pode dar uma olhada:

  1. FreeDOS: https://github.com/FDOS/kernel
  2. SerenityOS: https://github.com/SerenityOS/serenity
  3. MenuetOS: https://www.menuetos.net/
  4. Linux: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/

Sobre o lance da arquitetura específica, os manuais da Intel têm um volume específico só para falar sobre desenvolvimento de sistemas operacionais. Que é o volume 3 "System Programming Guide". Você pode baixar os manuais aqui:

Obs.: se quiser desenvolver para outra arquitetura então sugiro procurar e consultar os manuais oficiais dessa arquitetura.

Ah, e se tiver precisando de um conteúdo para introdução ao baixo nível. Fiz uma apresentação recentemente justamente sobre isso: