Conselho para um estudante ambicioso na criação de seu próprio kernel [fechado]


18

Eu sou um estudante universitário muito ambicioso que deseja aprender praticamente tudo o que há para saber sobre computadores (bata-me se quiser, eu amo aprender). Recentemente, pensei que seria um projeto divertido (embora demorado) projetar e construir meu próprio kernel.

Obtive algumas informações básicas e concluí que preciso dominar o Assembly e o C / C ++ para realmente fazer esse trabalho. Enquanto estou trabalhando nisso, eu gostaria de aprender como um kernel realmente funciona da perspectiva da programação. Passei horas navegando no código do kernel do linux, mas isso só pode levar você até agora.

Quais são as etapas básicas na construção de um kernel? Coisas que você precisa resolver? Encomendar ou fazer coisas? Eu sei que estou mordendo muito, mas estou determinado o suficiente para lidar com isso.


12
Não há necessidade de bater em você por querer aprender tudo. Mas se você está pensando em realmente tentar, é melhor ter vida útil prolongada, um cérebro sobre-humana e há outros planos para sua vida;)

2
Espero ter todos esses! Na verdade, não, eu só tenho um desejo avassalador de aprender.
06

@delnan Possível esquizofrenia paranóica também é uma vantagem: templeos.org
DanteTheEgregore 4/13

@DanteTheEgregore What the?
Panzercrisis 12/03/2015

Respostas:


34

O que você precisa fazer é projetar o sistema operacional. Mesmo que, por exemplo, você decida que deve ser um sistema semelhante ao UNIX, ainda há muitas decisões a serem tomadas. Quanto você quer que seja o UNIX? Quais partes do UNIX você gosta e quais você acha que precisam ser aprimoradas?

Se você não está decidido a ser semelhante ao UNIX, acaba tendo ainda mais perguntas a responder: os processos devem formar uma árvore ou são "planos"? Quais tipos de comunicação entre processos você deseja apoiar? Deseja que ele seja multiusuário ou apenas multi-tarefa (ou possivelmente uma tarefa)? Deseja que seja um sistema em tempo real? Que grau de isolamento você deseja fornecer entre as tarefas? Onde você deseja que caia na escala monolítica versus micro-kernel? Até que ponto (se houver) você deseja que ele suporte a operação distribuída?

Eu geralmente aconselham contra a estudar o kernel Linux para sua inspiração. Isso não é nada contra o próprio kernel do Linux, mas um simples fato de que o Linux se destina principalmente ao uso em produção, não à educação. Possui muita otimização, hacks de compatibilidade com versões anteriores, etc., extremamente úteis para produção, mas com maior probabilidade de distrair do que educar.

Se você encontrar, uma cópia do livro de Lion ( Comentário do Lions no UNIX 6ª Edição , com Código-Fonte , de John Lions) é um ponto de partida muito mais fácil. A 6ª Edição do UNIX ainda era pequena e simples o suficiente para ler e entender rapidamente, sem ser um sistema de brinquedos simplificado demais.

Se você planeja segmentar o x86 (pelo menos principalmente), convém consultar o MMURTL V 1.0 de Richard Burgess. Isso apresenta um sistema para o x86 que usa o hardware x86 muito mais do que os projetistas de CPU originalmente pretendiam - algo que os sistemas mais reais evitam em favor da portabilidade para outros processadores. Como você pode imaginar, isso tende a ser muito mais orientado para o final das coisas. As cópias impressas parecem caras e difíceis de encontrar, mas você pode fazer o download do texto e do código gratuitamente.

Felizmente, também existem muito mais possibilidades - Projeto e Implementação de Sistemas Operacionais , de Andrew Tanenbaum e Albert Woodhull, por exemplo.


Uau, obrigado pela boa resposta. Vou dar uma olhada em todos esses livros.
N

7
Adicionei links para PDFs do livro e da fonte. O incrível da fonte do v6 UNIX é que ele tem 100 páginas, com 100 linhas por página. E em 10.000 linhas de código, você tem um sistema operacional completo e multitarefa . Se você realmente entender o código em torno do famoso comentário na linha 2238, "Você não deve entender isso", poderá se dar uma Estrela Dourada e um Mestre Honorário. Desfrutar!
precisa

Obrigado pelos links! Agora eu tenho que descobrir onde para imprimir esta ....
n0pe

1
Minix (o livro de Tannenbaum) foi desenvolvido para a educação e pode ser exatamente o que é necessário aqui.

@PeterRowell, dmr declarou que era um erro no cm.bell-labs.com/who/dmr/odd.html

12

Sugiro começar com uma pequena tarefa altamente focada: usando assembly, escreva um programa de inicialização de brinquedo. Não precisa fazer muito. Você deseja que o computador carregue o programa automaticamente quando for inicializado, imprima uma mensagem confirmando que está em execução, leia alguma entrada do teclado, imprima outra mensagem e desligue o computador.

Isso traria vários benefícios:

  1. Você acabará precisando de um processo de inicialização para o seu kernel, portanto não será um exercício inútil.
  2. Isso lhe dará a prática de escrever em montagem.
  3. Isso dará à sua prática a escrita de rotinas de IO de baixo nível. Como você escreve uma mensagem na tela ou lê um pressionamento de tecla quando não há um sistema operacional para você ligar?
  4. Isso lhe dará experiência na pesquisa das minúcias técnicas da CPU e da placa mãe. (Primeira pergunta: como sua placa-mãe / CPU encontra um programa inicializável quando é iniciado?)
  5. Escrever kernels tornou-se uma tarefa muito sofisticada, com uma tonelada de sutilezas. Essa tarefa fornecerá algo para você começar e talvez evitar que você se perca no mato antes mesmo de começar.

Depois de fazer isso, você terá uma idéia muito melhor do que está se metendo.


Obrigado por isso, acho que é exatamente isso que vou tentar fazer. Mais leitura no meu futuro.
06

7

Aprender a programar no assembler é um bom primeiro começo e fazê-lo no MSDOS 6.0 pode ser útil também devido à falta de recursos internos.

Ler um bom livro como o Operating System Concepts seria um bom começo para projetar seu próprio kernel. Você terá que lidar com o carregamento de inicialização, gerenciamento de driver de dispositivo, interface com BIOS, criação e gerenciamento de sistemas de arquivos, agendamento de programas, carregamento e descarregamento de programas, implementar pelo menos algum tipo de shell (muito mais fácil do que criar um sistema de janelas).

O C / C ++ só funcionará se o seu kernel for compatível com as bibliotecas padrão para essas linguagens; caso contrário, você também precisará escrever uma cópia dessas bibliotecas.

Isso nem está começando a pensar em multithreading, segurança do sistema, rede.


7

O Minix é um bom clone do Unix (que inspirou o Linux), que foi escrito para ensinar.

Andrew S. Tannenbaum é um excelente escritor e professor e escreveu um livro inteiro sobre sistemas operacionais usando o Minix como exemplo (e inclui o código fonte a seguir): http://en.wikipedia.org/wiki/Operating_Systems:_Design_and_Implementation

Pessoalmente, acho que ele é um escritor um pouco melhor do que programador, então algumas coisas não são tão claras quanto eu gostaria pessoalmente, mas - ei - isso funciona!

Eu recomendo enfaticamente olhar para isso como um recurso de aprendizado. Também lhe dará uma idéia da quantidade de trabalho necessária para realmente produzir algo que possa realmente ser útil.


Eu recomendo obter o livro físico. É mais fácil fazer anotações.

Na verdade, penso nisso, acho que vi o livro na Amazon barato. Eu posso chegar lá. Obrigado
n0pe

Observe também que esta é a terceira edição. Acredito que usamos a primeira edição quando eu participei do curso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.