Les bases du système

Partie 1 : Les fondations matérielles et architecturales

Introduction au système. Un système informatique réunit des composants matériels et des logiciels qui coopèrent par couches clairement séparées. Le matériel fournit la puissance de calcul, la mémoire vive sert d’espace de travail et le stockage conserve les données sur la durée. Le système d’exploitation organise l’utilisation de ces ressources, traduit les demandes des programmes et applique des règles de sécurité stables. Les pilotes assurent la compatibilité avec chaque périphérique en masquant les détails techniques, tandis que les applications se concentrent sur leur métier sans parler directement au matériel. Cette approche par abstraction rend l’ensemble plus simple à faire évoluer, à diagnostiquer et à sécuriser, depuis le démarrage jusqu’à l’exécution quotidienne.

Grâce à cette organisation en couches, l’installation, l’ouverture et l’utilisation d’une application deviennent prévisibles et reproductibles, quel que soit le matériel sous‑jacent. Les interfaces exposées par l’OS offrent des services cohérents pour manipuler des fichiers, communiquer sur le réseau ou gérer les utilisateurs. La stabilité du socle permet de remplacer un composant ou de mettre à jour un pilote sans perturber les logiciels existants. En pratique, comprendre où se situe une fonction dans cette hiérarchie aide à localiser une panne et à choisir l’outil de diagnostic pertinent.

Chapitre 1 : Introduction aux architectures informatiques

1.0 — Notions

On décrit un système comme un ensemble de couches qui coopèrent sans se confondre. Le matériel fournit la puissance brute, le firmware amorce la machine, le noyau expose des services de base et les applications utilisent ces services via des interfaces. Cette séparation s’appelle l’abstraction : chaque couche cache ses détails et propose un langage simple aux couches du dessus. Cela rend les systèmes plus faciles à faire évoluer, à réparer et à sécuriser. Lors d’un diagnostic, savoir à quel étage se situe le problème permet d’aller vite et droit au but.

Empilement des couches Illustration de couches superposées du matériel aux applications Matériel Firmware / Pilotes Système d’exploitation (noyau + services) Applications
Un modèle en couches : chaque étage simplifie l’accès au précédent et expose des services stables.

1.1 — Qu’est‑ce qu’un système informatique ?

Un système informatique est l’association structurée d’un matériel et de logiciels qui se parlent par étapes. Les pilotes servent d’interprètes entre le noyau et chaque périphérique, tandis que des services communs apportent le réseau, les comptes utilisateurs et la journalisation. Cette organisation évite que les applications gèrent des détails matériels et réduit les risques d’erreur. Elle autorise aussi des remplacements ciblés, comme changer une carte ou un pilote sans toucher aux logiciels. Le résultat est un ensemble plus robuste, cohérent et maintenable.

On parle de plate-forme lorsqu’un même système peut accueillir différents matériels et applications tout en conservant les mêmes règles de fonctionnement.

1.2 — Jeu d’instructions (ISA)

Le jeu d’instructions définit les opérations compréhensibles par le processeur et la manière de les exprimer. On y retrouve un code d’opération, des opérandes et des modes d’adressage, avec des conventions d’ordre des octets (endianness). Les familles x86‑64 et ARM64 dominent aujourd’hui et impliquent des choix de compilation différents. Pour l’utilisateur, ces détails sont invisibles, mais ils guident les performances et la compatibilité logicielle. Les compilateurs traduisent le code en respectant ce contrat entre logiciel et matériel.

Exemples d’instructions Représentation symbolique d’instructions x86‑64 et ARM64 x86‑64 mov rax, [rbx+8] add rax, rcx ARM64 ldr x0, [x1, #8] add x0, x0, x2
Même intention logique, encodages et conventions différents selon l’architecture.

Chapitre 2 : Au cœur des composants

2.1 — Processeur (CPU)

Le processeur exécute des instructions à un rythme très élevé en s’appuyant sur des unités spécialisées. Ses performances résultent d’un ensemble de facteurs : nombre de cœurs, fréquence, profondeur de pipeline et taille des caches. Les cœurs modernes prédisent les branchements et réordonnent certaines opérations pour ne pas rester inactifs. Des extensions vectorielles accélèrent les calculs sur de grands tableaux de données. Comprendre ces mécanismes aide à lire un moniteur système et à expliquer une charge CPU élevée.

La conception du refroidissement et l’enveloppe thermique influent directement sur le maintien des fréquences, donc sur la performance ressentie.

Pipeline CPU Étapes typiques d’un pipeline instructionnel Fetch Decode Execute Memory Writeback
Un pipeline séquence les étapes pour améliorer le débit global d’exécution.

2.2 — Hiérarchie de la mémoire

La mémoire est organisée en étages du plus rapide au plus capacitaire : registres, caches, RAM puis stockage. Plus on descend, plus l’accès est lent, d’où l’importance d’exploiter la localité des données. Quand les informations tiennent dans les caches, le processeur avance beaucoup plus vite. Inversement, une série d’accès dispersés provoque des « manqués de cache » coûteux. Structurer ses données et ses parcours améliore la réactivité sans changer d’algorithme.

Hiérarchie mémoire Paliers de mémoire du plus rapide au plus lent Registres (très rapide, très petit) Caches L1/L2/L3 RAM Stockage (SSD/HDD)
Plus on descend dans la hiérarchie, plus la capacité augmente et plus la latence s’allonge.

2.3 — Registres du CPU

Les registres sont de très petites zones de mémoire intégrées au processeur et accessibles quasi instantanément. Certains portent des noms et des rôles bien définis (comme RAX, RSP, RIP sur x86‑64 ou X0, SP, PC sur ARM64). Ils servent à passer des paramètres, à conserver des adresses et à stocker des résultats intermédiaires. Des registres dédiés indiquent la prochaine instruction, le sommet de pile ou l’état des opérations. Les jeux de registres vectoriels traitent plusieurs données en une seule fois pour accélérer des tâches répétitives.

Partie 2 : L’orchestrateur — le système d’exploitation

Chapitre 3 : Rôle et structure de l’OS

3.1 — Fonctions principales

Le système d’exploitation répartit l’usage du processeur, de la mémoire et des périphériques entre les programmes. Il fournit une interface simple pour manipuler des fichiers, lancer des applications et configurer la machine. En arrière‑plan, il gère les droits, isole les applications et enregistre des événements utiles au diagnostic. Il crée, planifie et arrête les processus et leurs fils d’exécution, tout en offrant des moyens de communication sûrs. La mémoire virtuelle et ses protections évitent qu’un programme n’empiète sur un autre.

La plupart des outils visibles (explorateur de fichiers, moniteur d’activité) s’appuient sur ces mécanismes, d’où l’intérêt d’en comprendre la logique.

Isolation des processus Deux espaces utilisateurs séparés qui passent par le noyau Processus A Espace utilisateur Processus B Espace utilisateur Noyau (mémoire et périphériques protégés)
Chaque processus dispose d’un espace isolé ; les accès aux ressources passent par le noyau.

3.2 — Noyau et appels système

Le noyau fonctionne dans un mode privilégié et n’est accessible qu’au travers d’appels système contrôlés. Ces appels servent de portes d’entrée pour ouvrir un fichier, allouer de la mémoire ou parler au réseau. Les interruptions signalent des événements matériels, tandis que des trappes provoquent des passages volontaires dans le noyau. À chaque changement de contexte, l’OS sauvegarde l’état d’un programme pour en exécuter un autre. Ce contrôle centralisé garantit cohérence, sécurité et partage équitable des ressources.

Appels système Schéma du passage entre espace utilisateur et noyau Programme (espace utilisateur) Noyau (espace privilégié) appel système
Les appels système sont des passerelles contrôlées entre le programme et le noyau.

3.3 — Panorama des OS

Windows, macOS et Linux suivent des principes communs mais diffèrent par leurs outils et conventions. Windows s’appuie sur le noyau NT et une API riche intégrée à l’écosystème Microsoft. macOS combine un noyau XNU et des frameworks cohérents avec l’expérience utilisateur Apple. Linux réunit un noyau flexible et une variété de distributions orientées serveurs, postes ou embarqué. Dans tous les cas, les bases vues ici se retrouvent et se transfèrent d’une plateforme à l’autre.

Partie 3 : Anatomie d’un programme

Chapitre 5 : Format des fichiers exécutables

5.1 — De la compilation à l’exécutable

Le code source traverse plusieurs étapes pour devenir un exécutable prêt à être lancé. Le préprocesseur prépare le texte, le compilateur traduit en instructions, l’assembleur produit du code machine et l’éditeur de liens rassemble le tout. Le lien peut inclure les bibliothèques directement (statique) ou les laisser chargées au démarrage (dynamique). La relocalisation ajuste les adresses pour que le programme fonctionne où qu’il soit chargé. Des techniques comme l’ASLR apportent une dose d’aléa qui complique certaines attaques.

Selon l’objectif, on privilégie soit la taille (embarqué), soit la vitesse (serveur), soit l’équilibre pour un poste utilisateur.

5.2 — Programme Windows (PE)

Le format PE décrit un programme Windows à l’aide d’en‑têtes et de sections bien identifiées. On y trouve le point d’entrée, des tables qui listent les fonctions importées et exportées, et les zones de code et de données. Cette structure permet au chargeur de positionner le binaire en mémoire et de résoudre ses dépendances. Des protections comme la prévention d’exécution et l’ASLR s’appliquent au moment opportun. Les outils d’analyse savent lire ces informations pour diagnostiquer un problème de lancement.

5.3 — Programme Linux (ELF)

Le format ELF organise les informations d’un programme Linux en en‑têtes, segments et sections. Des mécanismes comme PLT et GOT permettent de résoudre les fonctions de bibliothèques à la demande. Les métadonnées décrivent ce qu’il faut charger, où et avec quels droits. Là encore, des protections comme NX, RELRO ou PIE renforcent l’exécution. Les utilitaires en ligne de commande facilitent l’inspection pour le débogage et l’audit.

ELF : sections et segments Différence entre organisation logique (sections) et chargement (segments) Sections .text · .data · .rodata · .bss Segments LOAD RX · LOAD RW · DYNAMIC
Les sections décrivent le contenu, les segments servent au chargement effectif en mémoire.

Partie 6 : Organisation de la mémoire d’un processus

Chapitre 6 : Organisation de la mémoire d’un processus

6.1 — La pile d’exécution (stack)

La pile gère les appels de fonctions selon une logique « dernier arrivé, premier servi ». Chaque appel crée une trame qui contient l’adresse de retour et les variables locales nécessaires. Des conventions d’appel décrivent comment passer les paramètres et qui sauvegarde quels registres. Une pile trop sollicitée peut déborder ; des protections matérielles et logicielles limitent ce risque. Bien comprendre la pile aide à interpréter les traces de plantage et à écrire du code fiable.

Trames de pile Empilement de trames et retours d’appel main() f() g() h() Sommet de pile →
Chaque appel empile une trame ; au retour, la trame correspondante est dépilée.

6.2 — Le tas (heap)

Le tas sert aux allocations dynamiques, utiles lorsque la taille ou la durée de vie des données n’est pas connue à l’avance. Des bibliothèques d’allocation gèrent les demandes, la fragmentation et la libération des blocs. Des erreurs classiques comme les fuites ou les libérations multiples dégradent la stabilité et la sécurité. Des outils spécialisés détectent ces anomalies et aident à les corriger. Une stratégie d’allocation claire simplifie la maintenance et améliore les performances.

6.3 — Stack vs Heap

La pile est très rapide et automatique mais limitée en taille, tandis que le tas est flexible et adapté aux structures volumineuses. Choisir le bon emplacement dépend de la durée de vie, de la taille et du partage des données. En pratique, on privilégie la pile pour des objets courts et simples, et le tas pour des données plus durables ou partagées. Documenter la propriété des objets réduit les erreurs et facilite les revues de code. Mesurer l’impact mémoire permet d’ajuster ces choix au besoin.

Pile vs Tas Deux zones mémoire aux propriétés différentes Pile (stack) rapide, taille limitée Tas (heap) flexible, gestion explicite
Deux stratégies complémentaires selon la taille et la durée de vie des données.

Partie 4 : Synthèse

Chapitre 8 : Cycle de vie d’un programme

8.0 — Notions

Le parcours d’un programme va de l’écriture du code à l’obtention d’un binaire, puis à son chargement en mémoire et à son exécution. À chaque étape, des acteurs prennent le relais : compilateur, éditeur de liens, chargeur, noyau et enfin application. Le dialogue avec le système passe par des appels bien définis, enregistrés dans des journaux utiles au diagnostic. L’exécution produit des résultats et un code de sortie qui résume l’issue. Cette vue d’ensemble aide à situer rapidement une panne ou une lenteur.

8.1 — Trajet détaillé

La compilation fixe un point d’entrée, l’édition de liens règle les dépendances et le chargeur positionne le programme en mémoire. Les bibliothèques partagées sont résolues au démarrage ou au premier usage pour accélérer le lancement. Pendant l’exécution, le programme lit et écrit via des canaux standard et demande des services au système d’exploitation. À la fin, il libère ses ressources et renvoie un code indiquant le succès ou l’échec. L’observation de ces étapes permet d’optimiser la robustesse et la performance.

Cycle de vie Chaîne compilation → chargement → exécution → terminaison Compilation Binaire Chargement Exécution
Du code au programme en cours d’exécution : une chaîne d’étapes coordonnées par l’OS.