Skip to content

Latest commit

 

History

History
215 lines (171 loc) · 14.8 KB

README_it.md

File metadata and controls

215 lines (171 loc) · 14.8 KB

Università della programmazione a basso livello

Che cos'è?

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

Che cos'è il basso livello?

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.

Teoria

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.

Linguaggi

Assembly

  • 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

Linguaggio C

Non ci sono scorciatorie. Leggi l'intero libro e risolvi tutti gli esercizi.

Applicazioni

Hardware e firmware

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 &egrave, una buona guida per l'architettura dei processori e l'assembly 80x86
  • manuale 80386

A qeusto punto, dovrebbe essere una buona idea partire con l'ultimo processore x86 o ARM.

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.

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&ograve, 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:

Kernel linux kernel e driver di dispositivo

Non hai bisogno di creare un sistema operativo completo. Unisciti alla comunità Linux e partecipa nello sviluppo.

Leggi attentamente

Riferimenti

Controlla qui se necessiti di qualcosa

Futuro della programmazione a basso livello

Non conosco il futuro, ma sto tenendo osservato RUST.

Se avessi una settimana libera e sono da solo, vorrei imparare RUST. Questo perchè RUST &egrave, 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.

Traduzioni

Inviami una pull request se desideri che questa pagina venga tradotto. La elencherò qui.