Skip to content

Latest commit

 

History

History
230 lines (179 loc) · 16.3 KB

README_pt.md

File metadata and controls

230 lines (179 loc) · 16.3 KB

Universidade de Programação de Baixo-Nível

O que é esse repositório?

Esta página é para iniciantes que querem ser programadores de baixo nível (low-level).

Eu me inspirei no google-interview-university. Gostaria de compartilhar minha experiência e mostrar um roteiro para se tornar um programador de baixo nível, pois descobri que essas habilidades não são tão comuns como eram antigamente. Além disso, muitos estudantes e principiantes me perguntam como poderiam se tornar programadores de baixo nível e engenheiros de kernel Linux.

Esta página pode não incluir todos links/livros/cursos. Por exemplo, esta página apresenta o Arduino, mas não há informações detalhadas sobre Arduino e sistemas embarcados. Você deve ir mais longe buscando se aprofundar no assunto. Você tem a palavra-chave "Arduino" no qual você pode iniciar. Então, o próximo passo é provavelmente pesquisar no google por Arduino, comprar um kit e fazer algo para si mesmo. Lembre-se que esta página é apenas um roteiro.

Para mais informações, Eu tenho mais de 10 anos de experiência como programador de baixo nível:

  • Programação com linguagem Assembly para x8086
  • Dispositivo de hardware com chip Atmel e firmware
  • Programação de sistemas Unix com linguagem C
  • Drivers de dispositivos Linux
  • Kernel Linux: Paginação
  • Kernel Linux: Block Device Driver(Driver de dispositivo de bloco) e Módulo md

O que é programação de "baixo-nível"?

Classifiquei a programação de baixo nível (low-level programming language) como uma programação muito próxima da linguagem de máquina, usando uma linguagem de programação de nível inferior como C ou Assembly. Isto está em contraste com a programação de alto nível, típica de aplicações de espaço de usuário (user space), usando linguagens de alto nível (por exemplo, Python, Java).

Sim, a programação de sistemas (system programming) é um conceito muito próximo da programação de baixo nível. Esta página inclui o design de hardware e o desenvolvimento de firmware que não está incluído na programação do sistema.

Finalmente, esta página inclui tópicos que vão desde componentes de hardware até o kernel do Linux. Essa é uma enorme variedade de camadas. Um documento de uma página nunca pode cobrir os detalhes de todas as camadas, de modo que o objetivo deste documento é servir de ponto de partida para a programação de baixo nível.

A Teoria

Existem duas áreas de estudo para programação de baixo nível:

Você pode encontrar muitos cursos online bons de universidades, como por exemplo, Coursera.org e Edx.org. Teoria é teoria. Eu não acho que você precisa tirar 10 (ou conceito A), você precisa apenas entender boa parte do curso. Você irá melhorar com tempo de experiência e muita prática.

Deixe-me apresentar vários livros que eu li. Eles são normalmente usados como livros para leitura nas universidades. Se estes não forem indicados em suas aulas da universidade, vale a pena gastar algum tempo com eles. Recomendo a leitura em inglês desses livros.

  • Arquitetura de Computadores
    • Computer Architecture, Fifth Edition: A Quantitative Approach
    • Computer Systems: A Programmer's Perspective
    • Computer Organization and Design, Fourth Edition: The Hardware/Software Interface
  • Sistema Operacionais
    • The Magic Garden Explained: The Internals of UNIX System V Release 4 an Open Systems Design
    • The Design of the UNIX Operating System
    • Operating Systems: Internals and Design Principles by William Stallings

Há uma lista infinita de bons livros. Eu não quero dizer que você deve ler muitos livros. Basta ler cada livro cuidadosamente. Sempre que você aprender uma teoria, implemente o código de teste. Implementar é a melhor maneira de conhecer a fundo a teoria.

Linguagens

Assembly

Escolha entre x86 e ARM. Não precisa saber os dois. Isso não importa para aprender a linguagem Assembly. O essencial é conhecer a arquitetura da CPU e do computador. Então você não precisa aprender o Assembly da arquitetura da CPU mais recente que existe. Selecione a arqutetura x8086 ou Corex-M.

Linguagem C

Não há atalho. Basta ler os livros e resolver todos os exercícios (Muita prática...).

Se você quer ser um especialista em linguagem C, acesse https://leetcode.com/. Boa sorte!

Aplicações

Hardware & Firmware

Se você quiser ser um engenheiro de sistemas embarcados, seria melhor começar a partir de um kit de hardware simples, ao invés de começar com o mais recente chipset ARM.

  • EN Arduino Start Kit
    • Existem várias séries de Arduino, mas o "Arduino Start Kit" tem o processador mais simples (Atmega328P) e guia de livros
    • Atmega328P tem um microcontrolador de 8 bits que é o bom para ser usado como base de "design de circuitos digitais" e "desenvolvimento de firmware".
    • Você não precisa saber como desenhar esquemas e layout, e construir os chips.
    • Mas você precisa saber como ler esquemas e entender como os chips estão conectados.
    • Os desenvolvedores de firmware devem ser capazes de ler os esquemas e descobrir como enviar dados para o dispositivo de destino.
    • Siga o "guide book"!
  • EN x8086 manual
    • Se você é um novato para a arquitetura x8086, também é muito bom para aprender a arquitetura do processador e a linguagem Assembly para x8086
  • EN 80386 manual

Este ponto, você deve ser bom para começar com uma versão mais recente de um processador ARM ou x8086.

Por exemplo, a placa Raspberry Pi tem um processador Cortex-A53 que suporta um conjunto de instruções de 64 bits. Isso permite que você experimente uma arquitetura de processador moderna com rPi. Sim, você pode comprá-lo ... mas ... o que você vai fazer com ele? Se você não tem nenhum projeto em mente, você provavelmente jogaria a placa em uma gaveta e iria esquecê-la como outros gadgets que você comprou.

Então, eu recomendo um projeto para você

Eu fiz um "toy kernel" que suporta 64 bits long mode, paginação e comutação muito simples de contexto. Fazer um "toy kernel" é uma boa maneira de entender arquitetura de computadores moderna e controle de hardware.

Na verdade, você já possui o processador mais recente e os dispositivos de hardware mais recentes. Seu notebook! Seu PC! Você já tem tudo para começar! Você não precisa comprar nada mais. O emulador qemu pode simular a mais recente arquitetura de processadores ARM e Intel. Então tudo o que você precisa já está à mão. Existem muitos "toy kernel" e documentos que você pode consultar. Basta instalar o emulador qemu e criar um pequeno kernel que apenas inicialize e ative a paginação e imprima algumas mensagens.

Outros "toy kernels":

Kernel Linux e drivers de dispositivos

Você não precisa fazer um sistema operacional completo. Junte-se à comunidade Linux e participe do desenvolvimento.

Leia Cuidadosamente

Referências

Verifique quando precisar de algo

Outras aplicações

Sim, talvez você não esteja interessado em desenvolvimento Linux ou firmware. Se não, você pode encontrar outras aplicações:

  • Programação do sistema Windows e drivers de dispositivo
  • Segurança
  • Engenharia reversa

Eu não tenho nenhum conhecimento sobre essas aplicações. Por favor, me envie qualquer informação para iniciantes.

O Futuro da programação "baixo-nível"

Eu não sei o futuro, mas fico atento na linguagem RUST.

Se eu tivesse uma semana livre, sozinho, conseguiria aprender RUST. Isso é porque RUST é a linguagem de programação mais recente com que eu posso desenvolver um driver de dispositivo Linux.

IoT é uma nova tendência, por isso vale a pena verificar quais OS são para IoT. ARM, Samsung e algumas empresas tem seu próprio sistema operacional em tempo real, mas infelizmente são privados. Entretanto, a Linux Foundation também tem uma solução: Zephyr

Um servidor de nuvem tem muitas camadas, como por exemplo, host OS, Driver kvm, qemu process, Guest OS e Service application. Assim, o contêiner foi desenvolvido para fornecer uma virtualização mais leve. Em um futuro próximo, um novo conceito de SO, chamado de library OS ou Unikernel, poderá substituir a típica stack de SW para virtualização.

Sobre a Tradução

Por favor, me envie um pull request se você quiser traduzir ou fazer uma correção nesta página. Vou listá-lo no documento em inglês.