Olá, meu nome é Lucas Wasilewski e no último mês me deparei com esse vídeo, sinceramente fiquei tão empolgado com a ideia de poder criar uma "CPU" que coloquei esse projeto como prioridade na minha lista e algumas semanas depois aqui estamos. Esse artigo tem o objetivo de tentar te deixar muito animado ao ponto de você também desenvolver a sua própria CPU ou pelo menos um emulador dela.
CPUs
Antes de começar a sair pensando em como sua CPU vai parecer ou o nome dela, vamos dar um passo para trás e entender qual é o papel de uma e um pouco de sua história.
O ENIAC um dos primeiros computadores programáveis a serem construídos conseguia resolver uma grande quantidade de problemas, um deles sendo as distâncias que projéteis de artilharia podiam alcançar, sendo um grande benefício pro governo norte americano que tinha investido nisso na segunda guerra mundial.
Por mais que isso fosse uma revolução pra época, o ENIAC tinha uma desvantagem, cada programa tinha que ser construído do zero, ou seja, os programadores tinham que levar semanas para pensar no programa e plugar os cabos nos lugares certo (isso sem contar o tempo que levavam para corrigir bugs e outras coisas).
Para resolver esse problema de desenvolvimento foi criada a possibilidade de guardar o código na memória e da máquina ter instruções para interpretar esse programa, facilitando e permitindo uma melhor maneira de ser codificada.
John von Neumann foi o consultor de ambos ENIAC e seu sucessor o EDVAC, foi responsável também por construir a arquitetura de von Neumann que é de onde vem o nome da Central Processing Unit(CPU) nela todas os chips de aritmética, lógica e controle de IO ficam armazenados juntos e através de instruções ela consegue controlar o funcionamento do programa.
Atualmente, chamamos nossos processadores de CPU porque são projetados para realizar operações em velocidades absurdas. No entanto, se você, assim como eu, não tem uma mega corporação para minerar silício e criar placas com essa potência, a melhor alternativa será o nosso próximo tópico.
Emuladores
Emular uma CPU não é uma tarefa tão difícil quanto parece, apenas precisamos entender seu funcionamento básico e o resto é apenas programação.
O ciclo básico se dá por quatro passos:
-
Primeiro: Precisamos de um guia, ele vai quem vai indicar onde estamos e para onde vamos, vamos chamá-lo de PC ou
program counter
e então começamos a ler o programa - Segundo: Vamos buscar na memória a posição que o PC indica e carregá-la
- Terceiro: Decodificaremos a instrução que foi carregada para localizar os valores que vamos utilizar para nossa operação
- Quarto: Realizamos a instrução e incrementamos o PC.
Siga com esses passos até não encontrar mais nenhuma instrução e seu programa foi realizado.
Por mais que esse ciclo pareça bem simples, imagine que as CPUs modernas realizam essa operação a 3.5GHz, ou seja, a 3.5 bilhões por segundo. Comparando ao ENIAC que fazia 5.000(5kHz) operações matemáticas por segundo, isso é um aumento de 69,800% na velocidade de processamento, um número tão absurdo que hoje em dia um computador simular a outro é algo relativamente fácil.
Existem muitos artigos por aí ensinando como emular chips mais fracos como o: CHIP8 ou o muito respeitado 6502, que foi um dos microprocessadores que revolucionou áreas como a de desktop sendo a CPU principal do AppleII e do Comodore 64 ou a de Vídeo-Games integrando grandes consoles como o Nintendo Entertainment System(NES) e o Atari 2600.
Emular é algo mais do que apenas conseguir rodar jogos antigos e nostalgia, é sobre história, preservação e teimosia. Muitas pessoas gastaram dias, semanas e meses fazendo reverse engineering de instruções e mapeando cada componente daquele processador para que as pessoas pudessem entender como cada parte se comporta em determinada situações.
Agora chega de história e vamos começar a pensar em como emular a sua CPU.
Sua CPU
O Trabalho dela
Sua CPU vai ter vídeo? Essa é uma pergunta importante.
Várias CPUs antigas incluíam suporte a exibição gráfica, por isso contavam com partes da memória dedicadas para ter funções que fariam o display de vídeo mais fácil.
O CHIP8 por exemplo, especifica que os bitmaps das fontes ficassem nos primeiros 512 bytes da memória e tinha instruções próprias para desenhar pixels em uma tela de 64x32.
Fora isso, comece a imaginar os problemas que você quer que ela resolva, funções matemáticas como multiplicação, divisão, exponenciação ou radiciação podem ser essenciais se você queria resolver funções ou gerar estatística, porém, podem ser péssimos se você apenas queira simular o game of life.
Memória
Sua CPU provavelmente vai querer guardar o programa dela na memória para evitar que os programadores passem semanas colocando os cabos nos lugares corretos como no ENIAC. Para isso pense na memória como um array ou vetor na sua linguagem de programação preferida, armazenar algo nela pode ser algo tão simples quanto indicar que aquela posição terá aquele valor.
Registers
Um register é uma parte da memória de fácil acesso para a CPU, eles serão responsáveis por guardar valores que vão ser utilizados pelo seu programa ou por ela mesmo.
Como estamos emulando, não precisamos necessariamente colocá-los dentro da memória, em C por exemplo, eles podem ser campos de uma struct, isso irá facilitar em muito a sua vida
Suas instruções
De todas as partes arquiteturais essa é com certeza a mais divertida.
Op Codes
A CPU apenas entende binário. Isso é sua grande vantagem e desvantagem, por isso, iremos facilitar nosso entendimento criando mnemônicos que irão traduzir a linguagem humana para a linguagem de máquina. Então
MOV a, 1
Resulta em:
0001 0101 0001 0000 0000 0000 0000 0001
Sendo:
- Os 8 primeiros bits o código binários para o comando
MOV
- Os próximos 8 bits para os registradores, nesse caso apenas o
a
foi usado, resultando no binário:0001
- E o últimos 16 bits sendo um valor decimal
Esse exemplo é da minha própria CPU e Assembler! Se você quiser ter um modelo de seguir ou ficou curioso, por favor cheque o projeto em https://github.com/WasixXD/Wasilewski
O número de bits que você reservar para a instrução também define a quantidade de comando disponíveis, ou seja, se reservar apenas 4 bits para as instruções o máximo de comandos que poderá ter será de 2⁴ ou seja 16.
Desafios que irá encontrar
Esse projeto não tem conceitos muito complicados, porém pode sair fora do controle muito rápido, então tome cuidados com os seguintes pontos:
Debuggar binário
Escrever binário na mão é muito difícil, considere antes de escrever a sua CPU escrever um Assembler que consiga gerar os binários corretos, isso vai economizar muito do seu tempo.
Testes
Testes são uma grande base para qualquer projeto, e nesse não é diferente, sempre cheque se sua CPU está realizando os comandos corretamente, e a vantagem é que você não precisa fazer os testes na mesma linguagem que você programou ela, eu por exemplo, fiz ambos CPU e Assembler em C, porém os testes unitários foram feitos em Python apenas pela facilidade.
Tipo de arquivo
Para carregar os programas escolha bem o tipo de arquivo, se optar por colocar os programas em um arquivo de texto vai ter que ler linha por linha, o que pode geral comportamentos não muitos preditivos já que esses arquivos podem conter espaços ou quebras de linhas.
Memória
De todas as operações as de memória são as mais difíceis, pois:
- Não há certeza do que foi escrito no inicio do programa foi sobrescrito
- O Endereço do que foi escrito pode ter sido perdido
- O valor que quer ser armazenado na memória pode ser muito grande ou é diferente do que ela aceita.
Em dúvida consulte como as CPUs modernas lidam com esse problema.
E depois?
Se você conseguiu superar todas essas adversidades e sucedeu em criar sua CPU, parabéns!. Agora desenvolva em cima dela, corrija os erros, adicione coisas únicas, afinal é a sua CPU e nenhuma Intel ou AMD pode entrar no seu caminho para a supremacia.
Programming is the art of telling another human being what one wants the computer to do. Donald Knuth
Refêrencias
https://www.hp.com/ca-en/shop/offer.aspx?p=computer-history-all-about-the-eniac
https://www.columbia.edu/cu/computinghistory/eniac.html
https://en.wikipedia.org/wiki/ENIAC
https://research.swtch.com/6502
https://www.youtube.com/watch?v=7w8IeXKstJY&list=WL&index=19&t=824s
Top comments (0)