Questa pagina è per i principianti che vogliono essere programmatori a basso livello.
L'inspirazione proviene dalla pagina google-interview-university. Vorrei condividere la mia esperienza e mostrare un piano per diventare un programmatore a basso livello perchè mi sono reso conto che queste skill non sono così diffuse come una volta. Inoltre, molti studenti e principianti mi chiedono come possono diventare dei programmatori a basso livello e ingegneri del kernel di Linux.
Questa pagina non potrà mai includere ogni link/libro/corso a riguardo. Ad esempio, questa pagina introduce Arduino ma non sono presenti informazioni dettagliate riguardo ad esso e alla programmazione embedded. Il resto spetta a te. Hai letto la parola chiave "Arduino" dalla quale puoi partire; perciò il tuo prossimo passo sarà probabilmente ricercarla su Google, comprare il kit e sperimentare per te stesso, non collezionare libri gratuiti e link. Ricorda che questa pagina è solo un piano.
Per tua informazione, ho oltre 10 anni di esperienza come programmatore a basso livello:
- Programmazione assembly 80x86
- Driver per hardware con chip e firmware Atmel chip
- Programmazione di sistema in linguaggio C per Unix
- Driver di dispositivo per Linux
- Kernel linux: allocazione di pagina
- Kernel linux: dispostivi a blocchi e modulo md
Identifico come programmazione a basso livello, quella programmazione che è molto vicina alla macchina, usando un linguaggio a basso come C o Assembly. Ciò è in contrasto la programmazione ad alto livello, tipica delle applicazioni denominate user-space, che utilizzano linguaggi ad alto livello (es. Python, Java).
Sì la programmazione di sistemi è volto vicina al concetto della programmazione a basso livello. Questa pagina include il design di hardware e lo sviluppo di firmware che non è incluso nella programmazione di sistema.
Per l'ultimo, questa pagina include argomenti che spaziano dalle componenti hardware al kernel Linux. Ciò è un enorme collezioni di strati. Un documento di una singola pagina non potrà mai coprire i dettagli di tutti gli strati, perciò lo scopo di questo documento è di servire come punto iniziale per la programmazione a basso livello.
Ci sono due teorie di fondo applicate alla programmazione di basso livello:
- Architettura di computer
- Sistemi operativi
Penso che il miglior sistema per imparare la teoria è seguendo un corso. Leggere libri non è male ma prende molto tempo e fatica. Puoi trovare buoni corsi nelle universtà online, per esempio, Coursera.org e edx.org. La teoria è teoria. Non penso tu possa prendere un 10 con lode in classe, giusto capendo lì il quadro generale. Migliorerai in continuazione con l'esperienza.
Ti introduco vari libri che ho letto. Sono libri di testo che sono utilizzati solitamente nelle università. Se non ci sono classi con quei libri, è consigliato spendere un po' di tempo su di essi.
- Architettura di computer
- Computer Architecture, Fifth Edition: A Quantitative Approach
- Computer Systems: A Programmer's Perspective
- Computer Organization and Design, Fourth Edition: The Hardware/Software Interface
- Sistemi operativi
- 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 C'è una lista finita di buoni libri. Non voglio dire che dovresti leggere molti libri. Leggine giusto uno molto attentamente. Una volta che impari una teoria, implementa un codice di prova per esso. Implementare una cosa è meglio che conoscere centinaia di teorie.
- assembly 8086 con emu8086
- concetti base della CPU e dell'architettura dei computer
- concetti base del linguaggio di programmazione C of C programming language
- programmazione assembly a 64bit (traduzione inglese in corso)
- concetti base di una CPU moderna e dell'architettura di computer
- concetti base di reverse engineering e di debug di codice C
- necessito aiuto per la traduzione
- Manuale di riferimento per l'architettura ARM
- Completa guida dell'architettura ARM
- Design ed organizzazione di un computer
- Edizione MIPS
- Edizione ARM
- Libri accademici che spiegano come ogni componente di un computer lavora in dettaglio
- Spiegano in dettaglio i vari concetti di un'architettura che costituisce un computer
- Non sono orientati a diventare fluido in un linguaggio assembly specifico
- L'edizione MIPs e ARM copre gli stessi argomenti ma analizzando una differente architettura
- Entrambi le edizioni contengono esempi per il mondo x86
Non ci sono scorciatorie. Leggi l'intero libro e risolvi tutti gli esercizi.
- C Programming: A Modern Approach, 2nd Edition
- The C Programming Language 2nd Edition
- C moderno
- Per il nuovo standard C
- La programmazione parallela è difficile, e, se lo è, cosa puoi farci?
- implementazione cruda della sincronizzazione con C
- Essenziale per la programmazione C a larga scala (specialmente per la programmazione di kernel)
- Sfida di programmazione C?
- Piano per un servizio come il "[The Eudyptula Challenge]"(http://eudyptula-challenge.org/)
- Semplicemente un idea al momento..
- Se puoi creare tutti i progetti piccoli di quella pagina, potresti iniziare con grandi progetti
- Michael Abrash’s Graphics Programming Black Book, Special Edition
- Guida all'ottimizzazione utilizzando C e un po' di assembly x86
- Comincia dal 8088 fino ad oggi
- Focus speciale sull'ottimizzazione della grafica a basso livello
Se vuoi essere un ingegnere dei sistemi embedded, sarebbe meglio iniziare con un kit hardware semplice, come ad esempio partire con l'ultimo chipset ARM.
- Arduino Start Kit
- Ci sono varie serie ma il "Arduino Start Kit" ha il processore più semplice(Atmega328P) e un libro che ti guida
- Atmega328P ha un core a 8bit che un buon punto di inizio per la "progettazione di circuiti" and lo "sviluppo firmware".
- Non hai bisogno di sapere come disegnare schemi e strutture, e di assemblare i chip
- Ma hai bisogno di sapere come leggere gli schemi e capire come i chip sono connessi
- Sviluppatori firmware dovrebbero essere in grado di legge gli schemi e capire come inviare i dati ai dispositivi interessati.
- Segui la guida!
- manuale 8086
- Se sei un principiante sull'architettura x86, anche il 8086 è, una buona guida per l'architettura dei processori e l'assembly 80x86
- manuale 80386
- Miglior guida per la modalità protetta e i meccanismi di paginazione del processore 80x86
- Versione web: https://pdos.csail.mit.edu/6.828/2011/readings/i386/toc.htm
A qeusto punto, dovrebbe essere una buona idea partire con l'ultimo processore x86 o ARM.
- https://www.raspberrypi.org/
- https://beagleboard.org/
- https://www.arduino.cc/en/ArduinoCertified/IntelEdison
Per esempio, la scheda Raspeberry Pi ha un processore Cortex-A53 che supporta un set di istruzioni a 64-bit. Questo ti permette di far esperienza su un processore moderno con rPi. Sì puoi comparlo...ma...come hai intenzione di utilizzarlo? Se non ha un obiettivo di progetto, probabilmente lascerai la scheda in un cassetto e te ne dimenticherai come ogni altro gadget che hai comprato in precedenza.
Perciò ti raccomando un progetto.
- Crea il tuo kernel
- Spunti interessanti: https://www.reddit.com/r/osdev/
Ho creato un kernel giocattolo che supporta la modalità long 64-bit, paginazione e un cambio di contesto molto essenziale. Creare un kernel giocattolo è un buon sistema per capire l'architettura moderna e il controllo dell'hardware.
Ovviamente, tu hai già l'ultimo processore e gli ultimi dispositivi hardware. Il tuo portatile! Il tuo desktop! Hai tutto ciò per poter iniziare. Non hai bisogno di compare nulla. L'emulatore qemu può, emulare gli ultimi porocessori ARM e Intel. Perciò ogni cosa necessiti e` già sottomano. Ci sono molti kernel giocattolo e documenti a cui puoi far riferimento. Installa qemu e crea il tuo piccolo kernel che semplicemente si avvia, avvia la paginazione e stampa alcuni messaggi.
Altri kernel giocattolo:
Non hai bisogno di creare un sistema operativo completo. Unisciti alla comunità Linux e partecipa nello sviluppo.
- Libri: leggi i seguenti in ordine
- The Design of the Unix Operating System
- I concetti base di Unix sono applicati su tutti i sistemi operativi.
- Questo libro è ottimo per i concetti sui sistemi operativi.
- Linux Device Drivers
- Fai una prova su tutti gli esempi
- Linux Kernel Development
- Capire la struttura del kernel Linux
- Understanding the Linux Kernel
- Leggi questi libro e fai rifermento ai sorgenti kernel 2.6 in contemporanea
- Mai iniziare con l'ultima versione, la 2.6 è più che sufficiente!
- Usa qemu e gdb per eseguire i sorgenti del kernel linea per linea
- Usa busybox per creare un file system molto semplice che impiega un secondo per avviarsi
- The Design of the Unix Operating System
- The Eudyptula Challenge
- È come un insegnate privato bravissimo che ti guida su cosa fare.
- Se non sai cosa fare, parti da qui.
- Block layer and device driver(translation in progress)
- inizia da un semplice dispositivo a blocchi di esempio (Ramdisk) con code multiple
- prosegui fino al dispositivo di blocco
- necessità di aiuto per la traduzione
- md driver of Linux kernel(in progress)
- come funziona lo strumento mdam e come chiava il driver md
- come funziona il driver md
- necessità di aiuto per la traduzione
Controlla qui se necessiti di qualcosa
- Homepage di Free-electrons
- molte diapositive che introducono concetti interessanti, specialmente ARM-Linux
- Julia Evans's posting: You can be a kernel hacker!
- guida per iniziare la programmazione kernel
Non conosco il futuro, ma sto tenendo osservato RUST.
Se avessi una settimana libera e sono da solo, vorrei imparare RUST. Questo perchè RUST è, il linguaggio più recente con il quale posso sviluppare un driver di dispositivo Linux.
IoT è un trend nuovo, perciò vale controllare quali sistemi operativi sono per l'IoT. ARM, Samsung e alcune aziende hanno il loro sistema operativo realtime ma tristemente molti di essi sono a sorgenti chiusi. Ma la Fondazione Linux ha una soluzione: Zephyr
Il server cloud tipico ha così tanti strati, per esempio, il sistema operativo host, driver kvm, processo qemu, sistema operativo guet e applicazioni di servizio. Perciò i container sono sviluppati per fornire una virtualizzazione leggera. In un prossimo futuro, un nuovo concetto di OS, chiamato sistema operativo libreria o Unikernel, rimpiazzerà il tipico stack software per la virtualizzazione.
Inviami una pull request se desideri che questa pagina venga tradotto. La elencherò qui.