Aller au contenu principal
own2pwn
os/intro.tsx

C'est quoi un OS, vraiment ?

Architecture generale d'un OS : role du kernel, espaces utilisateur et noyau, types de kernels (monolithique, micro, hybride) et notion de modules systemes charges a chaud.

Maxime Jérôme··5 min de lecture

Prerequis

  • Comprehension basique de Linux
    • Shell
  • Programmation en C

Hello o/

L'Architecture Generale d'un OS

Imaginez un OS (Operating System) comme une grande ville. Les system calls (comme write(2) et ptrace(2)) sont les routes principales qui permettent aux utilisateurs d'interagir avec le systeme. Ces appels sont les portes d'entree vers les fonctionnalites du kernel, le chef d'orchestre de notre ville numerique.

Le Kernel : Le Chef d'Orchestre

Le kernel est le programme qui s'execute en premier sur votre machine, comme le chef d'orchestre qui dirige une symphonie. Il a tous les droits, accedant directement au hardware. Son binaire se trouve dans /vmlinuz ou /boot/vmlinuz.

Lors du demarrage, le kernel initialise le systeme et cree le premier processus : sur UNIX, c'est init, sur Linux, c'est systemd. Voici un petit extrait de code pour illustrer un syscall simple :

c
#include <unistd.h>

int main() {
    const char *msg = "Hello, OS!\n";
    write(1, msg, 13); // 1 est le file descriptor pour stdout
    return 0;
}

Gestion de la Memoire : La Magie des Adresses Virtuelles

L'OS gere la memoire avec des adresses virtuelles. Pensez-y comme une bibliotheque ou chaque livre (processus) a sa propre etagere (espace virtuel). Le MMU (Memory Management Unit) et la TLB (Translation Lookaside Buffer) sont les bibliothecaires qui traduisent les demandes d'un livre en une adresse physique.

La gestion de la memoire se divise en deux : pagination et segmentation. La pagination decoupe la memoire en blocs, reduisant la fragmentation externe, tandis que la segmentation isole des parties d'un processus en segments distincts.

virtual-memory.txt
  Processus A           Processus B
  ┌─────────────┐        ┌─────────────┐
  │ addr virtuelle│       │ addr virtuelle│
  │  0x0000_1000 │       │  0x0000_1000 │
  └──────┬──────┘        └──────┬──────┘
         │                      │
         │    MMU + TLB          │
         │  (traduction)         │
         ▼                      ▼
  ┌──────────────────────────────────────┐
  │         MEMOIRE PHYSIQUE (RAM)       │
  │  0x1A00_0000   │   0x2B00_0000       │
  │  (frame A)     │   (frame B)         │
  └──────────────────────────────────────┘
La MMU et la TLB traduisent les adresses virtuelles vers la memoire physique.

Securite et Privileges : Le Gardien de la Forteresse

L'espace kernel et l'espace utilisateur sont comme deux royaumes separes. L'utilisateur n'a acces a la memoire kernel que par des syscalls. Le kernel, tel un gardien de la forteresse, a tous les droits, tandis que l'utilisateur doit se contenter de permissions limitees. Par exemple, un syscall simple comme printf passe par write(2) :

c
#include <stdio.h>

int main() {
    printf("Hello, Kernel!\n"); // Appel indirect a write(2)
    return 0;
}
kernel-user-space.txt
  ┌──────────────────────────────────────────┐
  │           ESPACE UTILISATEUR            │
  │   programme C   printf()   libc         │
  │                    │                    │
  │                syscall (write)          │
  └────────────────────┼─────────────────── ┘
                       │  (transition ring3 -> ring0)
  ┌────────────────────▼─────────────────── ┐
  │              ESPACE KERNEL               │
  │   sys_write   │   drivers   │   MM       │
  │                                          │
  │          acces direct hardware           │
  └──────────────────────────────────────────┘
L'espace utilisateur et l'espace kernel sont separes : les syscalls sont le seul pont.

Types de Kernels : Les Differents Chefs

Tous les kernels ne sont pas crees egaux. Voici les types principaux :

TypePrincipeExemple
MonolithicUn seul programme gere tout (drivers, FS, reseau...). Rapide, mais une faille dans un driver peut compromettre tout le kernel.Linux, BSD
MicroFonctionnalites minimales dans le kernel. Les autres services tournent en espace utilisateur. Plus sur, moins performant.Minix, QNX
HybrideSeparation entre services, mais tous accedent au kernel space. Compromis entre performance et isolation.Windows NT, macOS (XNU)
Pourquoi c'est important pour la securite ?
Un kernel monolithique comme Linux est plus expose : une vulnerabilite dans un driver (ex. un driver reseau bugue) peut donner acces a l'integralite du kernel. Dans un micro-kernel, la meme faille resterait confinee en espace utilisateur.

Modules Systeme : Les Briques de la Construction

Le concept de modules systeme vient de Mach. Chaque couche / fonction / driver de l'OS est ecrit independamment, comme des briques dans un mur. Les modules Linux sont des file objects qui peuvent etre lies dynamiquement au runtime, que ce soit pendant le boot ou sur demande.

Pour charger un module a la volee :

bash
sudo modprobe nom_du_module

Pour lister les modules actuellement charges :

bash
lsmod
kernel-modules.txt
  ┌──────────────────────────────────────────┐
  │          KERNEL MONOLITHIQUE (Linux)     │
  │                                          │
  │  ┌──────────┐  ┌──────────┐  ┌────────┐ │
  │  │ module   │  │ module   │  │ module │ │  <- charges dynamiquement
  │  │ reseau   │  │ fs ext4  │  │ USB    │ │     (modprobe / rmmod)
  │  └──────────┘  └──────────┘  └────────┘ │
  │                                          │
  │  noyau de base (scheduler, MM, syscalls) │
  └──────────────────────────────────────────┘
Les modules s'empilent sur le kernel de base et peuvent etre charges/decharges a chaud.

Conclusion

Voila, vous avez maintenant un apercu de l'architecture d'un OS. Restez a l'ecoute pour les prochains articles ou on plongera encore plus profondement dans les mysteres de la securite et de la technique.

Merci pour votre lecture ! Et n'oubliez pas, la securite c'est comme un bon cafe : ca doit etre fort et sans sucre !