Skip to content

Latest commit

 

History

History
400 lines (309 loc) · 31 KB

README_pt.md

File metadata and controls

400 lines (309 loc) · 31 KB

Universidade de Programação em Baixo Nível

Nota 1: Por favor, não copie o conteúdo desta página para o seu blog. Você pode compartilhar esta página, mas, por favor, compartilhe com o link original. Essa é a forma que nós elogiamos os autores de bons documentos e projetos de código aberto.

Nota 2: Por favor, note que programação de baixo nível não está em alta e atualmente não há muitas companhias contratando desenvolvedores de baixo nível. Está ficando mais difícil para encontrar trabalho. Se você ainda não começou a sua carreira profissional, eu recomendaria considerar outros campos cuidadosamente.

Nota 3: Se você quiser ir direto ao ponto, vá para Como começar?.

Sumário

O que é esse repositório?

Eu me inspirei na google-interview-university. Eu gostaria de compartilhar minha experiência e um roteiro de como se tornar um programador de baixo nível, pois acredito que essas habilidades não são tão comuns quanto antigamente. Além disso, muitos iniciantes e estudantes me perguntam como poderiam se tornar desenvolvedores de baixo nível e engenheiros do kernel Linux.

Esta página não inclui todos os links, livros ou cursos. Por exemplo, esta página introduz Arduino, mas não tem informações detalhados sobre Arduino e sistemas embarcados. Você deve se aprofundar por si mesmo. Você tem a palavra-chave "Arduino" para começar, então seu próximo passo é pesquisar sobre Arduino, comprar um kit e fazer alguma coisa você mesmo, e não colecionar links e livros. Por favor, lembre que esta página é apenas um roteiro para iniciantes.

Programação de baixo nível é uma parte de Ciências da Computação, de tal forma que, é certamente muito melhor ter esse conhecimento primeiro.

Nota do tradutor: os links que estiverem em inglês é devido o conteúdo estar em inglês. Em alguns casos, por exemplo livros, foi colocado o nome da versão em português, caso haja. Alguns poucos links que estão em inglês podem ter a refência escrita em português por motivos de maior de clareza.

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

Eu classifico programação de baixo nível como uma programação que é muito próxima da máquina. Usa-se uma linguagem de programação de mais baixo nível, como C ou assembly, diferentemente de linguagens de programação de alto nível, típicas de aplicações do espaço de usuário, como Python ou Java.

Sim, o conceito de programação de sistemas é bem próximo do de programação de baixo nível. Esse roteiro inclui o desenvolvimento de hardware e firmware que não estão inclusos no desenvolvimento de sistemas.

Finalmente, esse roteiro inclui tópicos indo de componentes de hardware até o kernel Linux. Isso é uma variedade enorme de camadas. Um documento de uma página nunca conseguiria cobrir detalhadamente todas elas, então o foco deste é servir de ponto inicial para programação de baixo nível.

Teoria

Existem dois conhecimentos teóricos para se programar em baixo nível:

  • Arquitetura de Computadores
  • Sistemas Operacionais

Acredito que a melhor maneira de aprender teoria é fazendo um curso. Ler livros não é ruim, mas consome muito tempo e esforço. Você pode achar várias aulas em universidades online, por exemplo Coursera e edX.

Teoria é teoria. Eu não acho que você necessite de um 10 em uma matéria, apenas entenda seu conteúdo geral; você evoluirá com experiência.

Irei apresentar vários livros que li. Eles são comumente usados como livros-texto em universidades. Se não existe uma matéria com esses livros na sua universidade, vale a pena gastar um pouco de tempo os lendo.

  • Arquitetura de Computadores
    • Organização e Projeto de Computadores, 5ª edição. HENNESSY, John. 2021.
    • Arquitetura de Computadores: Uma Abordagem Quantitativa, 6ª edição. HENNESSY, John. 2019.
    • Computer Systems: A Programmer's Perspective, 3rd Revised Edition. BRYANT, Randal; O'HALLARON, David. 2015.
  • Sistemas Operacionais
    • The Magic Garden Explained: The Internals of UNIX System V Release 4 an Open Systems Design. GOODHEART, Berny; COX, James. 1994.
    • The Design of the UNIX Operating System. BACH, Maurice. 1986.
    • Operating Systems: Internals and Design Principles, 9th Edition. STALLINGS, William. 2017.
    • Adicionado pelo tradutor: Operating Systems: Three Easy Pieces. ARPACI-DUSSEAU, Remzi H.; ARPACI-DUSSEAU, Andrea C.
      • E-book online e gratuito sendo atualizado constantemente. Se encontra na versão 1.10 no momento do lançamento desta tradução.
  • Cursos Recomendados
  • Habilidades Gerais de Programação
  • Design de Hardware
    • Faça seu próprio kit do microprocessador 8086.
      • Se você não fizer seu próprio hardware, você não entenderá o que é um dispositivo físico de memória mapeada.
      • Pontos de acesso modernos incluem muitos IPs, então você não tem a chance de entender como a CPU e os periféricos estão conectados.
      • Fazendo seu próprio kit 8086, você tem uma oportunidade de colocar cada dispositivo periférico na memória física e definir como os componentes de hardware principais (barramentos, interrupções do sistema, clock, alimentação, etc.) funcionam com seus próprios olhos.
      • Eu montei o meu kit na universidade e foi uma das mais valiosas atividades que fiz. Tente fazer seu próprio kit, sendo melhor que o hardware seja mais velho e simples, porque deve lhe dar mais trabalho.
      • Pesquise "kit 8086": você deve achar alguns sites em que pode comprar uma esquema de hardware, partes e manuais.

Existe uma lista infinita de bons livros, e eu não quero dizer que você deve ler todos; leia um com cuidado: fazendo marcações, anotações e pesquisas. Sempre que aprender uma teoria, implemente um código simulando isso. Implementar algo é melhor do que saber 100 teorias.

Linguagens

Assembly

Escolha um entre x86 e ARM, não precisa saber as duas. Não importa tanto saber assembly a princípio, o essencial é entender o funcionamento interno de uma CPU e um computador, logo não há necessidade de praticar com assembly das CPU mais recentes. Apenas escolha entre 8086 ou Cortex-M.

C

Aqui não existe atalho: leia o livro todo e resolva todos os exercícios.

Se quiser ser um especialista em C, visite LeetCode. Boa sorte!

Rust

Tenho convicção que a próxima linguagem para programação de sistemas vai ser Rust. Farei uma lista do que fiz para aprender esta linguagem.

Linus Torvalds: Rust will go into Linux 6.1

Adicionado pelo tradutor: Torvalds Speaks: Rust's Impact on the Linux Kernel

  • The Rust Programming Language
    • Livro online e gratuito da própria Rust Foundation
    • Boa introdução, mas falta exemplos e exercícios
  • Rust by Example
    • Enquanto lê o livro anterior, você pode encontrar exemplos aqui
    • Não há muitos exercícios, mas você pode fazer alguma coisa você mesmo
  • Adicionado pelo tradutor: Rustlings
    • Repositório da própria Rust Foundation contendo alguns exercícios e com indicação de acerto ou erro
  • Programming Rust, 2nd
    • Introdução mais aprofundada, porém ainda com falta de exercícios
  • Exercism
    • Bons exercícios para praticar características individuais da linguagem
    • Não tenho certeza se os Mentors estão trabalhando ativamente, mas comparar sua solução com a de outros deve ser o suficiente
    • Depois de submeter sua solução, você pode ver a solução de outros na aba "Community Solutions"
    • Vários exercícios de nível fácil são voltados para o aspecto funcional da linguagem, usando métodos como: map, filter e any
  • Easy rust
  • Let's Get Rusty
    • Há muitos youtubers fazendo cursos de Rust, mas esse foi o meu preferido
    • Ele também tem upado vídeos sobre as últimas notícias envolvendo Rust, então acredito que valha sua inscrição
  • Adicionado pelo tradutor: Rust for Rustaceans: Idiomatic Programming for Experienced Developers. GJENGSET, Jon. 2021.
    • Livro de um ex-mantenedor da insfraestrutura em Rust da AWS
    • Atualmente fazendo uma pesquisa relacionada a um banco de dados escrito em Rust
    • Comumente faz lives no YouTube cobrindo tópicos como detalhes de implementação da biblioteca padrão do Rust, contribuindo para projetos de código aberto ou desenvolvendo algum projeto próprio
    • Este livro é um complemento para quando você já conhecer um pouco melhor a sintaxe e como programas são escritos em Rust; ele NÃO é um livro para iniciantes na linguagem
  • Rust for Linux
    • Veja os exemplos e dê uma olhada em como Rust entrou no kernel Linux

Carreiras

Hardware e Firmware

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

  • Arduino Start Kit
    • Existem várias séries de Arduinos, mas o "Arduino Start Kit" tem o processador mais simples (ATmega328P) e um livro guia
    • ATmega328P tem uma arquitetura de 8 bits, o que é um bom lugar para começar em design de circuitos digitais e desenvolvimento de firmware
    • Você não precisa saber como desenhar esquemas, leiautes e montar os chips
    • Mas você precisa saber ler esquemas e entender como os chips estão conectados
    • Desenvolvedores de firmware devem ser capazes de ler esquemas e compreender como mandar dados para outro dispositivo
    • Siga o guia do livro
  • Manual do 8086
    • Se você é um iniciante em arquitetura x86, 8086 é, também, um ótimo de guia para arquitetura de processadores e assembly x86
  • Manual do 80386
    • Melhor guia para modo protegido (protected mode) e mecanismo de paginação (paging mechanism) de processadores 80x86
    • Web version

Nesse ponto, você deve ser capaz de começar a ver arquitetura ARM ou x86 atual.

Por exemplo, a placa Raspberry Pi tem um processador Cortex-A53 que suporta um conjunto de instruções de 64 bits, permitindo que você experiencie arquitetura moderna de processadores.

Certo, você pode comprá-la, mas o que você vai fazer com isso? Se você não tem um projeto em mente, você tenderá a deixá-la na estante e esquecer da sua existência, como você provavelmente deve ter feito com outros equipamentos que você deve ter comprado.

Então eu recomendarei um projeto a você:

Eu fiz um kernel de brinquedo que suporta modo 64 bits, paginação e uma troca de contexto bem simples. Fazer um kernel para brincar é um bom caminho para entender arquitetura de computadores modernos e controle de hardware.

Na verdade, você já tem os processadores e hardware atuais: seu notebook ou seu computador! Você já tem tudo que você precisa para começar, não precisa comprar nada.

O emulador QEMU pode emular os processadores ARM e Intel atuais, então tudo que você precisa já está disponível.

Existem vários kernels de brinquedo e documentos que você pode se basear. Apenas instale o emulador QEMU e faça um pequeno kernel que apenas da boot, liga paginação e imprime algumas mensagens.

Outros kernels de brinquedo:

Kernel Linux e Drivers de Dispositivos

Você não precisa montar um sistema operacional completo, entre na comunidade Linux e participe do desenvolvimento.

Alguns recursos para o desenvolvimento do Linux e de drivers, de iniciante a avançado:

Referências

Cheque quando estiver precisando de algo

Outras carreiras

Sim, você pode não ser interessando em Linux ou firmware. Nesse caso, você pode procurar outras carreiras:

  • Programação de sistemas e drivers em Windows
  • Segurança
  • Engenharia reversa

Eu não tenho conhecimento algum sobre estas. Por favor, mande-me qualquer informação para iniciantes.

Kernels e drivers não são tudo de programação de baixo nível.

Mais uma importante carreira de programação de baixo nível é o armazenamento definido por software (software-defined storage) ou sistemas de arquivos distribuidos. Descrições detalhadas sobre isto estão além do escopo desse documento, mas existe cursos excelentes em que você pode fazer um simples sistema de arquivos distribuidos.

Futuro da programação em baixo nível

Eu não sei o futuro, mas estou de olho no Rust.

Se eu tivesse uma semana livre, eu aprenderia Rust, pois é a linguagem mais nova que consigo desenvolver drivers no Linux.

IoT (Internet of Things - Internet das Coisas) é o que anda em alta, então vale a pena olhar o que são SOs para IoT. Algumas empresas possuem seus próprios RTOSes (Real-Time Operating System - Sistema Operacional de Tempo Real), como ARM e Samsung, mas muitos deles são de código fechado; a Linux Foundation tem sua própria solução:

Servidores em nuvem tipicamente possuem várias camadas, por exemplo SO hospedeiro, driver KVM, processo QEMU, SO hóspede e serviço da aplicação. Um contêiner foi desenvolvido para prover virtualização leve. Em um futuro próximo, um novo conceito de SO, assim chamado de Library OS ou Unikernel, substituiria as ferramentas típicas de software e hardware para virtualização.

Big data e computação em nuvem está requerindo armazenamentos cada vez maiores. Alguns discos ligados diretamente à máquina do servidor não satifaz as requisições de capacidade, estabilidade e performance. Dessa forma, estão acontecendo pesquisas para a produção de sistemas de grande armazenamento, com várias máquinas para armazenar os dados conectadas por uma rede de alta velocidade. Antes era focada um armazenamento único de grande volume, porém atualmente estão provendo vários volumes dedicados para as várias máquinas virtuais.

Como começar?

Eu recebi um email perguntando como começar. Existe muita informação sobre livros, cursos e projetos nesta página, mas foi erro meu esquecer de escrever como começar. Infelizmente não existe um Caminho Real (Porto Real).

Irei apenas escrever o que eu fiz em ordem. Se você já tiver feito algo, pule. NOVAMENTE, isso é apenas um exemplo que você pode fazer em ordem, em caso de você não saber como começar ou o que fazer.

  • Lendo livros sobre sistemas operacionais: pelo menos "The Design of the UNIX Operating System" por Maurice J. Bach (já citado anteriormente).
  • Aprenda assembly e C
  • Faça algo prático com C
    • Projects in C
      • Encontre um ou dois projetos interessantes e faça você mesmo
    • LeetCode
      • Se você não achar nenhum projeto interessante, também é bom focar em estrutura de dados e algoritmos
  • Faça um projeto de hardware
    • Raspberry Pi ou Arduino não importa, você precisa experimentar controlar o hardware diretamente com APENAS C!
    • Eu recomendo comprar um kit ATmega128 e fazer um firmware ligar/desligar LEDs, detectar o input de um switch e mostrar uma mensagem de texto no LCD
    • Um programa de controle de motor também é um projeto muito bom (um line tracer, por exemplo)
    • NÃO USE bibliotecas: você deveria fazer tudo você mesmo (com exceção do software de colocar o programa na placa)
  • Básicos do Kernel Linux
  • Vá para o ambiente profissional
    • Se você quer se tornar um desenvolvedor profissional do kernel Linux
      • Precisa ler Understanding the Linux Kernel
      • E então fazer seu kernel de brinquedo
      • Escreva o link do repositório do seu kernel no seu currículo (não esqueça de escrever mensagens descritivas nos commits)
      • Veja issues em https://lwn.net/, pegue alguma e a resolva
        • Vá para "Recent Kernel Pacthes" em https://lwn.net/Kernel/ ou pelo link direto https://lwn.net/Kernel/Pacthes
        • Encontre um patch para você e tente entender o código fonte. Claro que vai ser difícil, mas tente. Você entenderá mais e mais sempre que tentar
        • Builde o kernel e teste na sua máquina: teste de performance, de estabilidade com LTP ou análise estática de código dentro do kernel
        • Reporte qualquer problema que encontrar: warnings ou erros de compilação, redução de performance, kernel entrando em pânico ou qualquer outro
        • Se funciona bem, reporte com a descrição da sua máquina e o dono do patch vai escrever "Reviewed-by" (revisado por) e seu nome
        • Parabéns pelo seu nome no log do git do kernel
    • Ou encontre outros tópicos
      • Existem vários outros campos em que engenheiros de baixo nível podem trabalhar: segurança, compiladores, firmware, robótica, setor automotivo e muito mais

Traduções

Por favor, faça uma PR se deseja traduzir esta página, irei lista-la aqui.

Quem sou eu?

Eu me inspirei na google-interview-university. Eu gostaria de compartilhar minha experiência e um roteiro de como se tornar um programador de baixo nível, pois acredito que essas habilidades não são tão comuns quanto antigamente. Além disso, muitos iniciantes e estudantes me perguntam como poderiam se tornar desenvolvedores de baixo nível e engenheiros do kernel Linux.

Tenho mais de 10 anos de experiência como programador de baixo nível, incluindo:

  • Programação em assembly 80x86
  • Hardware com chip ATmel e firmware
  • Programação de sistemas Unix com C
  • Drivers em Linux
  • Kernel Linux: page allocation
  • Kernel Linux: block driver e módulo md