A começar
On Outubro 2, 2021 by adminPrimeiro de tudo, desenvolver um sistema operacional é provavelmente uma das coisas mais desafiadoras que você pode fazer em um computador (ao lado de matar o chefe final do Doom no nível de dificuldade do Nightmare). Compor um sistema operacional requer muito conhecimento sobre várias áreas complexas dentro da ciência da computação. Você precisa entender como o hardware funciona e ser capaz de ler e escrever a complexa linguagem de montagem, bem como uma linguagem de nível superior (como C, C++, ou Pascal). Sua mente tem que ser capaz de se enrolar em torno da teoria abstrata e manter uma miríade de pensamentos. Já se sente desanimado? Não tenha medo! Porque todas essas coisas são também as coisas que tornam a programação de SO divertida e divertida.
Não há nada como a sensação de realização quando você, finalmente, após horas de luta, resolve o problema. E depois de algum tempo você é capaz de olhar para trás e ver todas as coisas que você criou do zero. Seu sistema manuscrito é capaz de inicializar, faz mágica contra o hardware e dá ao usuário uma interface de usuário e programas para jogar.
Não há um caminho absoluto que você tenha que tomar ao criar um SO. Uma vez que o seu sistema inicial esteja em funcionamento (e você faz isso encontrando os tutoriais apropriados), você escolhe o caminho que deseja seguir a seguir. O seu sistema operativo é exactamente isso: o seu. Você tem o controle máximo, e o céu é o limite!
Conteúdo
- 1 A dura verdade
- 2 Responsabilidade
- 3 Conhecimento requerido
- 4 Organize seus planos
- 5 Escolhendo seu ambiente de desenvolvimento
- 5.1 GNU/Linux
- 5.2 Windows
- 5.3 MacOS
- 6 Testando seu sistema operacional
- 7 Protegendo seu código
- 8 Pontos de partida comuns
- 9 Obtendo mais conhecimento
- 10 Veja Também
- 10.1 Artigos
- 10.2 Threads
- 10.3 Links Externos
A Verdade Difícil
Eficazmente o fato básico de que o desenvolvimento do sistema operacional é um processo complicado e contínuo não o desencoraja. A verdade é que o desenvolvimento de sistemas operacionais é verdadeiramente inigualável, uma vez que requer a máxima paciência e cuidadoso design de código, e retorna muito pouco a nenhuma “gratificação instantânea” que você recebe do desenvolvimento de coisas como jogos e scripts baseados na web.
Você foi bastante avisado do trabalho duro que tem pela frente, mas se você ainda estiver interessado, então prossiga para o domínio do programador de sistemas operacionais. Prepare-se para situações ocasionais de confusão, desânimo, e para alguns de nós…insanidade temporária. Com o tempo, e com dedicação suficiente, você se encontrará entre as poucas elites que contribuíram para um sistema operacional que funciona. Se você ficar desanimado pelo caminho, refresque-se com o conteúdo deste livro. Esperemos que ele lhe lembre porque você começou uma jornada tão insana em primeiro lugar.
Nesta etapa, também pagaria para ler a página Erros de Iniciante. Os usuários no fórum têm notado que muitos desses erros se repetem com o tempo, e evitá-los é uma ótima maneira de não se fazer de bobo.
Responsabilidade
Pessoas tendem a afirmar que não há problema em escrever softwares ineficientes, afirmando que os sistemas de computador são tão rápidos hoje em dia, que você não verá o impacto. Este tipo de mentalidade é perigoso na concepção de sistemas operativos. Pode ser OK escrever código descuidado ao fazer uma aplicação simples, mas quando se trata de código crítico que pode ser chamado milhares de vezes por segundo, você precisa tirar todas as despesas gerais que puder. O sistema operacional deve fornecer o computador como um recurso básico para as aplicações em execução, com a menor complicação, abstração e sobrecarga possível.
As pessoas que projetam sistemas operacionais nos dias de hoje tendem a ter a mentalidade de “tudo menos a pia da cozinha”. Elas assumem a responsabilidade por tudo, o que é bom, claro, mas não deve ser feito às custas de permitir que programas mal redigidos floresçam. Há muitas coisas que acontecem “debaixo do capô” quando ocorrem erros nos programas. Programas mal-escritos custam precioso tempo de execução e envolvem trocas de tarefas que são caras tanto na memória como na frequência. Nós encorajamos você a desencorajar softwares mal escritos.
Conhecimento Requerido
Artigo principal: Conhecimento Necessário
Se você acha que pode pular isto, é só para você.
Esta seção foi movida para uma página separada porque é referida com tanta freqüência nas discussões do fórum.
Organize seus planos
Antes de prosseguir, considere o que você quer tirar da escrita de um sistema operacional. Quais são as suas motivações para assumir este projeto? Existem muitas razões possíveis para assumir um projeto de SO de hobby, e a maioria dos os-devers tem mais de uma. Mesmo dizendo “eu só quero” pode ser suficiente, embora quanto mais você considerar e esclarecer seus objetivos e motivos, mais você pode se concentrar no que você realmente quer.
Seja honesto consigo mesmo, também. Não há vergonha em ter ambições maiores para o seu projeto, mesmo (ou especialmente) se elas não forem o objetivo principal. Tente reconhecer todos os seus objetivos, não apenas aquele que você pensa ser o seu principal propósito.
Tente resolver em quais aspectos do design de SO você está mais interessado ou veja uma necessidade de trabalhar. A maior parte do que vai para o OS dev, especialmente no início, é o design e desenvolvimento do kernel, mas o kernel em si é apenas uma pequena parte da maioria dos sistemas operacionais; se o seu interesse principal é em UX, ou rede, ou programação de drivers, você deve pensar se você realmente precisa (agora ou no futuro) para escrever o seu próprio SO ou se você ficaria igualmente satisfeito desenvolvendo essas coisas em um kernel existente. Mais do que algumas pessoas já entraram no OS dev quando realmente queriam projetar um ambiente desktop, então esta é uma pergunta muito importante para se fazer.
Tente pensar em qualquer projeto não-OS que você possa querer assumir primeiro, ou ao mesmo tempo, especialmente aqueles que possam servir como prática ou preparação para o projeto de SO. Normalmente não há necessidade de trabalhar no projeto de SO agora, e quanto mais você tiver preparado antes do tempo, melhor será (até certo ponto, pelo menos – a preparação é uma coisa, a procrastinação é outra).
Simplesmente, se você pretende trabalhar em forjar um projeto existente para experimentar, ou modificar para algum propósito específico, foque nisso em vez de questões gerais de desenvolvimento. Considere que parte da base de código existente você vai precisar, e quais você quer mudar.
Tente trabalhar alguns dos seus objetivos específicos do projeto, e esteja preparado para planejar projetos separados, se isso ajudar a fazer isso. Se você simplesmente pretende colocar por aí e ver onde isso o leva, tudo bem; se sua intenção é derrubar a Microsoft, tudo bem (se provavelmente não for realista), também. Uma vez que você saiba o que quer fazer, você pode dividir os detalhes em objetivos específicos, e descobrir o que seria necessário para alcançá-los. Não tente forçar muitos objetivos divergentes em um projeto – se você tem coisas diferentes que você quer tentar com objetivos contraditórios, divida-as em projetos diferentes.
Pode ajudar se você escrever uma visão geral do seu projeto de SO planejado, com quaisquer requisitos ou detalhes específicos que você acha que são notáveis ou que poderiam esclarecer com o que você precisa de ajuda, e adicioná-lo ao seu repositório público, se você puder. Isto não só facilitará a ajuda de outros, como também ajudará a organizar e estabilizar os seus planos, tal como escrever um esboço para uma história ou artigo. Esteja preparado para mantê-lo à medida que seus objetivos e planos mudam, mas mantenha uma cópia de versões antigas (ou melhor ainda, mantenha o documento sob controle de versão) para que você possa ver como seu trabalho se desenvolve ao longo do tempo.
Finalmente, reveja o tempo e os recursos que o projeto irá requerer, e decida se eles são viáveis. Se você sabe que só tem um certo tempo para dedicar ao projeto, leve isso em consideração, e faça o que fizer, não se comprometa com um prazo externo, mesmo que tenha certeza de que pode alcançá-lo. OS dev leva tempo – muito tempo – e tentar terminar um projeto OS completo em um semestre não é realista.
Escolhendo seu ambiente de desenvolvimento
Você precisa de uma plataforma para desenvolver seu novo sistema. Seguindo as tendências da computação em geral, o mais popular é o GNU/Linux, mas muitos usam Windows também. Desenvolvedores que usam um sistema GNU/Linux têm uma pequena vantagem na disponibilidade de ferramentas, mas isto pode ser resolvido no Windows usando um sistema como Cygwin ou MinGW.
- Binutils: Ferramentas fundamentais para manipulação de arquivos objeto.
- GCC: A Coleção Compilador GNU. GCC contém compiladores para C, C++, Fortran, e Ada, entre outros.
- Make: Para automatizar o processo de construção, o que se torna realmente útil uma vez que você tenha mais de um punhado de arquivos.
- Grep e sed: Para fazer pesquisas mais poderosas e procurar e substituir (útil ao preencher tabelas com dados).
- Diffutils: Incrivelmente útil para mostrar as diferenças entre dois arquivos.
- Perl ou Python: Uma destas duas linguagens de scripting deve ser instalada. Útil para a manipulação de strings, entre outras coisas. Perl costumava ser a recomendação, mas Python agora está bastante maduro e é possivelmente mais fácil de aprender. Ambas têm centenas de pacotes/módulos disponíveis para fazer várias tarefas.
- Um Assembler: Por exemplo, NASM ou GAS. Isto varia dependendo da arquitectura da sua CPU alvo.
- Um editor: Para escrever seus arquivos Assembly, C, e outros (código).
Você pode não usar todas essas ferramentas, mas é melhor tê-las à mão “por precaução”, e saber como usá-las, mesmo em um nível básico. Mas se você decidiu usar outro idioma, então o uso das ferramentas depende principalmente de você e talvez a lista acima não o ajude de forma alguma. Abaixo estão as informações mais relacionadas com os desenvolvedores de C/C++ ou Assembly.
GNU/Linux
O sistema mais recomendado para o desenvolvimento de sistemas operacionais é o GNU/Linux. Ao usar o GNU/Linux, a maioria das ferramentas de desenvolvimento GNU provavelmente já está presente. Caso contrário, use as ferramentas de gerenciamento de pacotes da sua distribuição (APT, RPM, Portage, Pacman, Apk, etc.) para instalá-las conforme necessário. Mais uma vez, é necessário fazer um cross-compiler, de modo a não criar links nos ficheiros de tempo de execução do sistema de desenvolvimento.
Editores comuns são Vim, Emacs, KDevelop, Komodo Edit, etc. Alguns preferem editores leves ao invés de um IDE, como o gedit, Geany e SciTE. Muitos como o Midnight Commander que tem um Text UI e um editor incorporado (mcedit) e portanto extremamente leve e rápido.
Sobre quais distribuições você deve usar, consulte a lista de distribuições Linux. Elas vieram em todas as formas e tamanhos, e não todas adequadas para o desenvolvimento do kernel. Não use uma distro que tenha um objetivo específico, como segurança (Kali, Qubes, BackTrack, Parrot etc.), aplicações científicas (ex. Scientific), firewalls e roteamento (ex. DD-WRT), recuperação de sistemas ou ambientes embarcados (Knoppix, Rescatux, TinyCore) ou especificamente voltados para iniciantes (como Linux Mint, Nitrux etc.) Embora um Linux amigável para iniciantes possa fazer, escolha uma que seja uma distro de propósito geral. Use também uma distro que tenha pacotes atualizados, o melhor é escolher uma que use rolling-release. O Debian é fácil de usar, mas frequentemente envia versões antigas, e com patches (as ferramentas podem não se comportar como descrito). Muitos iniciantes como o Ubuntu, o que é bom, mas é relatado que tem problemas com algumas cadeias de ferramentas e ambientes de compilação (se você compilar seu próprio cross-compiler ao invés de usar um instalado, este é um non-issue).
Best distros para desenvolvimento do kernel são (mas tenha em mente que isto também é uma questão de gosto pessoal, então estas distros não são requeridas e sim sugeridas, e elas normalmente requerem alguma experiência): Arch, Gentoo, Solus, Slackware, void etc. até mesmo Puppy.
Se você não tiver certeza, tente Ubuntu ou Manjaro.
Windows
Para obter as ferramentas necessárias, você deve instalar o ambiente Cygwin. MinGW ou DJGPP são alternativas, mas MSYS2 é fortemente sugerido por ser o ambiente mais completo e compatível, e também inclui um gerenciador de pacotes para instalar bibliotecas e ferramentas.
Microsoft lançou recentemente (a partir da escrita) o Subsistema Windows para Linux como um recurso opcional para o Windows 10. Ele é basicamente uma distribuição de linha de comando Ubuntu real rodando em cima do Windows SEM o uso de uma VM. Os últimos GCC e Binutils (6.1.0 e 2.27 a partir da escrita) compilam e funcionam corretamente neste ambiente. Usando o Bash shell, você pode acessar seus discos rígidos do Windows através de /mnt/<drive letter>. A vantagem desta solução é que você pode trabalhar com qualquer ferramenta Windows ou Linux que você precisar, sem ter que descobrir se elas funcionam no Cygwin. Muitas das ferramentas necessárias podem ser instaladas usando “apt-get”.
Para todos os itens acima, é fortemente sugerido construir um cross-compiler, não só porque os compiladores padrão têm como alvo diferentes formatos executáveis, mas porque geralmente é uma boa idéia. Verifique a página do GCC Cross-Compiler para detalhes e instruções.
Você também vai precisar de um editor. Usando o Notepad funcionará, mas é mais fácil se você tiver um editor mais completo. Por exemplo, o Notepad++ ou Notepad2 são usados por muitas pessoas. Se você está confortável com editores Unix, você pode escolher um da escolha que o Cygwin fornece (que inclui por exemplo o Vim e o Emacs, que levam algum uso, mas são muito poderosos).
Também é possível usar o Visual Studio, ou o Visual C++ Express Edition que pode ser baixado livremente, para escrever e compilar seu sistema operacional. Você vai precisar de um arquivo de configuração especial, e certamente estará em minoria, mas ele funciona muito bem. Você pode até mesmo instalar o Windows SDK no topo, permitindo o desenvolvimento de 64 bits. A única dificuldade é que isto não suporta Inline Assembly.
Outras ferramentas como Watcom ou Borland também podem ser usadas, mas cada uma tem seus próprios requisitos específicos, e não são amplamente usadas para este tipo de trabalho.
MacOS
Porque sob o capô ele usa o espaço de usuário do FreeBSD, ele é totalmente compatível com o POSIX. Todas as ferramentas habituais estão disponíveis (vi, bash, dd, cat, sed, tar, cpio, etc.) Quase todos os tutoriais funcionam fora da caixa. As ferramentas em falta estão na sua maioria relacionadas com o sistema de ficheiros: sem dispositivo de loopback, sem fdisk, sem mkfs.vfat nem mtools. Mas você pode usar diskutil para esses fins, ou usar brew ou macports para instalar as ferramentas que faltam.
Para obter o gcc, você costumava ter um mpkg no DVD da 2ª Instalação para as versões mais antigas. Versões mais recentes do MacOS (10.13 e superiores) podem instalar o XCode de linha de comando (não o IDE, apenas o toolchain) executando “xcode-select –install” a partir de um Terminal. Isto vai instalar gcc, binutils e fazer. Este gcc é na verdade um CLang mascarado, mas com características suficientes para construir o seu próprio cross-compiler sem problemas. É preferível usar o compilador oficial para bootstraping gcc do que instalar um a partir de brew ou macports.
Testing your operating system
Main article: Testando
O artigo acima vai muito a fundo na escolha de como testar seu sistema operacional e como integrar isso com seu processo de desenvolvimento. Ambos os ambientes de testes físicos e emulados são discutidos.
Protegendo seu código
Durante sua construção de código você escreverá centenas, até milhares, de linhas de código. Você passará um número de horas inominável, e ficará acordado até tarde na codificação noturna, quando você realmente deveria ir para a cama. A última coisa que você precisa é uma falha de disco ou um comando ‘rm’ ou ‘format’ mal escrito jogando todo o seu trabalho fora.
O que você precisa é de um sistema de controle de versão. O CVS tem sido usado há vários anos, mas ultimamente tem recebido muita concorrência do Subversion, Bazaar, Mercurial, e Git. Se você puder, você deve configurar um computador ou servidor remoto como um servidor de controle de versão, mas se você não tiver tal máquina disponível, você também pode hospedar o sistema de controle de versão no seu computador de desenvolvimento local. Lembre-se de fazer backup do seu código em CD ou FTP de vez em quando.
Não podemos enfatizar este ponto o suficiente: se você ainda não está usando o controle de versão, você deve começar a fazer isso imediatamente. Você só precisa cometer um erro grave em seu código uma vez para perceber a importância de ter seu código versionado com segurança e facilmente recuperável. Embora possa parecer exagerado para um pequeno projeto de hobby privado, uma vez que você tenha o hábito de usar o controle de revisão, você vai se perguntar como você se saiu sem ele.
Para Git você pode criar seu projeto no GitHub. Bitbucket também é uma boa alternativa, pois suporta tanto Git quanto Mercurial. Ambos vêm com repositórios livres e privados.
Um benefício adicional de usar o controle de versão em um repositório acessível pela rede é que ele torna muito mais fácil colaborar e obter ajuda de outros. Isto pode ser bastante útil, especialmente nos fóruns, pois pode evitar a necessidade de postar constantemente versões atualizadas do seu código em um tópico de mensagem — você simplesmente aponta a conversa para o seu repositório, e os outros no tópico terão acesso direto às suas alterações mais atuais. Também é crucial se, conforme o projeto cresce, você começar a trabalhar com outros desenvolvedores no projeto (apenas não espere que isso aconteça da noite para o dia).
Pontos de partida comuns
A maneira mais fácil de conseguir um kernel “olá mundo” é o tutorial da Bare Bones. Uma abordagem diferente seria aprender como o próprio computador inicia, na página Boot Sequence.
Existem muitos outros tutoriais disponíveis, também.
Obtendo mais conhecimento
Existe uma quantidade incrível de conhecimento sobre o desenvolvimento de sistemas operacionais disponíveis na Internet hoje em dia. É apenas uma questão de encontrá-lo. Antes de mais nada, existe este wiki em si. Entre outros, temos muitos Tutoriais. Já que você está aqui, provavelmente já o encontrou. Também neste site está o fórum, onde muitos programadores se encontram e podem ajudar-te (mas certifica-te de que lês primeiro Como Fazer Perguntas). Foram escritos alguns livros sobre desenvolvimento de sistemas operacionais. Alguns deles são apresentados em nossa página de Livros, e mais em osdever.net também.
Deixe uma resposta