Pergunta

Isso pode ser em vão, como eu sei escrever um sistema operacional é insuportavelmente complicado (especialmente por si mesmo).

  • Eu não espero que para construir a próxima linux ou windows.

  • Eu sei que vai ser horrível, e de buggy, e não vai funcionar, mas isso é bom.

Eu quero escrever tudo sozinho, em Assembleia , C , e (alguns) C ++ .

Este é um projeto futuro, como estou ocupado com outras coisas no momento e não têm o tempo imediatamente, mas eu percebi que eu iria pedi-lo agora, então talvez eu poderia obter muitas respostas a esta, e pode acumular-se e ser um recurso útil para este tipo de abordagem (tudo o que eu vi edifício envolvido fora do MINIX, usando um bootloader existente, construindo-o em uma coisa programa de inicialização virtual, etc).

Eu quero configurar um dos meus desktops mais antigos com um monitor, teclado e mouse, e começar a trabalhar em um em branco disco rígido.

Eu quero aprender a escrever meu próprio bootloader (eu encontrei muitos recursos sobre isso, mas para ser completo, por favor ainda adicionar alguns bons), o meu próprio driver USB (se é necessário), um motorista de CD ( se isso é necessário), etc. Tudo, a partir do zero.

  • Como faço para colocar o código no computador? É melhor fazê-lo com um disquete? Pode a maioria dos computadores fazê-lo a partir de um stick USB?

  • O que motoristas que eu preciso, e pode sugerir quaisquer referências para a construção desses?

  • Após a seqüência de inicialização - então o quê? Como faço para entrar em modo protegido etc.

  • Como faço para gerenciar a memória sem a ajuda de um sistema operacional? Eu só usar qualquer endereços que eu quero? Sem inicialização necessária?

  • O que, sem dúvida, correr em que vai me confundir?

  • Como posso fazer isso também uma linha de comando O / S, e um gráfico?

  • O que é uma gráfica O / S construído em? Tipo, como eu faria algo assim, uma linha de comando, com um tipo de letra, e uma imagem no topo?

  • Onde posso ler sobre a criação de um ambiente multitarefa? (Isto é., Possuindo dois comando gráfica de como as linhas que funcionam lado-a-lado).

  • Como eu poderia criar uma espécie de sistema de janelas? Como faço para exibir gráficos na tela uma vez multitarefa simples é configurar?

Acredite em mim, eu entendo que este é um muito projecto complicado, e eu provavelmente nunca vai dar a volta a completá-la ou escrever qualquer coisa sobre ele de qualquer uso.

Existem muitas outras peças para este que não mencionei, se você pensar em qualquer, sinta-se livre para adicionar os demais.

Por favor, coloque um "tópico" por resposta -. Por exemplo, drivers USB, e então talvez uma lista de recursos, coisas para olhar para fora, etc

Além disso, por favor, não sugerem a construção fora de outro O / S ou pré-existente código. Eu sei que vou ler um monte de código pré-existente (como o kernel do Linux, ou exemplo, recursos, drivers existentes, etc), mas em última análise, eu quero fazer tudo o me escrevendo. Eu sei que eu deve construir fora de alguma outra coisa, e há muitas outras perguntas sobre SO sobre isso que eu posso ler se eu mudar minha mente e ir por esse caminho. Mas este é toda sobre fazer a coisa toda do zero.

Todas as sugestões sobre como obtê-lo gráfica? modos de vídeo diferentes e como trabalhar com eles, etc?

Foi útil?

Solução

As primeiras coisas primeiro. Ler, ler, ler, ler, ler. Você precisa ter uma sólida compreensão de como o sistema operacional funciona antes que você pode esperar para implementar o seu próprio.

Grab um dos livros de Andrew Tanenbaum em sistemas operacionais. Isto é o que usamos na minha classe OS na faculdade:

sistemas operacionais modernos PDF

sistemas operacionais modernos na Amazon

Apesar da tampa ridículo, é uma leitura fantástica, especialmente para um livro. Tanenbaum é realmente um especialista nesta área e suas explicações de como funciona o sistema operacional debaixo do capô são claras e fáceis de compreender. Este livro é principalmente teoria, mas eu acredito que ele também tem um livro que discute mais da implementação. Eu nunca lê-lo, embora, então eu não posso comentar sobre isso.

Isso deve ajudá-lo osso acima em gestão de processos, gerenciamento de memória, sistemas de arquivos, e tudo o mais suas necessidades de kernel OS que fazer para obtê-lo a um estado de arranque. A partir desse ponto, é basicamente uma questão de escrever drivers de dispositivo para o hardware que você precisa para suporte, e oferecendo implementações das funções da biblioteca C para fazer chamadas de kernel para coisas como arquivos de abertura e dispositivos, leitura e escrita, passando mensagens entre processos, etc .

Leia-se sobre x86 assembly (supondo que você está projetando este para uma máquina x86). Isso deve responder a muitas de suas perguntas com relação a mover-se entre os modos de operação do processador.

Se você tem qualquer conhecimento de eletrônica, pode ser mais fácil para começar a escrever um sistema operacional para um dispositivo incorporado que tem ampla documentação, porque geralmente vai ser mais simples do que um PC x86. Eu sempre quis escrever meu próprio OS, bem como, e eu estou começando a escrever um microkernel embutido OS para Este Conselho de Desenvolvimento de Digilent. Ele pode ser executado o processador MicroBlaze soft-core da Xilinx, que tem documentação muito completa. Ele também tem alguns RAM, armazenamento de dados flash, LEDs, interruptores, botões, saída VGA, etc abundância de coisas para brincar com a escrita motoristas simples para.

Um dos benefícios de um dispositivo embutido também é que você pode ser capaz de evitar escrever um driver VGA por um longo tempo. No meu caso, a placa de desenvolvimento Digilent tem um bordo UART, para que eu possa usar eficazmente a saída serial como meu console para obter a coisa toda para cima e arrancar para uma linha de comando com o mínimo de barulho.

Apenas certifique-se que tudo o que você optar por alvo tem um compilador prontamente disponíveis e bem testado por ele. Você faz não quero estar escrevendo um sistema operacional e um compilador, ao mesmo tempo.

Outras dicas

http://www.osdev.org/ e http://www.osdever.net/

Bem-vindo ao mundo Desenvolvimento OS.

Veja também outras ligações documentação x86 em SO do tag wiki :. Intel e AMD manuais, documentos de compilador / montador, e vários guias

Ele também sugere o uso de bochs ou outro ambiente virtual para depurar, desde que você pode single-passo o seu bootloader e examinar registros.

Gostaria de sugerir a trabalhar, pelo menos no início, em Bochs ou alguma outra máquina virtual a razão é que você pode levá-lo com você onde quer que você quer, é mais fácil de depurar (você pode ver o estado exato do hardware), e se você precisa de ajuda externa depuração eles podem usar exatamente o mesmo 'hardware' como você.

O conselho mais útil que eu tenho é de obter-se em um estado onde você pode estar executando código C o mais rápido possível - as tabelas descritor ie inicialização, configuração, e obter-se a um ponto onde é seguro para executar compilado C. a maioria, se não todos o kernel deve estar em C, se você quiser manter a sanidade e continuar trabalhando nele. Montagem, enquanto exigido em alguns lugares, é tedioso e tende a ser difícil de depuração.

Em seu nível mais baixo o mínimo que um sistema operacional precisa ser capaz de fazer é dirigir o hardware de um sistema de alguma maneira e de alguma forma carregar um executar algum tipo de "código de utilizador." Se você estiver indo para começar com um PC, então você precisa escrever código que pode ser carregado por ela de algum dispositivo ou outro. PCs mais velhos têm uma BIOS no firmware que determina como as executa hardware alguma inicialização (pelo menos de vídeo, teclado, e alguma forma de armazenamento ou boot loader). (Actualização de Outubro de 2017: PCs mais novos têm EFI ou UEFI firmware ... que é em grande parte uma diferença pedante; a servir os mesmos fins para esta discussão)

.

Então, começar a aprender os detalhes de baixo nível de como usar o BIOS ou firmware outro, em seu sistema de destino. Ou seja, aprender a escrever um programa que o BIOS pode carregar e executar. Que acabará por se transformar em seu gerenciador de inicialização. Comece pequeno. Basta obter um programa que imprime:. "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 quiser)

De lá eu recomendo escrever um driver serial muito simples ... atualizar seu gerenciador de inicialização para inicializar alguns porta serial, e iniciar um download do mesmo. Então, ele pode executar o código que puxa toda. De lá escrever um pouco de inicialização que pode escrever para um outro conjunto de blocos (não temos implementado um sistema de arquivos ainda ... nem mesmo tabela de partição de análise, de modo que tínhamos acabado de lidar com intervalos de matérias de blocos no disco em primeiro ).

Nesse ponto o seu carregador de inicialização deve ser capaz de puxar novo código em toda a linha de série, despejá-lo em uma partição (sim, implementar tabela de partição manipulação de algum tipo ... se ela está em conformidade com as convenções de PC padrão é até você neste momento), e executá-lo.

A partir daí você deve ser capaz de trabalhar em características muito mais sofisticados. A partir desta base, você pode escrever e compilar um novo "núcleo" ... reiniciar o testbed, e ter o novo kernel implantado nele.

(seu bootloader deve levar algum sinal, como uma pausa sobre as linhas de handshaking série como um comando para pular o download e apenas arrancar a imagem existente; e ele deve lidar com algum tempo de espera, desta forma também).

De lá escrever uma shell camada e comando terminal muito simples? Um sistema de arquivos? Implementar comandos conteúdos novos executável diferente do kernel (arquivos ou objetos de algum tipo). E assim por diante.

Naturalmente, você poderia ter começado com um motorista de console usando o teclado do PC e vídeo (o 0x16h BIOS INT e outras coisas INT 0x10H, respectivamente, se bem me lembro). No entanto, eu sugiro começar com um motorista de série desde então você pode automatizar seu ciclo de build / deploy / teste de qualquer outro sistema existente (funcional). Desde o seu novo sistema operacional será iniciado como um projeto de cross-compilado que vai ser essencial para você ter uma maneira simplificada de lidar com isso.

Eu não sei o quão longe você quiser ter o seu projeto. A meta razoavelmente impressionante seria para atingir a "auto hospedagem." Se você pode criar um simples montador / compilador que pode permitir que você use o seu novo sistema operacional para (re) construir, link, e de inicialização em uma versão de trabalho do seu novo sistema operacional ... então que você conseguiu esse objetivo. (Note-se que não é uma exigência. Muitos sistemas embarcados são nunca vai ser auto-hospedagem e não há nada de errado com isso).

Se você não se importa com a virtualização de hardware, há um curso (livro + palestras + software) que irá levá-lo 'From Nand para Tetris'. Você cria um sistema completo do computador inteiramente-se da (para esses fins atômicas, e dado) porta NAND elétrica, através do direito de construir o sistema operacional, uma linguagem, e, finalmente, a codificação de um jogo simples em sua máquina pessoal.

Eu acho que é uma grande idéia e algo que eu totalmente intenção de ficar preso em breve. O livro é surpreendentemente barato e eu acredito que o curso é ministrado no MIT. Eu posso imaginar há maior sensação de ter o pleno conhecimento, completa de todo um sistema que você construiu-se a partir do zero.

Link: http://www1.idc.ac.il/tecs/

Gostaria de começar pequeno e comprar um kit de desenvolvimento de sistemas embarcados 8086, e desenvolver um sistema operacional multitarefa sobre isso. Uma vez que você tem um kernel e estão familiarizados com o trabalho ao nível do hardware, você estará pronto para fazer algo mais desafiador.

Construção mesmo um monitor VGA clone DOS é uma coisa bastante desafiador. Os detalhes são enormes. : -)

tópicos específicos.

Como faço para colocar o código no computador? É melhor fazê-lo com um disquete? Pode a maioria dos computadores fazê-lo a partir de um stick USB?

A BIOS fará bootstrapping elementar.


O que motoristas que eu preciso, e pode sugerir quaisquer referências para a construção desses?

qualquer coisa que não é operações de CPU / memória diretos. Qualquer coisa que não é directamente no manual de referência CPU.


Após a seqüência de inicialização - então o quê? Como faço para entrar em modo protegido etc.

Modo Protegido será parte da seqüência de inicialização.

então você começa a multitarefa e descobrir como iniciar processos.


Como faço para gerenciar a memória sem a ajuda de um sistema operacional? Eu só usar qualquer endereços que eu quero? Sem inicialização necessária?

Correto. Você provavelmente vai querer resolver um sistema de memória virtual, eventualmente.


O que vou, sem dúvida, correr em que vai me confundir?

não ter ferramentas de depuração, não tendo IO


Como posso fazer isso também uma linha de comando O / S, e um gráfico?

Com tristeza. Olhe para cima Windows 3.1 e Linux, em particular X windows.


O que é uma gráfica O / S construído em? Tipo, como eu faria algo assim, uma linha de comando, com um tipo de letra, e uma imagem no topo?

Olhe para cima janelas X.


conselho final: estudo linux / x janelas. Não é perfeito, mas fornece uma compreensão de um abordagem. estudo também sistemas embarcados.

Eu vejo muitas boas referências a sites de desenvolvimento OS, por isso vou descrever uma abordagem diferente:

Se você quiser a experiência de implementação de um sistema operacional de nu metal, há melhor escolhas de hardware do que um PC antigo. Com a arquitetura PC, você vai gastar uma enorme quantidade de seu tempo de codificação em torno desinteressante artefatos de sua história de design de 30 anos. Por exemplo, apenas a parte do bootloader do projeto provavelmente queimado muitos um programador valente.

Por exemplo, você precisará de um conjunto de drivers para ler seu kernel off de disco e / ou da rede. Então você vai precisar de código para entrar em modo protegido. Nesse ponto, você precisa de outro conjunto de drivers! Muito pouco do trabalho que você faz para obter o chip no modo protegido serão transferíveis depois desse ponto. Você quer executá-lo em um PC diferente + - 4 anos e você vai precisar de mais um conjunto de drivers

.

Olhe em bootstrapping um ARM ou outro 32-bit de chip "incorporado". placas de desenvolvimento de baixo custo estão disponíveis, ou você pode soldar o seu! Alguns têm built-in Ethernet e USB. Eu acho que você vai ter mais trabalho divertimento em uma sã, arquitetura non-duro, e talvez acabar com algumas habilidades reutilizáveis.

Mais do que qualquer outra coisa, se você quer este para rodar em hardware real, é absolutamente necessário uma cópia do manual do seu processador. Os manuais Intel ( http://www.intel.com/products/processor/manuals/) são de valor inestimável. Eles passar por cima de tudo, desde os modos de comutação (verdadeiro / protected) para gerenciamento de memória virtual (se você optar por ir tão longe) para fazer syscalls (se você já começa a fazer modo de usuário). Mais importante eles explicam em grande detalhe uma série de coisas que devem ser criados para coisas a função, como os registros de SST e segmentos, que a maioria dos textos OS não discutem, porque eles estão mais preocupados com conceitos de nível mais alto do que detalhes específicos do processador.

O Série Desenvolvimento OS @ BrokenThorn pode lhe interessar.

Tente ler o código de um pequeno, OS open-source básica, como MikeOS.

Como alternativa, sugiro os seguintes passos (deve ser divertido!):

  1. Escrever uma máquina virtual. Definir todas as suas instruções do processador de modo que você sabe que seu dentro do sistema e para fora. Interagir com SDL para teclado, mouse, a tela, o acesso de áudio. Mantenha-o simples para que você possa caber tudo na sua cabeça ao mesmo tempo. Ele não precisa ser uma máquina virtual state-of-the-art, apenas um que pode emular a função de um computador 'real'.
  2. Escrever um montador para o processador de sua máquina virtual. Lembre-se que esta necessidade assembler não ser um programa escrito na linguagem da máquina virtual, mas qualquer coisa que pode converter sua linguagem assembly para código de máquina.
  3. Definir um formato executável, e escrever um ligador simples.
  4. Você tem todas as partes para escrever o seu sistema operacional agora! Escrevê-lo na linguagem assembly, montá-lo ... etc .. você não precisa de um tal processo bootloading complicado, é só pegar a sua máquina para executar o seu sistema operacional primeiro.

As etapas acima pode parecer um bocado estúpido para escrever um sistema operacional simples, mas hey, é divertido maldita.

MikeOS . É um sistema operacional bastante simples escrita é legível (como na comentado) de montagem. Mesmo que a sua bastante simples, ele tem um GUI e suportes algumas redes e multimídia.

Editar : MenuetOS é gráfica. Seu também escrito é asm em linha reta, mas é mais sofisticado do que MikeOS

Você tem uma meta ambiciosa. Mas a execução é fundamental.

A maioria das abordagens estruturadas (livro ou classe de faculdade) irá orientá-lo através do processo, mas eles fornecem um monte de código âmago da questão que escamoteia os detalhes secretos da sua plataforma escolhida e permite que você se concentrar no grande- idéias imagem: agendamento de processos, gerenciamento de memória, prevenção de impasse, I / O, e assim por diante

.

O meu conselho é o seguinte:. Caminho de volta corte em suas expectativas e começar com uma pergunta básica

O que é um sistema operacional?

Um cientista da computação (espero) nunca digo que um sistema operacional é uma interface gráfica de usuário, ou um navegador web, ou uma maneira de ligar os dispositivos USB, ou qualquer coisa que um usuário pode realmente ver ou tocar. Em vez disso, um sistema operacional em seu nível mais fundamental são aquelas coisas que eu 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

.

Aqui está um sistema operacional simples: um programa permite o tipo de usuário em um programa (em hexadecimal ou binário) usando uma conexão serial. Uma vez que o programa foi digitado, ele executa o programa. Quando o programa estiver concluído, o controle é retornado ao usuário onde eles podem executar o programa novamente ou digite um novo.

Faça isso em uma arquitetura "limpa", como um processador ARM embutido com 64 K de memória ou assim. Você pode codificar isso em assembléia depois de alguns dias de aprender os meandros da ARM. E voila! , você tem-se um sistema operacional.

Ele faz tudo o que um sistema operacional é suposto fazer:

  • Ele gerencia a memória, não permitindo que o usuário sobrescrever o sistema operacional em si.
  • É horários um único processo para executar.
  • Ele lida com o I / O para o único periférico serial.

Isto dá-lhe um bloco de construção para começar. Você tem muitas opções agora. Talvez um deles seria permitir que dois programas a serem carregados na memória e deixar o usuário decidir qual deles para executar seguinte.

Ou você poderia deixar o usuário suspender a execução de um programa, mude para o outro, suspender, e voltar. Esta é multitarefa rudimentar, mesmo que seja totalmente manual.

As suas escolhas são ilimitadas, mas cada um é um pequeno passo do que você tinha antes.

É divertido se você não definir suas vistas muito alto!

Eu mantenho uma lista de recursos em StackOverflow: Como começar em operar o desenvolvimento do sistema . Por favor, adicionar novos recursos a ele como começar você está aventura (que estou prestes a começar :))

Muitas escolas têm aulas OS que fazer muito do que você descreve. A minha escola (CMU) ensinou OS em C, e escreveu um kernel, sistema de arquivos e shell, e foram fornecidos com código para um gerenciador de inicialização.

Infelizmente, eu não era capaz de encontrar qualquer recurso definitivo para este curso (15-412) na web, e ele evoluiu ao longo do tempo. Mas talvez as pessoas poderiam postar links para fontes e atribuições para as escolas que têm bons recursos na web.

Você pode desfrutar este tutorial chamado "Roll seu próprio brinquedo UNIX clone OS", é muito perspicaz e deve ajudá-lo em seu caminho.

Boa sorte.

Estudo do A2 Sistema (anteriormente chamado de sistema de Oberon ) para idéias que você pode roubar. É um OS gráfica construída por apenas duas pessoas, embora se admita que um é Niklaus Wirth. Lançado pela primeira vez por volta de 1990 e a velocidade é surpreendentemente bom. Há um livro de Gutknecht.

Sobre o baixo nível gráfico de programação, isso vai lhe dar um monte de informações: http: / /www.osdever.net/FreeVGA/home.htm . (É muito interessante para o modo texto também.)

O que, sem dúvida, correr em que vai me confundir?

Você vai perceber que no PC há uma enorme quantidade de material que é clara: o conjunto de instruções x86 em si é complicada, e quando você tem acesso direto ao hardware, ele pode demorar um pouco antes de você entender como escrever um único caracteres na tela.

Não se preocupe em disquete e tal, na maioria das vezes você vai usar um emulador como o Bochs ou QEmu.

Você pode querer considerar tomar uma olhada operando conceitos de sistemas, por Abraham Silberschatz - conceitos de programação de sistemas entendimento é um requisito fundamental, dar uma espiada no internos F / OSS do kernel de sistemas operacionais Linux * BSD e GNU / Linux , versões especialmente anteriores, que são, provavelmente, um pouco mais documentada. text alt text alt

Dê uma olhada Minix . Estudar o código fonte junto com " conceber sistemas operativos e Implementação ". Considere fazer contribuições para o projeto. Acho Minix é um sistema operacional muito bom e promissor na tomada. Também é bem financiado projeto. Isso significa que você pode até mesmo ser pago por suas contribuições!

É muito fácil graças ao fato de que o BIOS já tem muitas funções de entrada / saída incorporadas a ele para mudar o modo de tela, mudando de cor pixel, escrever um texto para a 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.

As cargas BIOS o primeiro setor do disco rígido e começa a executar o código de lá, para que o seu sistema operacional deve ser colocado com a primeira instrução no primeiro setor do disco rígido.

Este artigo Wikipedia deve começar em interrupções de BIOS para escrever texto para a tela, que recebe chaves do teclado e outras coisas. https://en.wikipedia.org/wiki/BIOS_interrupt_call

Mesmo se você planeja usar c ++ Eu recomendaria fortemente ler-se sobre a programação de montagem, como é vital para a compreensão de como funciona o hardware.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top