12 pontos por GN⁺ 2025-06-29 | 4 comentários | Compartilhar no WhatsApp
  • Compartilhamento da experiência de tentar portar o sistema operacional Xv6 usando uma CPU baseada em ISA RISC projetada do zero e um compilador C próprio desenvolvido durante um projeto universitário
  • O projeto foi conduzido criando diretamente todos os elementos, como projeto da CPU, desenvolvimento do compilador C (Ucc) e port do Xv6
  • Para fazer o OS funcionar, a equipe encarou o desafio de projetar funções centrais de hardware e software, como interrupções, memória virtual e cache
  • Durante o processo de portar o Xv6, enfrentaram diversas dificuldades, como problemas de portabilidade, depuração complicada e bugs de cache, mas conseguiram resolvê-las por conta própria
  • Conseguiram até rodar aplicações interativas como SL, Minesweeper e 2048, além de um programa de ray tracing, alcançando uma grande conquista educacional e técnica

Visão geral do projeto

  • Este projeto é uma atividade experimental emblemática do Departamento de Ciência da Informação da Universidade de Tóquio, com foco em dar aos alunos experiência prática com execução de aplicações, criação de compiladores e projeto de CPU e hardware
  • O objetivo do projeto era implementar diretamente em FPGA a ISA de uma CPU projetada pela própria equipe, criar a toolchain em C (Ucc) correspondente e expandir isso para o port de um sistema operacional como o Xv6
  • A maior parte do processo experimental foi conduzida por meio de aprendizado autodirigido

Experimentos com CPU e tarefas

  • Equipes de 4 a 5 pessoas participavam do projeto de uma nova arquitetura de CPU, sua implementação em FPGA e o desenvolvimento de um compilador para essa arquitetura
  • Depois de criar um compilador para um subconjunto de OCaml, executar um programa de ray tracing era um item obrigatório de avaliação
  • Se sobrasse tempo, cada grupo podia definir seus próprios desafios; alguns alunos realizaram experimentos expandidos como aceleração da CPU, desenvolvimento multicore e execução de música/jogos
  • O Group 6, em especial, definiu como meta o port de sistema operacional, e a partir daí foi formada uma nova equipe conjunta, o Group X

O OS Xv6 e o desafio do port

  • Foi escolhido como alvo de port o Xv6 (baseado no Unix v6 e voltado para x86), desenvolvido pelo MIT para fins educacionais
  • Embora o Xv6 seja um OS simples baseado em Unix, havia vários obstáculos, como a necessidade de um compilador C89, interrupções especiais, suporte a endereços virtuais e baixa portabilidade para execução em hardware real
  • O Xv6 foi feito assumindo características do x86, como char com 1 byte e int com 4 bytes na linguagem C, o que causou muitos problemas durante o port

Desenvolvimento do compilador e da toolchain (Ucc)

  • Nos experimentos anteriores, o padrão era desenvolver um compilador para OCaml, mas para rodar o Xv6 era necessário um compilador C89, então a equipe decidiu criá-lo por conta própria
  • Com base no protótipo de compilador C de um dos membros, construíram internamente uma nova toolchain, o Ucc
  • Além do compilador, também projetaram diretamente um Primitive Linker e ferramentas de depuração

Projeto da CPU e do simulador

  • Após projetar o circuito da CPU em uma linguagem de descrição de hardware (HDL, como Verilog / VHDL), ela foi implementada em um FPGA real por meio do processo de síntese lógica com ferramentas como Vivado/Quartus
  • O processo repetitivo de síntese lógica levava muito tempo e, na prática, envolvia longos períodos de espera
  • Depois das funções básicas da CPU, também projetaram separadamente o suporte de hardware necessário para rodar o OS, como interrupções, MMU e TLB
  • A CPU concluída recebeu o nome de GAIA
  • O simulador passou a incluir interrupções reais, tradução de endereços virtuais e ferramentas de depuração

Problemas no processo de port e como foram resolvidos

  • Devido à baixa portabilidade do Xv6, surgiram comportamentos anormais conforme as especificações da CPU e do compilador
    • Exemplo: problemas como quebra da aritmética de ponteiros e da estrutura da pilha porque char e int estavam definidos como 32 bits
    • No compilador Ucc, fizeram ajustes para que char passasse a ter 8 bits
  • O tratamento de interrupções era uma área particularmente difícil, então foram adicionadas ao simulador próprio ferramentas de depuração como desassemblador e dump de estado
  • O problema de cache alias ocorreu porque o GAIA usava endereços virtuais como índice de cache, e isso foi resolvido com a técnica de Page Coloring

Resultado final: execução do OS e dos apps

  • Em 1º de março, finalmente conseguiram rodar o Xv6 por completo tanto no simulador quanto na CPU real (hardware)
  • Conseguiram executar apps interativos como mini curses próprio, comando SL, Minesweeper e 2048
    • No caso do 2048, adicionaram suporte a entrada non-canonical
    • Também adicionaram ao Xv6 recursos equivalentes a ioctl e termios no estilo POSIX
    • Implementaram ainda um pequeno assembler, mini vi e outros recursos, concretizando um verdadeiro “ambiente de programação em tempo real”
  • O programa de ray tracing também foi executado sobre o sistema operacional, superando o objetivo original do experimento

Significado do projeto e casos posteriores

  • Depois deste experimento, várias gerações de alunos continuaram criando suas próprias CPUs e sistemas operacionais para realizar diferentes experimentos
    • Por exemplo, expandindo para adoção de ISA RISC-V, OS próprio e execução de Linux
  • Ao experimentar diretamente toda a stack de hardware e software, os participantes aprofundaram a compreensão prática sobre algoritmos, integração hardware-software e estruturas de baixo nível
  • Embora haja críticas de que “reinventar a roda” é ineficiente, o efeito de aprendizagem e a diversão de realmente construir tudo são enormes

Demonstração prática e código-fonte

  • É possível testar diretamente em GAIA CPU + Xv6 demo
  • A versão portada para MIPS está disponível como open source aqui

Conclusão

  • O texto enfatiza a lição de que “não há nada que ensine mais do que construir com as próprias mãos”, junto com a importância da experiência de integração entre hardware e software
  • Os alunos das gerações seguintes também continuam desafiando novas metas, com a expectativa de que no futuro seja possível rodar Linux ou VMs sobre uma ISA própria
  • A narrativa se encerra com os nomes dos membros que participaram do projeto

4 comentários

 
regentag 2025-07-01

Dá até inveja poder ter esse tipo de experiência na faculdade. Parece que seria muito divertido..

 
qlghwp123 2025-06-30

Deve ter sido muito divertido.

 
iolothebard 2025-06-30

Role mais para baixo…

Criar uma CPU de 8 bits…?
https://eater.net/8bit

 
GN⁺ 2025-06-29
Comentários no Hacker News
  • Isso me lembrou de um projeto em grupo que fiz na faculdade, com três pessoas, durante 3 semanas. Entre vários temas, havia a opção de criar um sistema operacional bem básico do zero, então perguntamos aos professores se poderíamos portar o MINIX3 para o Raspberry Pi, e eles autorizaram (parecia viável porque o MINIX3 já tinha um porte ARM para o BeagleBoard).<br>Foi muito mais difícil do que esperávamos, e surgiram vários problemas técnicos que jamais imaginávamos. Em especial, sofremos porque o Raspberry Pi 3 inicializava em modo hypervisor em vez de modo supervisor, e a precisão da emulação de Raspberry Pi no QEMU era tão ruim que era quase inútil para desenvolvimento de OS. Passamos uma semana inteira presos em depuração de hardware de baixo nível tentando encontrar uma solução. <br>No fim, conseguimos fazer um porte funcional com drivers de UART, GPIO e framebuffer, e rodamos com sucesso no Raspberry Pi 2 e 3. Fizemos a apresentação no hardware real, usamos um shell script para exibir a imagem do ramdisk e monitoramos os pinos GPIO para avançar e voltar os slides, operando manualmente ao curto-circuitar os pinos com uma faca. Em termos de originalidade, foi uma apresentação absurdamente incrível, e acho que ainda devo ter essa imagem de SD card até hoje

    • Parece ter sido uma experiência incrível<br>Na hora em que vocês sugeriram portar o MINIX3 para o Raspberry Pi, dá até para imaginar que os professores já esperavam que desse errado<br>Quando a precisão da emulação de Raspberry Pi no QEMU era ruim, eu usava a estratégia de primeiro fazer o OS funcionar no QEMU e depois contar com a sorte no hardware. Mesmo assim, funcionava bem<br>Fiquei curioso sobre como vocês fizeram a depuração no Raspberry Pi real

    • Ouvir que você usou uma faca para curto-circuitar o GPIO me fez lembrar de quando iniciei uma placa-mãe ATX sem botão de energia, curto-circuitando os dois pinos de power Ainda assim, o seu setup era muito mais estiloso. Mandou bem

  • Na SFU, fiz algo parecido há 25~30 anos. Não cheguei a colocar um OS e um compilador, e também não foi um projeto em equipe<br>Se esse tipo de experimento te interessa, recomendo Turing Complete, que tem guias e ferramentas bem acessíveis. Dá para ir de alguns gates até um computador de verdade. Também dá para compartilhar comunidade e componentes, e há um core RiscV. É realmente divertido, então recomendo experimentar no Steam<br>Link do Turing Complete na Steam

    • Isso me lembrou uma versão em jogo do nand2tetris, com a qual me diverti bastante no passado. Também vale a recomendação
  • Esse texto me fez lembrar de um projeto acadêmico(?) meio parecido. Pelo menos lembro que havia um compilador C customizado e um OS customizado. Não lembro exatamente o nome

  • Referência a um tópico relacionado publicado anteriormente: link do post anterior

  • Quando você vai construindo CPU + compilador + OS por conta própria, não existe uma plataforma subjacente. Eu sou a plataforma.<br>Bug vira a própria lei do sistema. Normalmente a gente depura dentro de camadas de abstração feitas por outros, mas aqui até essas regras fui eu mesmo que defini. O OP basicamente depurou as próprias regras

  • Realmente impressionante. Trabalhos na camada low-end geralmente são entediantes e consomem muito tempo, ainda mais sem ferramentas essenciais como um depurador

    • Se você nunca depurou um kprintf esquisito com um osciloscópio, então ainda não provou o verdadeiro sabor do baixo nível
  • Magic-1 e BMOW também fizeram algo semelhante no passado<br>Para mais detalhes, veja homebrewcpu.com<br>Para uma lista de sites de CPUs caseiras, veja homebrewcpuring.org

  • Agora chegou a hora de, em vez de implementar isso em FPGA, correr para um laboratório de semicondutores e pedir que fabriquem a CPU diretamente