Isso pode ser em vão, pois sei que escrever um sistema operacional é insuportavelmente complicado (especialmente para você mesmo).
Não espero construir o próximo linux ou windows.
Eu sei que vai ser horrível e cheio de erros e não vai funcionar, mas tudo bem.
Eu quero escrever tudo sozinho, em Assembly , C e (alguns) C ++ .
Este é um projeto futuro, já que estou ocupado com algumas outras coisas no momento e não tenho tempo imediatamente, mas achei que deveria perguntar agora, então talvez eu pudesse obter muitas respostas para isso, e poderia construir e ser um recurso útil para este tipo de abordagem (tudo o mais que vi envolveu a construção do minix, usando um gerenciador de inicialização existente, compilando-o em um programa de inicialização virtual, etc).
Quero configurar um dos meus desktops mais antigos com monitor, teclado e mouse e começar a trabalhar em um disco rígido vazio .
Quero aprender a escrever meu próprio bootloader (encontrei muitos recursos sobre isso, mas para completar, por favor, ainda adicione alguns bons), meu próprio driver USB (se for necessário), um driver de CD (se for necessário ), etc. Tudo, desde o início.
Como coloco o código no computador? É melhor fazer isso com um disquete? A maioria dos computadores pode fazer isso a partir de um stick USB?
De quais drivers eu preciso e você pode sugerir alguma referência para construí-los?
Após a sequência de inicialização - e depois? Como entro no modo protegido, etc.
Como faço para gerenciar a memória sem a ajuda de um sistema operacional? Devo usar os endereços que quiser? Nenhuma inicialização necessária?
O que, sem dúvida, vou encontrar que vai me confundir?
Como posso torná-lo um O / S de linha de comando e gráfico?
O que é um O / S gráfico integrado? Tipo, como eu faria algo como uma linha de comando, com uma fonte e uma imagem no topo?
Onde posso ler sobre como configurar um ambiente multitarefa? (ou seja, tendo duas linhas de comando semelhantes a gráficos rodando lado a lado).
Como eu configuraria uma espécie de sistema de janelas? Como faço para exibir gráficos na tela depois que a multitarefa simples estiver configurada?
Acredite em mim, entendo que este é um projeto muito complicado, e provavelmente nunca vou conseguir terminar de concluí-lo ou escrever algo nele que tenha alguma utilidade.
Há muitas outras partes que não mencionei, se você pensar em alguma, sinta-se à vontade para adicioná-las também.
Por favor, coloque um "tópico" por resposta - por exemplo, drivers USB e, em seguida, talvez uma lista de recursos, itens a serem observados, etc.
Além disso, não sugira construir a partir de outro O / S ou código pré-existente. Eu sei que vou ler muito código pré-existente (como o kernel do linux, ou recursos de exemplo, drivers existentes, etc.), mas no final das contas eu quero escrever tudo sozinho. Sei que devo partir de outra coisa, e há muitas outras perguntas sobre isso no SO que poderei ler se mudar de ideia e seguir por esse caminho. Mas este trata de fazer tudo do zero.
Alguma sugestão sobre como torná-lo gráfico? Diferentes modos de vídeo e como trabalhar com eles, etc?
fonte
Respostas:
Primeiras coisas primeiro. Leia, leia, leia, leia, leia. Você precisa ter um bom entendimento de como o sistema operacional funciona antes de implementar o seu próprio.
Pegue um dos livros de Andrew Tanenbaum sobre sistemas operacionais. Este é o que usamos na minha aula de SO na faculdade:
PDF de sistemas operacionais modernos
Sistemas operacionais modernos na Amazon
Apesar da capa ridícula, é uma leitura fantástica, especialmente para um livro didático. Tanenbaum é realmente um especialista nesta área e suas explicações de como o sistema operacional funciona por baixo do capô são claras e fáceis de entender. Este livro é principalmente teórico, mas acredito que ele também tem um livro que discute mais sobre a implementação. Eu nunca li isso, então não posso comentar sobre isso.
Isso deve ajudá-lo a melhorar o gerenciamento de processos, gerenciamento de memória, sistemas de arquivos e tudo o mais que o kernel do sistema operacional precisa fazer para colocá-lo em um estado inicializável. A partir desse ponto, é basicamente uma questão de escrever drivers de dispositivo para o hardware que você precisa oferecer suporte e oferecer implementações das funções da biblioteca C para fazer chamadas de kernel para coisas como abrir arquivos e dispositivos, ler e escrever, passar mensagens entre processos, etc. .
Leia sobre assembly x86 (supondo que você esteja projetando isso para uma máquina x86). Isso deve responder a muitas de suas perguntas com relação à movimentação entre os modos de operação do processador.
Se você tiver algum conhecimento de eletrônica, pode ser mais fácil começar escrevendo um sistema operacional para um dispositivo embarcado que tenha ampla documentação, porque geralmente será mais simples do que um PC x86. Sempre quis escrever meu próprio sistema operacional também e estou começando a escrever um sistema operacional integrado de microkernel para esta placa de desenvolvimento da Digilent. Ele pode executar o processador MicroBlaze soft-core da Xilinx, que possui uma documentação muito completa. Ele também tem RAM, armazenamento de dados flash, LEDs, interruptores, botões, saída VGA, etc. Muitas coisas para brincar escrevendo drivers simples.
Um dos benefícios de um dispositivo incorporado também é que você pode evitar a gravação de um driver VGA por muito tempo. No meu caso, a placa de desenvolvimento Digilent tem um UART integrado, então posso usar a saída serial como meu console para fazer tudo funcionar e inicializar em uma linha de comando com o mínimo de barulho.
Apenas certifique-se de que o que quer que você escolha como destino tenha um compilador prontamente disponível e bem testado para isso. Você não quer escrever um sistema operacional e um compilador ao mesmo tempo.
fonte
http://www.osdev.org/ e http://www.osdever.net/
bem-vindo ao mundo do desenvolvimento de sistemas operacionais.
Veja também outros links de documentação x86 em SO's x86 tag wiki : manuais da Intel e da AMD, documentação do compilador / assembler e vários guias.
Ele também sugere o uso de BOCHS ou outro ambiente virtual para depuração, uma vez que você pode executar uma única etapa do bootloader e examinar os registros.
fonte
Eu sugeriria trabalhar, pelo menos no início, em Bochs ou alguma outra máquina virtual, porque você pode levá-lo para onde quiser, é mais fácil de depurar (você pode ver o estado exato do hardware), e se você precisam de ajuda externa para depurar, eles podem usar exatamente o mesmo 'hardware' que você.
O conselho mais útil que tenho é entrar em um estado em que você possa executar o código C o mais rápido possível - ou seja, inicializar, configurar suas tabelas de descritores e chegar a um ponto em que seja seguro executar o C. compilado. senão todo o kernel deve estar em C se você quiser permanecer são e continuar trabalhando nisso. A montagem, embora necessária em alguns lugares, é tediosa e tende a ser difícil de depurar.
fonte
Em seu nível mais baixo, o mínimo que um sistema operacional precisa ser capaz de fazer é conduzir o hardware do sistema de alguma forma e de alguma forma carregar e executar algum tipo de "código do usuário". Se você vai começar com um PC, precisa escrever um código que pode ser carregado por ele de um ou outro dispositivo. PCs mais antigos têm um BIOS no firmware que determina como o hardware realiza algumas inicializações (pelo menos vídeo, teclado e alguma forma de armazenamento ou carregador de boot). (Atualização em outubro de 2017: PCs mais novos têm firmware EFI ou UEFI ... o que é uma diferença muito pedante; eles servem aos mesmos propósitos para esta discussão).
Portanto, comece aprendendo os detalhes de baixo nível de como usar o BIOS ou outro firmware no sistema de destino. Ou seja, aprenda a escrever um programa que o BIOS possa carregar e executar. Isso irá eventualmente se transformar em seu gerenciador de inicialização. Comece pequeno. Basta obter um programa que imprima: "Olá, Linus" diretamente do processo de inicialização do firmware (em um disquete ou pen drive USB, seria um bom começo ... ou em um disco rígido, se preferir).
A partir daí, eu recomendo escrever um driver serial muito simples ... atualize seu carregador de boot para inicializar alguma porta serial e inicie um download a partir daí. Em seguida, ele pode executar o código que puxa. A partir daí, escreva um pouco de bootstrap que pode gravar em outro conjunto de blocos (não implementamos um sistema de arquivos ainda ... nem mesmo a análise da tabela de partição; então, apenas lidaríamos com intervalos brutos de blocos no disco no início )
Nesse ponto, o seu carregador de boot deve ser capaz de puxar um novo código através da linha serial, despejá-lo em uma partição (sim, implementar o manuseio da tabela de partição de algum tipo ... se está em conformidade com as convenções padrão do PC depende de você neste momento ) e executá-lo.
A partir daí, você poderá trabalhar em recursos muito mais sofisticados. A partir desta base, você pode escrever e compilar um novo "kernel" ... reinicie seu testbed e tenha o novo kernel implantado nele.
(Seu bootloader deve receber algum sinal, como um BREAK nas linhas seriais de handshaking como um comando para pular o download e apenas inicializar a imagem existente; e deve lidar com algum tempo limite dessa forma também).
De lá, escreva uma camada de terminal e um shell de comando muito simples? Um sistema de arquivos? Implemente comandos para fazer download de novo conteúdo executável diferente do kernel (arquivos ou objetos de algum tipo). E assim por diante.
Naturalmente, você poderia ter começado com um driver de console usando o teclado do PC e vídeo (o BIOS INT 0x16h e INT 0x10H, respectivamente, se bem me lembro). No entanto, sugiro começar com um driver serial, já que você pode automatizar seu ciclo de construção / implantação / teste de qualquer outro sistema (funcional) existente. Visto que seu novo sistema operacional começará como um projeto de compilação cruzada, será essencial que você tenha uma maneira simplificada de lidar com isso.
Não sei até onde você quer levar seu projeto. Uma meta razoavelmente impressionante seria alcançar a "auto-hospedagem". Se você puder criar um montador / compilador simples que permita usar seu novo sistema operacional para (re) construir, vincular e inicializar em uma versão funcional de seu novo sistema operacional ... então você atingiu esse objetivo. (Observe que não é um requisito. Muitos sistemas embarcados nunca serão auto-hospedados e não há nada de errado com isso).
fonte
Se você não se importa em usar a virtualização de hardware, existe um curso (livro + palestras + software) que o levará 'De Nand a Tetris'. Você cria um sistema de computador completo inteiramente por conta própria, desde a porta elétrica NAND (para esses propósitos atômica e fornecida), até a construção do sistema operacional, uma linguagem e, finalmente, a codificação de um jogo simples em sua máquina pessoal.
Acho que é uma ótima ideia e algo que pretendo muito me dedicar em breve. O livro é surpreendentemente barato e acredito que o curso seja ministrado no MIT. Não consigo imaginar nenhuma sensação maior do que ter o conhecimento total e completo de todo um sistema que você mesmo construiu a partir do zero.
Link: http://www1.idc.ac.il/tecs/
fonte
Eu começaria pequeno e compraria um kit de desenvolvimento integrado 8086 e desenvolveria um sistema operacional multitarefa nele. Uma vez que você tenha um kernel e esteja familiarizado com o trabalho no nível de hardware, você estará pronto para fazer algo mais desafiador.
Construir até mesmo um clone do DOS para display VGA é bastante desafiador. Os detalhes são enormes. :-)
tópicos específicos.
Como coloco o código no computador? É melhor fazer isso com um disquete? A maioria dos computadores pode fazer isso a partir de um stick USB?
O BIOS fará a inicialização elementar.
De quais drivers eu preciso e você pode sugerir alguma referência para construí-los?
qualquer coisa que não seja operações diretas de CPU / memória. Qualquer coisa que não esteja diretamente no manual de referência da CPU.
Após a sequência de inicialização - e depois? Como entro no modo protegido, etc.
O modo protegido fará parte da sequência de inicialização.
então você começa a multitarefa e descobre como iniciar processos.
Como faço para gerenciar a memória sem a ajuda de um sistema operacional? Devo usar os endereços que quiser? Nenhuma inicialização necessária?
Corrigir. Você provavelmente vai querer resolver um sistema de memória virtual eventualmente.
O que, sem dúvida, vou encontrar que vai me confundir?
não ter ferramentas de depuração, não ter IO
Como posso torná-lo um O / S de linha de comando e gráfico?
Com pesar. Procure Windows 3.1 e Linux, em particular X windows.
O que é um O / S gráfico integrado? Tipo, como eu faria algo como uma linha de comando, com uma fonte e uma imagem no topo?
Procure janelas X.
conselho final: estude o linux / x windows. Não é perfeito, mas fornece uma compreensão de uma abordagem. Também estude sistemas embarcados.
fonte
Vejo muitas referências boas a sites de desenvolvimento de SO, então descreverei uma abordagem diferente:
Se você deseja a experiência de implementar um sistema operacional totalmente novo, existem opções de hardware muito melhores do que um PC antigo. Com a arquitetura do PC, você gastará uma quantidade excessiva de seu tempo codificando artefatos desinteressantes de seus 30 anos de história de design. Por exemplo, apenas a parte do bootloader do projeto provavelmente esgotou muitos programadores corajosos.
Por exemplo, você precisará de um conjunto de drivers para ler o kernel do disco e / ou da rede. Então você precisará do código para entrar no modo protegido. Nesse ponto, você precisa de outro conjunto de drivers! Muito pouco do trabalho que você faz para colocar o chip no modo protegido será transferível depois desse ponto. Você deseja executá-lo em um PC diferente + - 4 anos e precisará de outro conjunto de drivers.
Procure iniciar um ARM ou outro chip "embutido" de 32 bits. Existem placas de desenvolvimento baratas disponíveis, ou você pode soldar as suas próprias! Alguns possuem ethernet e usb integrados. Acho que você vai se divertir mais trabalhando em uma arquitetura sã e não rígida e talvez acabe com algumas habilidades reutilizáveis.
fonte
Mais do que qualquer outra coisa, se você deseja que isso funcione em hardware real, você precisa absolutamente de uma cópia do manual do seu processador. Os manuais da Intel ( http://www.intel.com/products/processor/manuals/ ) são inestimáveis. Eles abrangem tudo, desde a troca de modos (real / protegido) até o gerenciamento de memória virtual (se você escolher ir tão longe) para fazer syscalls (se você chegar ao modo de usuário). Mais importante ainda, eles explicam em grande detalhe uma série de coisas que devem ser configuradas para que as coisas funcionem, como o TSS e os registradores de segmento, que a maioria dos textos do sistema operacional não discute porque estão mais preocupados com conceitos de nível superior do que com o processador. detalhes específicos.
fonte
O OS Development Series @ BrokenThorn pode lhe interessar.
fonte
Tente ler o código de um sistema operacional pequeno e básico, como o MikeOS.
Como alternativa, sugiro os seguintes passos (deve ser divertido!):
Os passos acima podem parecer estúpidos para escrever um sistema operacional simples, mas ei, é muito divertido.
fonte
dê uma olhada no MikeOS . É um sistema operacional bastante simples escrito em assembly legível (como no comentário). Mesmo sendo bastante simples, ele possui uma interface gráfica do usuário e oferece suporte a algumas redes e multimídia.
editar : MenuetOS é gráfico. Também é escrito em linha reta, mas é mais sofisticado do que MikeOS
fonte
Você tem uma meta ambiciosa. Mas a execução é a chave.
A maioria das abordagens estruturadas (livro-texto ou aula de faculdade) irá guiá-lo através do processo, mas elas fornecem muito código essencial que encobre os detalhes misteriosos de sua plataforma escolhida e permite que você se concentre nas ideias gerais: agendamento de processos, gerenciamento de memória, prevenção de deadlock, E / S e assim por diante.
Meu conselho é este: diminua suas expectativas e comece com uma pergunta básica.
O que é um sistema operacional?
Um cientista da computação (espero) nunca dirá que um sistema operacional é uma interface gráfica de usuário, ou um navegador da web, ou uma maneira de conectar dispositivos USB, ou qualquer coisa que um usuário possa ver ou tocar. Em vez disso, um sistema operacional em seu nível mais fundamental são as coisas que mencionei acima. Todos eles caem sob um grande guarda-chuva: gerenciamento de recursos.
Um sistema operacional nada mais é do que um programa que gerencia os recursos de hardware do computador: memória, CPU e periféricos.
Este é um sistema operacional simples: um programa permite que o usuário digite um programa (em hexadecimal ou binário) usando uma conexão serial. Uma vez que o programa tenha sido digitado, ele o executa. Quando o programa é concluído, o controle é devolvido ao usuário, onde ele pode executar o programa novamente ou digitar um novo.
Faça isso em uma arquitetura "limpa", como um processador ARM integrado com cerca de 64 K de memória. Você pode codificar isso em assembly depois de alguns dias aprendendo os meandros do ARM. E voila! , você tem um sistema operacional.
Ele faz tudo o que um sistema operacional deve fazer:
Isso lhe dá um bloco de construção para começar. Você tem muitas opções agora. Talvez um deles seja permitir que dois programas sejam carregados na memória e deixar que o usuário decida qual deles será executado em seguida.
Ou você pode deixar o usuário suspender a execução de um programa, alternar para o outro, suspender e retornar. Esta é uma multitarefa rudimentar, embora seja inteiramente manual.
Suas escolhas são ilimitadas, mas cada uma é um pequeno passo em relação ao que você tinha antes.
É divertido se você não definir suas metas muito altas!
fonte
Eu mantenho uma lista de recursos no StackOverflow: Como começar no desenvolvimento do sistema operacional . Por favor, adicione novos recursos à medida que você começa sua aventura (estou prestes a começar :))
fonte
Muitas escolas têm aulas de SO que fazem muito do que você descreve. Minha escola (CMU) ensinava SO em C, e escrevemos um kernel, sistema de arquivos e shell, e recebemos um código para um carregador de boot.
Infelizmente, não consegui encontrar nenhum recurso definitivo para este curso (15-412) na web, e ele evoluiu com o tempo. Mas talvez as pessoas possam postar links para fontes e tarefas para escolas que têm bons recursos na web.
fonte
Você pode gostar deste tutorial chamado "Role seu próprio sistema operacional clone do UNIX de brinquedo", é muito esclarecedor e deve ajudá-lo em seu caminho.
Boa sorte.
fonte
Estude o Sistema A2 (anteriormente chamado de sistema Oberon ) para ideias que você pode roubar. É um sistema operacional gráfico construído por apenas duas pessoas, embora uma delas seja Niklaus Wirth. Lançado pela primeira vez por volta de 1990 e a velocidade é surpreendentemente boa. Existe um livro de Gutknecht.
fonte
Sobre a programação de gráficos de baixo nível, isso fornecerá muitas informações: http://www.osdever.net/FreeVGA/home.htm . (É muito interessante para o modo de texto também.)
Você vai perceber que no PC há um monte de coisas que não estão claras: o conjunto de instruções x86 em si é complicado, e quando você obtém acesso direto ao hardware, pode demorar um pouco para entender como escrever um único caractere na tela .
Não se preocupe com disquetes e coisas do gênero, na maioria das vezes você usará um emulador como Bochs ou QEmu.
fonte
Você pode querer considerar dar uma olhada em Operating Systems Concepts, de Abraham Silberschatz - Noções básicas sobre conceitos de programação de sistemas é um requisito fundamental, dê uma olhada nas partes internas do kernel F / OSS dos sistemas operacionais linux * BSD e GNU / Linux , especialmente as versões anteriores, que são provavelmente um pouco mais documentados.
fonte
Dê uma olhada no Minix . Estude o código-fonte junto com " Projeto e implementação de sistemas operacionais ". Considere fazer contribuições para o projeto. Acho que o Minix é um sistema operacional realmente bom e promissor em desenvolvimento. É também um projeto bem financiado. Isso significa que você pode até ser pago por suas contribuições!
fonte
É muito fácil graças ao fato de que a BIOS já possui muitas funções de entrada / saída incorporadas para alterar o modo da tela, alterar a cor dos pixels, escrever texto na tela e muitas outras coisas. No entanto, ele não inclui suporte para sistemas de arquivos, que é uma das poucas coisas que você deve incorporar em seu sistema operacional.
O BIOS carrega o primeiro setor no disco rígido e começa a executar o código a partir daí, então seu sistema operacional deve ser colocado com a primeira instrução no primeiro setor do disco rígido.
Este artigo da Wikipedia deve ajudá-lo a começar com as interrupções do BIOS para escrever texto na tela, receber teclas do teclado e outras coisas. https://en.wikipedia.org/wiki/BIOS_interrupt_call
Mesmo se você planeja usar c ++, eu recomendo fortemente a leitura sobre programação em assembly, pois é vital para entender como o hardware funciona.
fonte