|
| 1 | +* [Low-Level Programming University](#Low-Level-Programming-University) |
| 2 | + * [O que é?](#What-is-it) |
| 3 | + * [O que é "Low-Level?"](#What-Is-the-Low-Level) |
| 4 | + * [Teoria](#Theory) |
| 5 | + * [Linguagens](#Languages) |
| 6 | + * [Assembly](#Assembly) |
| 7 | + * [Linguagem C](#C-language) |
| 8 | + * [Aplicações](#Applications) |
| 9 | + * [Hardware && Firmware](#Hardware-Firmware) |
| 10 | + * [Kernel Linux e driver de dispositivos](#Linux-kernel-and-device-driver) |
| 11 | + * [Leia cuidadosamente](#Read-carefully) |
| 12 | + * [Referências](#References) |
| 13 | + * [Outras aplicações](#Other-applications) |
| 14 | + * [Futuro da programação "low-level"](#Future-of-low-level-programming) |
| 15 | + * [Trabalho](#Job) |
| 16 | +* [Tradução](#Translation) |
| 17 | + |
| 18 | +# <a name="Low-Level-Programming-University"></a>Low-Level Programming University |
| 19 | + |
| 20 | +## <a name="What-is-it"></a>O que é? |
| 21 | + |
| 22 | +Esta página é para iniciantes que querem ser programadores de baixo nível (low-level). |
| 23 | + |
| 24 | +Eu me inspirei no [google-interview-university](https://github.com/jwasham/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. |
| 25 | + |
| 26 | +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 consigo. 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. |
| 27 | + |
| 28 | +Para mais informações, Eu tenho mais de 10 anos de experiência como programador de baixo nível: |
| 29 | +* Programação de assembly 80x86 |
| 30 | +* Dispositivo de hardware com chip Atmel e firmware |
| 31 | +* Programação de sistemas Unix com linguagem C |
| 32 | +* driver de dispositivos Linux |
| 33 | +* Kernel Linux: paginação |
| 34 | +* Kernel Linux: block device driver e módulo md |
| 35 | + |
| 36 | +## <a name="What-Is-the-Low-Level"></a>O que é "Low-Level"? |
| 37 | + |
| 38 | +Classifiquei a programação de baixo nível (low-level programming language) como uma programação muito próxima da 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). |
| 39 | +* [Wikipedia: Low-level programming language](https://en.wikipedia.org/wiki/Low-level_programming_language) |
| 40 | + |
| 41 | +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. |
| 42 | +* [Wikipedia: System programming](https://en.wikipedia.org/wiki/System_programming) |
| 43 | + |
| 44 | +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. |
| 45 | + |
| 46 | +## <a name="Theory"></a>Teoria |
| 47 | + |
| 48 | +Existem duas áreas de estudo para programação de baixo nível: |
| 49 | +* Arquitetura de Computadores |
| 50 | +* Sistemas Operacionais |
| 51 | + |
| 52 | +Você pode encontrar muitos bons cursos online de universidades, como por exemplo, Coursera.org e edx.org. |
| 53 | +Teoria é teoria. Eu não acho que você precisa tirar 10 (ou conceito A), você precisa apenas entender boa parte do curso. |
| 54 | +Você irá melhorar com tempo de experiência. |
| 55 | + |
| 56 | +Deixe-me apresentar vários livros que eu li. Eles são normalmente usados como livro texto 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. |
| 57 | + |
| 58 | +* Arquitetura de Computadores |
| 59 | + * Computer Architecture, Fifth Edition: A Quantitative Approach |
| 60 | + * Computer Systems: A Programmer's Perspective |
| 61 | + * Computer Organization and Design, Fourth Edition: The Hardware/Software Interface |
| 62 | +* Sistema Operacionais |
| 63 | + * The Magic Garden Explained: The Internals of UNIX System V Release 4 an Open Systems Design |
| 64 | + * The Design of the UNIX Operating System |
| 65 | + * Operating Systems: Internals and Design Principles by William Stallings |
| 66 | + |
| 67 | +Há uma lista infinita de bons livros. Eu não quero dizer que você deve ler muitos livros. Basta ler um livro cuidadosamente. Sempre que você aprender uma teoria, implemente o código de teste. ** Implementar é a melhor maneira de conhecer a fundo a teoria. ** |
| 68 | + |
| 69 | +## <a name="Languages"></a>Linguagens |
| 70 | + |
| 71 | +### <a name="Assembly"></a>Assembly |
| 72 | + |
| 73 | +Escolha entre x86 e ARM. No precisa saber os dois. Isso não importa para aprender linguagem assembly. O essencial é conhecer a arquitetura da CPU e do computador. Então você não precisa aprender o assembly da arquitetura de CPU mais recente que existe. Selecione a arqutetura 8086 ou Corex-M. |
| 74 | + |
| 75 | +* [8086 assembly programming with emu8086](https://github.com/gurugio/book_assembly_8086) |
| 76 | + * Conceitos básicos de CPU e arquitetura de computadores |
| 77 | + * Conceitos básicos de linguagem de programação C |
| 78 | +* [64bit assembly programming(translation in progress)](https://github.com/gurugio/book_assembly_64bit) |
| 79 | + * Conceitos básicos de uma CPU moderna e arquitetura de computadores |
| 80 | + * Conceitos básicos de disassembling and debugging de código C |
| 81 | + * _need help for translation_ |
| 82 | +* [ARM Architecture Reference Manual, 2nd Edition](http://www.mypearsonstore.ca/bookstore/arm-architecture-reference-manual-9780201737196) |
| 83 | + * Rerencência completa de programação em arquiteturas ARM |
| 84 | +* Computer Organization and Design |
| 85 | + * [MIPS Edition](https://www.amazon.ca/Computer-Organization-Design-MIPS-Interface/dp/0124077269/) |
| 86 | + * [ARM Edition](https://www.amazon.ca/Computer-Organization-Design-ARM-Interface/dp/0128017333/) |
| 87 | + * Livros acadêmicos que explicam como cada componente de um computador trabalha. |
| 88 | + * Explica com detalhes os diferentes conteitos que compõem a arquitetura de computadores. |
| 89 | + * Eles não são destinados a se tornar proficiente em uma linguagem assembly específico. |
| 90 | + * A edição MIPS e ARM cobrem os mesmos tópicos, mas aprofundando uma arquitetura diferente. |
| 91 | + * Ambas as edições contêm exemplos no mundo x86. |
| 92 | + |
| 93 | +### <a name="C-language"></a>Linguagem C |
| 94 | + |
| 95 | +Não há atalho. Basta ler os livros e resolver todos os exercícios. |
| 96 | + |
| 97 | +* [C Programming: A Modern Approach, 2nd Edition](https://www.amazon.com/C-Programming-Modern-Approach-2nd/dp/0393979504) |
| 98 | +* [The C Programming Language 2nd Edition](https://www.amazon.com/Programming-Language-Brian-W-Kernighan/dp/0131103628/ref=pd_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=60R1D2CHBA8DHYT6JNMN) |
| 99 | +* [Modern C](http://icube-icps.unistra.fr/img_auth.php/d/db/ModernC.pdf) |
| 100 | + * Para o novo padrão C |
| 101 | +* [Is Parallel Programming Hard, And, If So, What Can You Do About It?](https://www.kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html) |
| 102 | + * Implementação de sincronização paralela com C |
| 103 | + * Essencial para programação C em larga escala (especialmente para programação de kernel) |
| 104 | +* [C programming challenge?](https://github.com/gurugio/lowlevelprogramming-university/blob/master/c-language-challenge.md) |
| 105 | + * Plano de estudos similar ao [The Eudyptula Challenge](http://eudyptula-challenge.org/) |
| 106 | + * Apenas uma ideia no momento... |
| 107 | + * Se você conseguir fazer todos os pequenos desafios dessa página, provavelmente você estará apto para começar projetos maiores. |
| 108 | +* [Michael Abrash’s Graphics Programming Black Book, Special Edition](http://www.jagregory.com/abrash-black-book/) |
| 109 | + * Referencia em otimização usando C e um pouco de assembly x86 |
| 110 | + * Começa a partir de 8088 até hoje |
| 111 | + * Foco especial na otimização de gráficos de baixo nível |
| 112 | + |
| 113 | +Se você quer ser um especialista em linguagem C, acesse https://leetcode.com/. Boa sorte! |
| 114 | + |
| 115 | +## <a name="Applications"></a>Aplicações |
| 116 | + |
| 117 | +### <a name="Hardware-Firmware"></a>Hardware && Firmware |
| 118 | + |
| 119 | +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. |
| 120 | + |
| 121 | +* [Arduino Start Kit](https://www.arduino.cc/) |
| 122 | + * Existem várias séries de Arduino, mas o "Arduino Start Kit" tem o processador mais simples (Atmega328P) e guia de livros |
| 123 | + * Atmega328P tem um microcontrolador de 8bits que é o bom para ser usado como base de "design de circuitos digitais" e "desenvolvimento de firmware". |
| 124 | + * Você não precisa saber como desenhar esquemas e layout, e construir os chips. |
| 125 | + * Mas você precisa saber como ler esquemas e entender como os chips estão conectados. |
| 126 | + * Os desenvolvedores de firmware devem ser capazes de ler os esquemas e descobrir como enviar dados para o dispositivo de destino. |
| 127 | + * Firmware developers should be able to read the schematics and figure out how to send data to the target device. |
| 128 | + * Siga o "guide book"! |
| 129 | +* [8086 manual](https://edge.edx.org/c4x/BITSPilani/EEE231/asset/8086_family_Users_Manual_1_.pdf) |
| 130 | + * Se você é um novato para a arquitetura x86, 8086 também é muito bom para aprender a arquitetura do processador e assembly 80x86 |
| 131 | +* [80386 manual](http://css.csail.mit.edu/6.858/2015/readings/i386.pdf) |
| 132 | + * Melhor guia para modo protegido e mecanismo de paginação do processador 80x86 |
| 133 | + * Versão web: https://pdos.csail.mit.edu/6.828/2011/readings/i386/toc.htm |
| 134 | + |
| 135 | +Este ponto, você deve ser bom para começar com uma versão mais recente de um processador ARM ou x86. |
| 136 | +* https://www.raspberrypi.org/ |
| 137 | +* https://beagleboard.org/ |
| 138 | +* https://www.arduino.cc/en/ArduinoCertified/IntelEdison |
| 139 | + |
| 140 | +Por exemplo, a placa Raspberry Pi tem um processador Cortex-A53 que suporta um conjunto de instruções de 64 bits. |
| 141 | +Isso permite que você experimente uma arquitetura de processador moderna com rPi. |
| 142 | +Sim, você pode comprá-lo ... mas ... o que você vai fazer com ele? |
| 143 | +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. |
| 144 | + |
| 145 | +Então, eu recomendo um projeto para você |
| 146 | +* [Making your own kernel](http://wiki.osdev.org/Getting_Started) |
| 147 | + * Boas referências: https://www.reddit.com/r/osdev/ |
| 148 | + |
| 149 | +Eu fiz um ["toy kernel"](https://github.com/gurugio/caos) 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. |
| 150 | + |
| 151 | +Na verdade, você já possui o processador mais recente e os dispositivos de hardware mais recentes. |
| 152 | +Seu notebook! Seu PC! Você já tem tudo para começar! |
| 153 | +Você não precisa comprar nada mais. |
| 154 | +O emulador qemu pode simular a mais recente arquitetura de processadores ARM e Intel. |
| 155 | +Então tudo o que você precisa já está à mão. |
| 156 | +Existem muitos "toy kernel" e documentos que você pode consultar. |
| 157 | +Basta instalar o emulador qemu e criar um pequeno kernel que apenas inicialize e ative a paginação e imprima algumas mensagens. |
| 158 | + |
| 159 | +Other toy kernels: |
| 160 | +* https://littleosbook.github.io/ |
| 161 | +* https://tuhdo.github.io/os01/ |
| 162 | + |
| 163 | +### <a name="Linux-kernel-and-device-driver"></a>Kernel Linux e driver de dispositivos |
| 164 | + |
| 165 | +Você não precisa fazer um sistema operacional completo. |
| 166 | +Junte-se à comunidade Linux e participe do desenvolvimento. |
| 167 | + |
| 168 | +#### <a name="Read-carefully"></a>Leia cuidadosamente |
| 169 | + |
| 170 | +* Livros: Leia os seguintes em ordem: |
| 171 | + * [The Design of the Unix Operating System](https://www.amazon.com/Design-UNIX-Operating-System/dp/0132017997) |
| 172 | + * Os conceitos básicos do Unix são aplicados em qualquer o sistema operacional. |
| 173 | + * Este livro é muito bom para obter os conceitos de sistema operacional. |
| 174 | + * [Linux Device Drivers](https://www.amazon.com/Linux-Device-Drivers-Jonathan-Corbet/dp/0596005903/ref=sr_1_4?ie=UTF8&qid=1483650712&sr=8-4&keywords=understanding+linux+kernel) |
| 175 | + * Faça todos os exemplos |
| 176 | + * [Linux Kernel Development](https://www.amazon.com/Linux-Kernel-Development-Robert-Love/dp/0672329468/ref=sr_1_2?ie=UTF8&qid=1483650712&sr=8-2&keywords=understanding+linux+kernel) |
| 177 | + * Compreenda a arquitetura do kernel do Linux |
| 178 | + * [Understanding the Linux Kernel](https://www.amazon.com/Understanding-Linux-Kernel-Third-Daniel/dp/0596005652/ref=sr_1_1?ie=UTF8&qid=1483650712&sr=8-1&keywords=understanding+linux+kernel) |
| 179 | + * Leia este livro e o código fonte do kernel v2.6 ao mesmo tempo |
| 180 | + * Nunca comece com a versão mais recente, v2.6 é suficiente! |
| 181 | + * Use qemu e gdb para executar a fonte do kernel linha por linha |
| 182 | + * http://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu |
| 183 | + * https://github.com/gurugio/linuxdeveloptip/blob/master/qemu-gdb-kdump.md |
| 184 | + * Use o busybox para fazer um sistema de arquivos mais simples que leva apenas 1 segundo para inicializar |
| 185 | + * https://github.com/gurugio/linuxdeveloptip/blob/master/minikernelwithbusybox.md |
| 186 | +* [The Eudyptula Challenge](http://eudyptula-challenge.org/) |
| 187 | + * Isto é como um excelente professor particular que te orienta no que fazer. |
| 188 | + * Se você não sabe o que fazer, basta iniciar isso. |
| 189 | +* [Block layer and device driver(translation in progress)](https://github.com/gurugio/book_linuxkernel_blockdrv) |
| 190 | + * Inicie a partir de um exemplo de block device driver (Ramdisk) com modo multi-queue |
| 191 | + * Avance para block layer |
| 192 | + * _need help for translation_ |
| 193 | +* [md driver of Linux kernel(in progress)](https://github.com/gurugio/book_linuxkernel_md) |
| 194 | + * Como funciona a ferramenta mdadm e como ela chama o md driver |
| 195 | + * Como o md driver funciona |
| 196 | + * _need help for translation_ |
| 197 | + |
| 198 | +#### <a name="References"></a>Referências |
| 199 | + |
| 200 | +Verifique quando precisar de algo |
| 201 | + |
| 202 | +* [Free-electrons homepage](http://free-electrons.com/docs/) |
| 203 | + * Muitos arquivos de slides introduzindo bons tópicos, especialmente ARM-linux |
| 204 | +* [Julia Evans's posting: You can be a kernel hacker!](http://jvns.ca/blog/2014/09/18/you-can-be-a-kernel-hacker/) |
| 205 | + * Guia para iniciar a programação do kernel |
| 206 | + |
| 207 | +### <a name="Other-applications"></a>Outras aplicações |
| 208 | + |
| 209 | +Sim, talvez você não esteja interessado em desenvolvimento Linux ou firmware. Se não, você pode encontrar outras aplicações: |
| 210 | +* Programação do sistema Windows e driver de dispositivo |
| 211 | +* Segurança |
| 212 | +* Engenharia reversa |
| 213 | + |
| 214 | +Eu não tenho nenhum conhecimento sobre essas aplicações. Por favor, me envie qualquer informação para iniciantes. |
| 215 | + |
| 216 | +## <a name="Future-of-low-level-programming"></a>Futuro da programação "low-level" |
| 217 | + |
| 218 | +Eu não sei o futuro, mas fico atento na linguagem RUST. |
| 219 | +* https://hacks.mozilla.org/2016/11/rust-and-the-future-of-systems-programming/ |
| 220 | + |
| 221 | +Se eu tivesse uma semana livre, sozinho, conseguiria aprenderia RUST. |
| 222 | +Isso é porque RUST é a linguagem de programação mais recente com que eu posso desenvolver um driver de dispositivo Linux. |
| 223 | + |
| 224 | +IoT é uma nova tendência, por isso vale a pena verificar quais OSs são para IoT. |
| 225 | +ARM, Samsung e algumas empresas tem seu próprio sistema operacional em tempo real, mas infelizmente muitos deles proprietários. |
| 226 | +Entretanto, a Linux Foundation também tem uma solução: Zephyr |
| 227 | +* https://www.zephyrproject.org/ |
| 228 | + |
| 229 | +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. |
| 230 | +* http://unikernel.org/ |
| 231 | + |
| 232 | +# <a name="Translation"></a>Tradução |
| 233 | + |
| 234 | +Por favor, me envie um pull request se você quiser traduzir esta página. Vou listá-lo no documento em inglês. |
0 commit comments