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 ?".
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.
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.
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 quantitativeEN
Computer Systems: A Programmer's PerspectiveEN
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 DesignFR
La conception du système d'exploitation UNIX par Maurice BachEN
Operating Systems: Internals and Design Principles by William Stallings
- Cours recommandés
- Compétences générales en programmation
EN
Structure et interprétation des programmes informatiques- C'est de la façon d'être un bon programmeur logiciel. Vous avez besoin non seulement de théorie mais aussi de techniques car la programmation est une sorte d'artisanat.
- Si vous apprenez Lisp/Scheme, vous devriez être capable d'apprendre rapidement n'importe quel autre langage.
EN
J'ai résolu environ 80 % des exercices. Cela vaut la peine d'essayer chaque exercice unique.
- 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.
- Construisez votre propre kit de microprocesseur 8086
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.
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 MIPSEN
Édition ARMEN
É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
Il n'y a pas de raccourci. Il suffit de lire tout le livre et de résoudre tous les exercices.
EN
C Programming: A Modern Approach, 2e éditionEN
The C Programming Language, 2e édition- Modern C: Jens Gustedt. Manning, 2019, 9781617295812. FFHAL-02383654F
- Pour une nouvelle norme de C
EN
La programmation parallèle est-elle difficile et, si oui, que pouvez-vous faire à ce sujet?- Implémentation âpre de la synchronisation avec C
- Essentiel pour la programmation C à grande échelle (en particulier pour la programmation du noyau)
EN
C Tutoriels basés sur le projet?- Si vous finissez de lire un ou deux livres de programmation C, il faut s'appliquez à quelque chose.
- Choisissez ce que vous voulez.
- Faites d'abord vous-même, puis comparez avec le code source de quelqu'un d'autre. Il est très important de comparer votre source et d'autres. Vous ne pouvez améliorer vos compétences que lorsque vous lisez le code source des autres et apprendre de meilleures méthodes. Les livres sont inflexible et le code source est en direct.
EN
C et autres projets basés sur les langues- Trouvez des projets plus intéressants
EN
Michael Abrash’s Graphics Programming Black Book, Special Edition- Référence sur l'optimisation en utilisant C et un peu d'assemblage x86
- Commence du 8088 à aujourd'hui
- Focus spécial sur l'optimisation des graphiques de bas niveau
EN
Framework and Plugin Design in C- Comment développer le framework et le plugin en C pour les logiciels à grande échelle
- Conseils de programmation très basiques pour la lecture de le code source du noyau Linux
Si vous souhaitez être expert de la programmation C, visitez EN
https://leetcode.com/. Bonne chance!
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- Un livre écrit en anglais simple.
- Leçons YouTube fourni: https://www.youtube.com/playlist?list=plfllocyhvgsrwlktahg0e-2qxcf-ozbkkk
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
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- Meilleur guide pour le mode protégé et le mécanisme de pagination du processeur 80x86
- Version Web:
EN
https://pdos.csail.mit.edu/6.828/2011/readings/i386/toc.htm
À ce stade, vous devriez être en mesure de commencer le dernier processeur ARM ou x86.
EN
https://www.raspberrypi.org/EN
https://beagleboard.org/EN
https://www.arduino.cc/en/ArduinoCertified/IntelEdison
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.
- Faire votre propre noyau
- Bonnes références: https://www.reddit.com/r/osdev/
- Développement du système d'exploitation d'apprentissage à l'aide du noyau Linux et de Raspberry Pi
- (Description du projet) Ce référentiel contient un guide étape par étape qui enseigne comment créer un simple noyau de système d'exploitation (OS) à partir de zéro ... (skip) ... chaque leçon est conçue de telle manière que Il explique d'abord comment certaines fonctionnalités du noyau sont implémentées dans le rPi OS, puis il essaie de démontrer comment la même fonctionnalité fonctionne dans le noyau Linux.
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:
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é.
- Livres: Lisez ce qui suit dans l'ordre
EN
The Design of the Unix Operating System- Les concepts de base d'Unix sont appliqués à tous les systèmes d'exploitation.
- Ce livre est un très bon resource pour apprendre les concepts de base des systèmes d'exploitation.
EN
Linux Device Drivers- Faites tous les exemples par vous-même
EN
Linux Kernel Development- Comprendre la conception du noyau Linux
EN
Understanding the Linux Kernel- Lisez ce livre et le code source du noyau v2.6 en même temps
- Ne commencez jamais par la dernière version, v2.6 est suffisant !
- Utilisez qemu et gdb pour exécuter le code source du noyau ligne par ligne
- Utilisez busybox pour créer le système de fichiers le plus simple qui ne prend qu'une seconde pour démarrer
- Autres ressources: ressources gratuites que je recommande
EN
Linux device driver labs- Guide pratique et excellents exercices de création de pilotes de périphériques Linux avec les API de noyau essentielles
- Je pense que ce document présente presque toutes les API de noyau essentielles.
EN
Le défi Eudyptula- Malheureusement, ce défi n'accepte plus de nouveaux challengers car il n'y a plus de défi. Le mainteneur a dit qu'il prévoyait un nouveau format. J'espère qu'il reviendra dès que possible.
- Mais vous pouvez trouver les questions du défi avec Google. Certaines personnes ont déjà téléchargé ce qu'elles ont fait. Trouvez les questions et essayez de les résoudre par vous-même, puis comparez votre solution avec celles des autres.
- C'est comme un excellent professeur privé qui vous guide sur ce qu'il faut faire.
- Si vous ne savez pas quoi faire, commencez simplement par cela.
- Malheureusement, ce défi n'accepte plus de nouveaux challengers car il n'y a plus de défi. Le mainteneur a dit qu'il prévoyait un nouveau format. J'espère qu'il reviendra dès que possible.
EN
Apprendre le développement de systèmes d'exploitation à l'aide du noyau Linux et du Raspberry Pi- Ce projet n'est pas encore terminé.
- Je pense toujours que créer un noyau similaire au noyau Linux est le meilleur moyen de comprendre le noyau Linux.
EN
Couche de bloc et pilote de périphérique- commencez par un exemple simple de pilote de périphérique de bloc (ramdisk) avec le mode multi-files d'attente
- allez de l'avant vers la couche de bloc
- J'ai terminé la traduction en anglais. Envoyez-moi vos commentaires.
KO
Pilote md du noyau Linux (coréen)- comment l'outil mdadm fonctionne et comment il appelle le pilote md
- comment fonctionne le pilote md
EN
Un code source de noyau Linux lourdement commémoré- Commentaires profonds pour l'ancien Linux v0.12.
- Il serait bon de commencer par un OS ancien et simple.
- Version Unix:
EN
Commentaire de Lions sur UNIX 6e édition, avec code source
Vérifiez lorsque vous avez besoin de quelque chose
EN
Page d'accueil bootlin- de nombreux fichiers de diapositives présentant de bons sujets, spécialement ARM-linux
EN
Publication de Julia Evans: Vous pouvez être un hacker de noyau !- guide pour commencer la programmation de noyau
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é.
- Cours:
EN
https://pdos.csail.mit.edu/archive/6.824-2012/ - Source de référence:
EN
https://github.com/srned/yfs
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.
EN
https://en.wikipedia.org/wiki/Software-defined_storageEN
https://en.wikipedia.org/wiki/Clustered_file_systemEN
https://en.wikipedia.org/wiki/Ceph_(software)
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
EN
Programmation en assembleur 8086 avec emu8086- Il suffit de comprendre le concept de la programmation en assembleur. Vous n'avez pas besoin de faire quelque chose de pratique.
EN
The C Programming Language, 2e édition- FAITES DE VOTRE MIEUX pour résoudre chaque exercice !
EN
C Programming: A Modern Approach, 2e édition
- 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
- La programmation de bas niveau est très proche du système d'exploitation. Vous devez connaître l'intérieur du système d'exploitation.
- Commencez avec les pilotes
- Lisez
EN
Linux Kernel Driver Development pour comprendre l'interne 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- Essayez ensuite de créer un noyau petit
EN
Apprendre le développement de systèmes d'exploitation à l'aide du noyau Linux et du Raspberry PiEN
Créer votre propre noyau- Écrivez le lien github vers votre noyau sur votre CV (n'oubliez pas d'écrire la description détaillée dans le message de validation)
- 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 directEN
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
- Consultez les "Correctifs de noyau récents" à
- doit lire
- 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.
- Si vous souhaitez devenir développeur professionnel de noyaux Linux
Veuillez m'envoyer une pull request si vous souhaitez traduire cette page. Je la répertorierai ici.
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