- O que é esse repositório?
- O que é programação de "baixo-nível?"
- A Teoria
- Linguagens
- Aplicações
- O Futuro da programação de "baixo-nível"
- Sobre a Tradução
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
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.
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.
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.
EN
Programação com linguagem Assembly para x8086 com emu8086- Conceitos básicos de CPU e arquitetura de computadores
- Conceitos básicos de linguagem de programação C
EN
Programação com linguagem Assembly para 64 bits (Tradução em andamento)- Conceitos básicos de uma CPU moderna e arquitetura de computadores
- Conceitos básicos de
desmontagem
(disassembling) anddepuração
(debugging) de código em C
EN
ARM Architecture - Manual de Referência, 2ª Edição- Referência completa de programação em arquiteturas ARM
- Organização e design de computadores
- Edição MIPS
- Edição ARM
- Livros acadêmicos que explicam como cada componente de um computador trabalha.
- Explica com detalhes os diferentes conceitos que compõem a arquitetura de computadores.
- Eles não são destinados a se tornar proficiente em na linguagem Assembly para uma arquitetura específica.
- A edição MIPS e ARM cobrem os mesmos tópicos, mas aprofundando arquiteturas diferentes.
- Ambas as edições contêm exemplos no mundo x8086.
Não há atalho. Basta ler os livros e resolver todos os exercícios (Muita prática...).
EN
Programação C: Uma abordagem moderna, 2ª ediçãoEN
A Linguagem de Programação C, 2ª EdiçãoEN
Linguagem C Moderna- Para o novo padrão C
EN
A Programação paralela é difícil e, nesse caso, o que você pode fazer?- Implementação de sincronização paralela com linguagem C
- Essencial para programação em C em larga escala (especialmente para programação de kernel)
EN
Desafio de programação C?- Plano de estudos similar ao
EN
O desafio de Eudyptula - Apenas uma ideia no momento...
- Se você conseguir fazer todos os pequenos desafios dessa página, provavelmente você estará apto para começar projetos maiores.
- Plano de estudos similar ao
EN
Black Book de programação gráfica de Michael Abrash, edição especial- Referencia em otimização usando linguagem C e um pouco de linguagem Assembly para x8086
- Começa a partir de x8088 até as arquiteturas mais atuais
- Foco especial na otimização de gráficos de baixo nível
Se você quer ser um especialista em linguagem C, acesse https://leetcode.com/. Boa sorte!
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- Melhor guia para modo protegido e mecanismo de paginação do processador x8086
EN
Versão web: https://pdos.csail.mit.edu/6.828/2011/readings/i386/toc.htm
Este ponto, você deve ser bom para começar com uma versão mais recente de um processador ARM ou x8086.
EN
https://www.raspberrypi.org/EN
https://beagleboard.org/EN
https://www.arduino.cc/en/ArduinoCertified/IntelEdison
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ê
EN
Criando seu próprio kernelEN
Boas referências: https://www.reddit.com/r/osdev/
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":
EN
[Little OS Book]https://littleosbook.github.io/EN
[Tuhdo]https://tuhdo.github.io/os01/
Você não precisa fazer um sistema operacional completo. Junte-se à comunidade Linux e participe do desenvolvimento.
- Livros: Leia os seguintes em ordem:
EN
O design do sistema operacional Unix- Os conceitos básicos do Unix são aplicados em qualquer o sistema operacional.
- Este livro é muito bom para obter os conceitos de sistema operacional.
EN
Drivers de dispositivo Linux- Faça todos os exemplos
EN
Desenvolvimento de Kernel Linux- Compreenda a arquitetura do kernel do Linux
EN
Compreendendo o kernel do Linux- Leia este livro e o código fonte do kernel v2.6 ao mesmo tempo
- Nunca comece com a versão mais recente, v2.6 é suficiente!
- Use qemu e gdb para executar a fonte do kernel linha por linha
- Use o busybox para fazer um sistema de arquivos mais simples que leva apenas 1 segundo para inicializar
EN
O desafio de Eudyptula- Isto é como um excelente professor particular que te orienta no que fazer.
- Se você não sabe o que fazer, basta iniciar isso.
EN
Camada de bloco e driver de dispositivo (Tradução em andamento)- Inicie a partir de um exemplo de bloco e driver de dispositivo (block device driver) (Ramdisk) com modo multi-queue
- Avance para (camada de bloco) block layer
EN
Driver MD do kernel do Linux (Tradução em andamento)- Como funciona a ferramenta
mdadm
e como ela chama omd driver
- Como o
md driver
funciona
- Como funciona a ferramenta
Verifique quando precisar de algo
EN
Free-electrons- Muitos arquivos de slides introduzindo bons tópicos, especialmente ARM-linux
EN
Postagem de Julia Evans: Você pode ser um hacker de kernel!- Guia para iniciar a programação do kernel
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.
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
EN
[Zephyr Project]https://www.zephyrproject.org/
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.
EN
[Uni Kernel]http://unikernel.org/
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.