Skip to content

Latest commit

 

History

History
361 lines (297 loc) · 31.7 KB

README_fr.md

File metadata and controls

361 lines (297 loc) · 31.7 KB

AVIS1: Veuillez ne pas copier le contenu de cette page sur votre blog. Vous pouvez partager cette page mais veuillez partager avec le lien d'origine. C'est ainsi que nous citons les auteurs de bons documents et de projets open source.

AVIS2: Veuillez noter que la programmation de bas niveau est hors de propos et qu'actuellement, il n'y a pas beaucoup d'entreprises qui embauchent des développeurs de bas niveau. Il devient de plus en plus difficile pour moi de trouver un emploi. Si vous n'avez pas encore commencé une carrière professionnelle, je vous recommande de bien réfléchir avant de choisir ce domaine.

AVIS3: Si vous voulez un démarrage rapide, allez à "Comment démarrer ?".

Université de programmation de bas niveau

Qu'est-ce que c'est ?

Je suis inspiré par google-interview-university. J'aimerais partager mon expérience et montrer une feuille de route pour devenir ingénieur en systèmes embarqués car j'ai constaté que ces compétences ne sont plus aussi courantes qu'avant. De plus, de nombreux étudiants et débutants me demandent comment ils pourraient devenir développeurs en systèmes embarqués et ingénieurs du noyau Linux.

Cette page ne peut pas inclure tous les liens/livres/cours. Par exemple, cette page présente Arduino mais il n'y a pas d'informations détaillées sur Arduino et les systèmes embarqués. Vous devriez aller plus loin par vous-même. Vous avez le mot-clé "Arduino" avec lequel vous pouvez commencer. Donc, votre prochaine étape est probablement de googler "Arduino", d'acheter un kit et de faire quelque chose par vous-même, pas de collecter des liens ou des livres gratuits. N'oubliez pas que cette page n'est qu'une feuille de route pour les débutants.

La programmation de bas niveau fait partie de l'informatique. Absolument, il serait beaucoup mieux d'obtenir d'abord une éducation en informatique.

Qu'est-ce que le bas niveau ?

Je classe la programmation de bas niveau comme une programmation très proche de la machine, en utilisant un langage de programmation de bas niveau comme C ou l'assembleur. Cela contraste avec la programmation de haut niveau, typique des applications utilisateur, utilisant des langages de haut niveau (par exemple Python, Java).

Oui, la programmation système est un concept très proche de la programmation de bas niveau. Cette page inclut la conception matérielle et le développement de micrologiciels qui ne sont pas inclus dans la programmation système.

Enfin, cette page couvre des sujets allant des composants matériels au noyau Linux. C'est une énorme gamme de couches. Un document d'une page ne peut jamais couvrir les détails de toutes les couches, donc l'objectif de ce document est de servir de point de départ pour la programmation de bas niveau.

Théorie

Il y a deux théories de fond pour la programmation de bas niveau:

  • Architecture des ordinateurs
  • Systèmes d'exploitation

Je pense que le meilleur moyen d'apprendre la théorie est de suivre un cours. Lire des livres n'est pas mal mais prend trop de temps et d'efforts. Vous pouvez trouver de nombreuses bonnes classes sur les universités en ligne, par exemple Coursera.org et edx.org. La théorie est la théorie. Je ne pense pas que vous ayez besoin d'obtenir un A+ en classe, comprenez juste les grandes lignes. Vous vous améliorerez de mieux en mieux avec l'expérience.

Je vous présenter plusieurs livres que j'ai lus. Ils sont couramment utilisés comme manuels dans les universités. S'il n'y a pas de classe avec ces livres dans votre université, il vaut la peine d'y consacrer un peu de temps.

  • Livres sur l'Architecture d'ordinateurs
    • FR Architecture des ordinateurs, cinquième édition: une approche quantitative
    • EN Computer Systems: A Programmer's Perspective
    • EN Computer Organization and Design, Fourth Edition: The Hardware/Software Interface
  • Systèmes d'exploitation
    • EN The Magic Garden Explained: The Internals of UNIX System V Release 4 an Open Systems Design
    • FR La conception du système d'exploitation UNIX par Maurice Bach
    • EN Operating Systems: Internals and Design Principles by William Stallings
  • Cours recommandés
  • Compétences générales en programmation
  • Conception de matériel
    • Construisez votre propre kit de microprocesseur 8086
      • Si vous ne construisez pas votre carte matériel, vous ne comprenez pas ce qu'est un périphérique mémoire mappé physiquement.
      • Les AP modernes incluent tellement d'IPs. Donc, vous n'avez pas la chance de comprendre comment le noyau CPU et les périphériques sont connectés.
      • Lorsque vous construisez votre propre kit 8086, vous avez la chance de localiser chaque périphérique sur la mémoire physique. Et vous pouvez définir comment les principaux composants de matériel (BUS, IRQ, horloge, alimentation, etc.) fonctionnent avec vos propres yeux.
      • J'ai construit le kit 8086 dans mon université. C'était l'un des cours les plus précieux que j'ai jamais suivis. Essayez de construire votre propre kit de matériel. Ce serait mieux si le matériel est plus ancien et plus simple car vous devriez faire plus par vous-même.
      • Google "kit 8086". Vous pourriez trouver certains sites Web où vous pouvez acheter un schéma matériel, des pièces et des manuels.

Il y a une liste infinie de bons livres. Je ne veux pas dire que vous devriez lire de nombreux livres. Il suffit de lire un livre avec soin. Chaque fois que vous apprenez une théorie, implémentez le code de simulation de celui-ci. La mise en œuvre d'une chose vaut mieux que de connaître une centaine de théories.

Langages

Assemblage

Choisissez entre de l'architecture x86 ou ARM. Pas besoin de connaître les deux. Peu importe de connaître le langage d'assemblage. L'essentiel est de comprendre les internes d'un processeur et d'un ordinateur. Vous n'avez donc pas besoin de pratiquer l'assemblage du dernier CPU. Sélectionnez 8086 ou Corex-M.

  • EN 8086 Programmation d'assemblage avec EMU8086
    • Concepts de base de la processeur et de l'architecture informatique
    • Concepts de base du langage de programmation C
  • EN 64bit Assembly Programming (traduction en cours)
    • Concepts de base du processeur moderne et de l'architecture informatique
    • Concepts de base de désastre et de débogage du code C
    • Il y a de besoin d'aide à traduire.
  • EN Assemblage d'apprentissage pour Linux-x64
    • Programmation d'assemblage 64 bits pure avec NASM et assemblage en ligne avec GCC
  • EN ARM Architecture Reference Manual, 2e édition
    • Référence complète sur la programmation des bras
  • Organisation et conception informatiques
    • EN Édition MIPS
    • EN Édition ARM
    • EN Édition RISC-V
    • Livres universitaires qui expliquent comment chaque composant d'un ordinateur fonctionne à partir de zéro.
    • Explique en détail les différents concepts qui composent l'architecture informatique.
    • Ils ne sont pas destinés aux lecteurs qui souhaitent devenir compétents dans un langage d'assemblage spécifique.
    • L'édition MIPS et ARM couvre les mêmes sujets mais en disséquant une architecture différente.
    • Les deux éditions contiennent des exemples dans le monde x86

Langage-C

Il n'y a pas de raccourci. Il suffit de lire tout le livre et de résoudre tous les exercices.

Si vous souhaitez être expert de la programmation C, visitez EN https://leetcode.com/. Bonne chance!

Rust

Je suis sûr que le prochain langage pour la programmation des systèmes serait Rust. Je ferai une liste ce que j'ai fait pour apprendre Rust.

EN Linus Torvalds a déclaré "Sauf quelque chose d'étrange, il arrivera en 6.1."

  • FR The Rust Programming Language
    • Introduction excellente, mais il manque d'exemples et d'exercices.
  • EN Rust par l'exemple
    • En lisant "The Rust Programming Language", vous pouvez trouver des exemples et des exercices ici.
    • Mais il n'y a pas beaucoup d'exercices que vous pouvez faire quelque chose pour vous-même. Seuls quelques exemples comprennent des exercices «à faire» et ils sont très simples.
  • EN Programming Rust, 2e édition
    • Introduction plus profonde, mais toujours manque d'exemples et d'exercices.
  • EN Des Exercices
    • De bons exercices pour pratiquer les caractéristiques indivisuelles de Rust.
    • Je ne suis pas sûr que les mentors travaillent activement, mais ce serait suffisant pour comparer votre solution avec les autres.
      • Après avoir soumis votre solution, vous pouvez voir les solutions des autres avec l'onglet "Solutions communautaires" (depuis l'exercice v3).
      • De nombreux exercices de niveau facile sont destinés aux fonctionnalités utilitaires telles que la carte / filtre / tout et etc.
  • EN Rust Easy
  • EN Let's Get Rusty
    • Il y a beaucoup de YouTubers à télécharger le cours de Rust, mais j'ai le plus apprécié ce cours.
    • Il a téléchargé les dernières nouvelles pour Rust. Il vaut la peine de s'abonner.
  • EN Rust en Linux
    • Voir l'exemple de sources et vérifier comment Rust va entrer dans le noyau Linux

Applications

Matériel & Micrologiciel

Si vous voulez être ingénieur en systèmes embarqués, il serait préférable de commencer par un simple kit matériel, plutôt que de commencer avec le dernier jeu de puces ARM.

  • EN Kit de démarrage Arduino
    • Il existe de nombreuses séries d'Arduinos mais le "Kit de démarrage Arduino" a le processeur le plus simple (Atmega328P) et le livre de guide
    • L'Atmega328P a un cœur 8 bits qui est un bon endroit pour commencer la conception de circuits numériques et le développement de microprogrammes.
    • Vous n'avez pas besoin de savoir comment dessiner des schémas et des plans et assembler les puces.
    • Mais vous devez savoir comment lire les schémas et comprendre comment les puces sont connectées.
    • Les développeurs de micrologiciels doivent être capables de lire les schémas et de comprendre comment envoyer des données au périphérique cible.
    • Suivez le guide !
  • EN Manuel 8086
    • Si vous débutez dans l'architecture x86, le 8086 est également un très bon guide pour l'architecture du processeur et l'assemblage 80x86.
  • EN Manuel 80386

À ce stade, vous devriez être en mesure de commencer le dernier processeur ARM ou x86.

Par exemple, la carte Raspberry Pi (rPi) possède un processeur Cortex-A53 qui prend en charge un jeu d'instructions 64 bits. Cela vous permet de découvrir une architecture de processeur moderne avec rPi. Oui, vous pouvez l'acheter... mais... qu'allez-vous en faire ? Si vous n'avez pas de projet cible, vous seriez susceptible de jeter le matériel dans un tiroir et de l'oublier comme les autres gadgets que vous avez peut-être achetés auparavant.

Donc, je vous recommande un projet pour vous.

J'ai fait un petit noyau qui prend en charge le mode long 64 bits, la pagination et la commutation de contexte très simple. Faire un petit noyau est un bon moyen de comprendre l'architecture informatique moderne et le contrôle du matériel.

En fait, vous avez déjà le dernier processeur et les derniers appareils matériels. Ton ordinateur portable! Votre bureau! Vous avez déjà tout ce dont vous avez besoin pour commencer! Vous n'avez rien à acheter. L'émulateur Qemu peut imiter les derniers processeurs ARM et processeurs Intel. Donc, tout ce dont vous avez besoin est déjà à portée de main. Il existe de nombreux grains de jouets et documents auxquels vous pouvez vous référer. Installez simplement l'émulateur Qemu et faites un minuscule noyau qui bottise, allume la pagination et imprime certains messages.

Des autres petites noyau:

Linux noyau et pilote de périphérique

Vous n'avez pas besoin de faire un système d'exploitation complet. Rejoignez la communauté Linux et participez au développement.

Quelques ressources pour le développement de pilotes de périphériques et de noyaux Linux, du débutant à l'avancé.

Références

Vérifiez lorsque vous avez besoin de quelque chose

Autres applications

Oui, vous n'êtes peut-être pas intéressé par Linux ou le micrologiciel. Si tel est le cas, vous pouvez trouver d'autres applications:

  • Programmation de systèmes Windows et pilotes de périphériques
  • Sécurité
  • Rétro-ingénierie

Je n'ai aucune connaissance sur ces applications. Veuillez m'envoyer toute information pour les débutants.

Les noyaux et les pilotes ne sont pas toute la programmation de bas niveau. Une autre application importante de la programmation de bas niveau est le stockage défini par logiciel ou le système de fichiers distribué. La description détaillée de ceux-ci dépasse le cadre de ce document, mais il existe un excellent cours où vous pouvez essayer un simple système de fichiers distribué.

L'avenir de la programmation de bas niveau

Je ne connais pas l'avenir, mais je tiens Rust en compte.

Si je pouvais avoir une semaine de libre et seul, j'apprendrais Rust. C'est parce que Rust est le dernier langage avec lequel je peux développer des pilotes de périphériques Linux.

L'IdO est une nouvelle tendance, il vaut donc la peine de vérifier quels sont les systèmes d'exploitation pour l'IdO. ARM, Samsung et certaines entreprises ont leur propre système d'exploitation en temps réel mais malheureusement beaucoup d'entre eux sont à code propriétaire (source fermé). Mais la Fondation Linux a également une solution: Zephyr

Les serveurs cloud typiques ont de nombreuses couches ; par exemple, le système d'exploitation hôte, le pilote kvm, le processus qemu, le système d'exploitation guest et l'application de service. Un conteneur a été développé pour fournir une virtualisation légère. Dans un avenir proche, un nouveau concept de système d'exploitation, un soi-disant système d'exploitation de bibliothèque ou Unikernel, remplacerait la pile logicielle typique pour la virtualisation.

Le Big Data et le cloud computing nécessitent un stockage de plus en plus important. Certains disques connectés directement aux machines serveurs ne peuvent pas satisfaire la capacité, la stabilité et les performances requises. Par conséquent, des recherches ont été menées pour créer d'énormes systèmes de stockage avec de nombreuses machines de stockage connectées par un réseau haut débit. L'objectif était de créer un énorme volume de stockage. Mais actuellement, ils fournissent de nombreux volumes dédiés à de nombreuses machines virtuelles.

Comment démarrer ?

J'ai reçu un e-mail me demandant comment démarrer. Il y a pleine d'informations sur les livres, les cours et les projets dans cette page. C'est mon erreur d'avoir oublié d'écrire comment démarrer. Malheureusement, il n'y a pas de route royale vers EN King's Landing. Je vais simplement écrire ce que j'ai fait dans l'ordre. Si vous avez déjà fait quelque chose, veuillez le ignorer. Tiens en compte, c'est juste un exemple que vous pouvez suivre dans l'ordre, au cas où vous ne sauriez pas comment démarrer ou quoi faire.

  • Lire les livres de théorie des systèmes d'exploitation: au moins "The Design of the UNIX Operating System" par Maurice J. Bach
  • Apprendre l'assemblage et C
  • Faites quelque chose de pratique avec C
    • EN Tutoriels de projet basés sur C ?: trouvez un ou deux projets intéressants et faites votre propre projet.
    • EN leetcode.com: Si vous ne trouvez pas de projet intéressant, il serait également bon de vous concentrer sur la structure de données et les algorithmes.
  • Faire un projet matériel
    • Choisissez Raspberrypi ou Arduino, peu importe lequel. Vous avez besoin d'expérience pour contrôler un matériel directement avec seulement C. UNIQUEMENT C !
    • Je vous recommande d'acheter un kit Atmega128 et de créer un micrologiciel pour allumer/éteindre des LED, détecter l'entrée d'un commutateur et afficher un message sur l'écran LCD texte. Le programme de contrôle de moteur est également un très bon projet: par exemple, le traceur de ligne.
    • N'UTILISEZ AUCUNE bibliothèque. Vous devez tout faire par vous-même, sauf le téléchargeur de programme.
  • Notions de base du noyau Linux
  • Aller dans le domaine professionnel
    • Si vous souhaitez devenir développeur professionnel de noyaux Linux
      • doit lire EN Comprendre le noyau Linux
      • Consultez les derniers problèmes sur EN https://lwn.net/ et rejoignez-le.
        • Consultez les "Correctifs de noyau récents" à EN "https://lwn.net/Kernel/" ou le lien direct EN https://lwn.net/Kernel/Patches
        • Trouvez un correctif qui vous intéresse. Essayez de comprendre le code source. Bien sûr, ce sera vraiment difficile, mais essayez. Vous vous rapprocherez de plus en plus à chaque fois que vous essayerez.
        • Générez le noyau et testez-le sur votre système. Par exemple, test de performances, test de stabilité avec LTP (EN https://linux-test-project.github.io/) ou outils d'analyse de code statique à l'intérieur du noyau.
        • Signalez tout problème si vous en trouvez: avertissements/erreurs de compilation, dégradation des performances, panique du noyau/oops ou tout autre problème
        • Si cela fonctionne bien, rapportez-le avec les spécifications de votre système. Le propriétaire du correctif écrira une balise "Reviewed-by" avec votre nom.
        • Trouvez votre nom dans le journal git du noyau
    • Ou trouvez d'autres sujets
      • Il existe de nombreuses spécialités où l'ingénieur de bas niveau peut travailler: sécurité, compilateur, micrologiciel, robot / voiture, etc.

Traduction

Veuillez m'envoyer une pull request si vous souhaitez traduire cette page. Je la répertorierai ici.

Qui suis-je ?

Je suis inspiré par google-interview-university. J'aimerais partager mon expérience et montrer une feuille de route pour devenir ingénieur(e) en systèmes embarqués car j'ai constaté que ces compétences ne sont plus aussi courantes qu'avant. De plus, de nombreux étudiants et débutants me demandent comment ils pourraient devenir programmeurs de bas niveau et ingénieurs de noyaux Linux.

Pour votre information, j'ai plus de 10 ans d'expérience en tant que ingénieur en systèmes embarqués:

  • Programmation en assembleur 80x86
  • Périphérique matériel avec puce Atmel et micrologiciel
  • Programmation système en langage C pour Unix
  • Pilote de périphérique dans Linux
  • Noyau Linux: allocation de pages
  • Noyau Linux: pilote de périphérique de bloc et module md