Emulando Linus Torvalds: crie seu próprio sistema operacional do zero (VII)

Bem-vindo a outro post sobre como criar nosso próprio sistema operacional (Artigos anteriores da série: 1, 2, 3, 4, 5 y 6) Já se passou muito tempo desde o último post, principalmente devido a um bug que encontrei no que temos hoje. Vamos ver como lidar com o clock em arquiteturas x86.

Anteriormente tínhamos ativado os IRQs de forma genérica, mas houve um pequeno problema, pois não os ativamos corretamente e passamos dados extras. Finalmente consertamos carlosorta e eu e eu podemos continuar a comentar sobre como continuar.

Bem, o relógio é um IRQ, especificamente o primeiro. Para configurá-lo usaremos a função que definimos anteriormente para instalar genericamente os IRQs, o ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; void ND :: Timer :: Phase (int hz) {int divisor = 1193180 / hz; ND :: Ports :: OutputB (0x43,0x36); ND :: Ports :: OutputB (0x40, divisor & 0xFF); ND :: Ports :: OutputB (0x40, divisor >> 8); } void ND :: Timer :: Wait (int ticks) {unsigned long eticks; eticks = ND_TIMER_TICKS + ticks; while (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Screen :: PutString ("\ nTemporizador de configuração ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Screen :: PutString ("feito"); } extern "C" void ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; if (ND_TIMER_TICKS% 18 == 0) {// ND :: Tela :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString ("\ nMais um segundo"); DEVEMOS FAZER UMA TELA DE ATUALIZAÇÃO}}

O código é executado da seguinte maneira: as chamadas de sistema de inicialização ND :: Timer :: Setup, que chama ND_IRQ_InstallHandler inserir na primeira posição, o IRQ0, uma função de callback quando o evento ocorrer, ou seja ND_Timer_Handler que aumenta o Carrapatos. Como definimos a velocidade do clock para 18 Hz, como veremos mais tarde, se dividíssemos por 18 e nos desse um inteiro, um segundo teria se passado.

A função ND :: Timer :: Fase Isso nos ajuda a ajustar a velocidade do cronômetro, esse número extravagante é 1.19 MHz, que é um valor comum. Bem, devemos chamar esta função se quisermos alterar a velocidade do cronômetro, por padrão vai para 18,22 Hz, um valor peculiar que alguém deve ter decidido dentro IBM e permanece até hoje.

A função ND :: Timer :: Wait é muito simples, basta esperar com um loop enquanto até o Carrapatos necessário para continuar.

Na imagem, podemos ver que se descomentarmos o código dentro do ND_Timer_Handler, obtemos o seguinte:

Segundos no NextDivel

No próximo capítulo, veremos como ler a entrada do teclado e fazer um pouco concha para interagir com nosso sistema. Como sempre, o código está disponível em GitHub sob a licença GNU GPL v2.


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   Noé dito

    Série de tutoriais muito interessante, pessoalmente não tinha visto muitos sobre como criar uma distribuição Linux do zero, e menos ainda em espanhol e tão completo. Acho que você pode aprender muito com isso e, assim que tiver tempo, espero poder fazer esses tutoriais.
    Só peço que não desanime e termine o tutorial, pois encontrei muitos tutoriais bons que nunca terminam.
    Saudações e obrigado :).

    1.    caminhoneiro dito

      Não é uma distribuição Linux, é um kernel 😛.

    2.    desidratador dito

      Você está errado. Criar uma distro linux não implica programar nada, por exemplo, em um linux do zero você não programa, o que você faz é instalar (baseado na compilação), pacotes básicos que compõem uma distro. Isso é muito diferente. Ele está criando seu próprio sistema operacional. Não tem nada a ver com o Linux. Foi isso que torvalds fez em sua época inspirado no minix, e com aquela discussão acalorada e popular entre torvalds e Andrew s. tanenbaum em kernel monolítico vs microkernel.

      Saludos!

  2.   Illukki dito

    Obrigado che. Até agora não prestei muita atenção ao seu post, mas estou em um projeto, então vou dar uma olhada neles.
    Saudações.

  3.   caminhoneiro dito

    Vale ressaltar que outras linguagens podem ser utilizadas, como Objective-C (++), C ++, D ou Rust.

    1.    AdrianArroyoStreet dito

      Isso está em C ++, não em C. No entanto, é difícil ver as diferenças, pois muitos operadores C ++ requerem um suporte de biblioteca, como os operadores new e delete. Seria muito interessante fazer um sistema operacional em Rust. Na verdade, existe um canal IRC dedicado a sistemas operacionais em Rust (# rust-osdev em irc.mozilla.net). Qualquer pessoa que compila em código de máquina realmente vale a pena, incluindo Java se usarmos GCJ.

      1.    caminhoneiro dito

        Sim, de fato, Rust é uma linguagem muito interessante para sistemas operacionais, porque não só é mais fácil de aprender do que C ou C ++ (ainda continua com mudanças contínuas, mas é mais fácil), mas é muito mais segura.

  4.   caminhoneiro dito

    Na década de 70 era bastante comum programar diretamente no hardware, sem SO.

  5.   Christopher dito

    Excelente ... agora só preciso entender: 3 ...

  6.   mmm dito

    Oi. Muito obrigado por esses artigos. Mas, se eu não tenho conhecimento de programação, acho que não devo fazer isso, certo? Quer dizer, senão seria um «bom, e agora o que copio e colo?» ... que pena, sempre quis tanto saber programar e nada, sou mais burro!

    1.    desidratador dito

      Não se culpe, você não é um burro. Para começar, nem todos os programadores sabem escrever um kernel, é uma tarefa muito pequena e simples e, na prática, maior. Por exemplo, aqui o autor cria drivers genéricos para o teclado e a tela, manipulando o array da tela, que é um método que não é usado hoje. Os tty no Linux hoje são muito, muito complexos e não dependem da arquitetura x86 ter um array de telas à sua disposição. Além disso, muito do código em C depende da arquitetura, quando o ideal é fazer o código da arquitetura em assembler e que o código C funcione em qualquer processador. No entanto, não estou depreciando o autor, pois um kernel adquire as características que hoje consideramos normais em um kernel linux, por exemplo, não é uma tarefa fácil, e tenha a certeza de que uma única pessoa é absolutamente incapaz de fazê-lo. Para algo, os grandes projetos como linux, gcc, glibc, etc, não são feitos por uma única pessoa, mas são muitos colaboradores.

      Além disso, se você deseja iniciar a programação, você tem alguns guias na web, embora seja necessário ter cuidado e selecionar os guias bons. Comecei a programar em linux pulando na piscina com a cabeça e sem água (ou seja, com a amada linguagem C), embora agora tenha algumas noções básicas de python (que também é uma linguagem muito boa). Existem alguns livros C em que, na página 6, você desiste da dor de cabeça que sente, mas, mais do que livros, essas coisas são adquiridas com a experiência. Acontece como no modelo de rede OSI. A documentação sobre o modelo osi é absolutamente impossível de entender para o recém-chegado, mas se você encontrar um site com uma boa explicação das camadas de rede, rapidamente obterá os conceitos para lidar com documentos técnicos, como RFCs.

      Em suma, existem bons sites e manuais por aí, é uma questão de ir até eles e encontrar um bom material.

      lembranças

  7.   Liberdade dito

    Olá, depois de todas as tentativas para resolver o "erro: nenhum cabeçalho multiboot encontrado." e «erro é necessário carregar o kernel primeiro», visto que não consegui encontrar em lado nenhum a solução para o problema do primeiro artigo, que alguns como eu tinham ... aqui está a solução, se funcionar para alguém ...

    Não sei se a minha teoria da causa do erro está correta, mas enfim, a questão é que ao compilar os arquivos em um sistema operacional de 32 bits, não gerou o erro, mas como tenho um sistema operacional de 64 bits (Gnu / Linux Debian 7), e que ao compilar e testar eu obtive o erro "no multiboot header found", e há uma dúvida, então na minha opinião o erro é devido ao ambiente ou arquitetura do sistema operacional no qual estamos compilando nossos arquivos ... e bom o que fiz foi compilar meus arquivos, especificando o ambiente ou arquitetura de 32bits ..
    * sudo as -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding
    O estranho é que tenho algumas dúvidas hahaha, então o sistema operacional que estamos criando passo a passo é para uma arquitetura x86 ou estou errado ajajaj….

    PS: alguém para me ajudar com a dúvida, e desculpar alguns erros ortográficos ou minha má expressão, e bem, eu não sou perfeito então «A perfeição tem seu preço» .... E o mais importante, emular um sistema operacional 32-bit, solução sagrada … .Hahaha

    1.    martin villalba dito

      Gênio! Eu realmente queria fazer este tutorial e comecei com aquele erro haha

  8.   Oscar dito

    Parabéns, é uma excelente contribuição. De agora em diante, compartilho com você que seu bom trabalho através de mim e de outros será estendido;

    lembranças