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?.
- O que é esse repositório?
- O que é programação de baixo nível?
- Teoria
- Linguagens
- Carreiras
- Futuro da programação em baixo nível
- Como começar?
- Traduções
- 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.
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.
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.
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
- Structure and Interpretation of Computer Programs
- É sobre como se tornar um bom desenvolvedor de softwares. Você precisa de não somente teoria, mas também técnica, pois programação é como um trabalho artesanal.
- Se você aprender Lisp/Scheme, você deve ser capaz de aprender qualquer outra linguagem rapidamente.
- Eu resolvi 80% dos exercícios e vale a pena tentar cada um deles.
- Structure and Interpretation of Computer Programs
- 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.
- Faça seu próprio kit do microprocessador 8086.
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.
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.
- 8086 assembly programming with emu8086
- Conceitos básicos de arquitetura de processadores e computadores
- Conceitos básicos de C
- 64 bit assembly programming (translation in progress)
- Conceitos básicos de arquitetura de CPUs e computadores modernos.
- Conceitos básicos de disassembling e debugging em C
- Learning assembly for Linux x64
- Programação em puro assembly 64 bits com NASM e inline assembly com GCC
- ARM Architecture Reference Manual, 2nd Edition
- Referência completa em programação ARM
- Organização e Arquitetura de Computadores
- MIPS Edition
- ARM Edition
- RISC-V Edition
- Estes são livros acadêmicos que explicam como cada componente do computador funciona desde o começo
- Explicam em detalhe os diferentes conceitos que compõem a arquitetura de computadores
- O público-alvo não são leitores que desejam desejam proficiência em assembly
- A versão MIPS e ARM cobrem os mesmos tópicos, mas dissecando as diferentes arquiteturas
- Ambas edições contêm exemplos no universo x86
Aqui não existe atalho: leia o livro todo e resolva todos os exercícios.
- C Programming: A Modern Approach, 2nd Edition
- The C Programming Language, 2nd Edition
- Modern C: Jens Gustedt. Modern C. Manning, 2019, 9781617295812. ffhal-02383654f
- Nova convenção/novo padrão de C
- Is Parallel Programming Hard? And If So, What Can You Do About It?
- Implementação real de paralelismo em C
- Essencial para programas C de larga escala (especialmente kernels)
- Projects in C
- Se você leu um ou dois livros sobre C, então você DEVE programar algo
- Escolha qualquer coisa que lhe agrade
- Primeiro faça o seu e depois compare com o código de outra pessoa
- É muito impotante comparar seu código, pois você só melhora suas habilidades quando você vê o código de alguém e aprende métodos melhores
- Livros são mortos enquanto que códigos são vivos
- Projects in C and other languages
- Mais projetos interessantes
- Michael Abrash’s Graphics Programming Black Book, Special Edition
- Referência em otimização usando C e assembly x86
- Começa do 8088 até hoje em dia
- Foco especial em otimização de gráficos em baixo nível
- Frameworks and plugins in C
- Como desenvolver frameworks e plugins em C para programas de larga escala
- Dicas bem básicas sobre como ler o kernel Linux
Se quiser ser um especialista em C, visite LeetCode. Boa sorte!
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
eany
- Easy rust
- Um livro escrito em um inglês simples e com material adicional no YouTube
- 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
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.
- Raspberry Pi - ARM
- BleagleBoard - ARM
- Certificação Arduino
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ê:
- Fazer seu próprio kernel
- Boas referências: r/osdev
- Aprendendo desenvolvimento de sistemas operacionais usando Linux e Raspberry Pi
-
This repository contains a step-by-step guide that teaches how to create a simple operating system (OS) kernel from scratch. [...] Each lesson is designed in such a way that it first explains how some kernel feature is implemented in the RPi OS, and then it tries to demonstrate how the same functionality works in the Linux kernel.
-
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:
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:
- Livros (leia-os na seguinte ordem)
- The Design of the Unix Operating System
- Os conceitos básicos de Unix são aplicados em todos os sistemas operacionais
- Esse livro é um bom lugar para aprender os conceitos fundamentais de sistemas operacionais
- Linux Device Drivers
- Faça todos os exemplos
- Linux Kernel Development
- Entenda o design do kernel Linux
- Understanding the Linux Kernel
- Leia este livro e o código fonte do kernel na versão 2.6 ao mesmo tempo
- Nunca comece com a versão mais recente, a 2.6 é suficiente!
- Use QEMU e GDB para rodar o código linha por linha
- Use busybox para fazer o sistema de arquivos mais simples possível, levando apenas um segundo para bootar
- The Design of the Unix Operating System
- Outros recursos gratuitos que recomendo
- Linux Device Driver Labs
- Guia prático e com excelentes exercícios fazendo drivers com APIs essenciais do kernel
- Acredito que este documento introduz quase toda API essencial
- The Eudyptula Challenge
- Infelizmente este desafio não aceita mais requisições porque não tem mais desafios, mas você pode encontrar as questões do desafio as pesquisando
- O mantenedor falou que está planejando um novo formato
- Isto é como um professor incrível que lhe guia pelo que fazer
- Se você não sabe o que fazer, apenas comece
- Aprendendo desenvolvimento de sistemas operacionais usando Linux e Raspberry Pi
- Este projeto não está completo ainda
- Eu penso que fazer um kernel similar ao do Linux é a melhor maneira de o entender
- Block layer and device driver
- Comece com um simples exemplo de driver de bloco (Ramdisk) com modo multi-fila
- Prossiga com a camada de blocos
- Driver md do kernel Linux (Coreano)
- Como ferramentas mdadm funcionam e como chamam o driver md
- Como o driver md funciona
- Código fonte do kernel Linux com vários comentários
- Vários comentários para o Linux v0.12
- Seria bom começar com um antigo e simples SO
- Versão Unix: Lions' Commentary on UNIX 6th Edition, with Source Code
- Linux Device Driver Labs
Cheque quando estiver precisando de algo
- Bootlin Docs
- Vários slides intruduzinho bons tópicos, especialmente ARM-Linux
- You can be a kernel hacker! (blog post)
- Guia para começar programação de kernel
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.
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.
- https://en.wikipedia.org/wiki/Software-defined_storage
- https://en.wikipedia.org/wiki/Clustered_file_system
- https://en.wikipedia.org/wiki/Ceph_(software)
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
- 8086 assembly programming with emu8086
- É suficiente você entender o conceito de programação em assembly, não há necessidade de fazer algo prático
- The C Programming Language 2nd Edition
- Dê seu melhor para resolver CADA UM do exercícios
- C Programming: A Modern Approach, 2nd Edition
- 8086 assembly programming with emu8086
- 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
- Projects in C
- 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
- Programação de baixo nível é bem próxima de sistemas operacionais, então você deve saber o interior de um sistema operacional
- Comece por drivers
- Leia Linux Kernel Development para entender os detalhes internos 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
- Se você quer se tornar um desenvolvedor profissional do kernel Linux
Por favor, faça uma PR se deseja traduzir esta página, irei lista-la aqui.
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