11 KiB
Systèmes d'exploitation
Concepts et implémentations appliqués à l'architecture Intelx86
Stéphane Duverger, Airbus Group Innovations
Introduction
Ensemble de composants logiciels qui permet de faire le lien entre tous les composants matériels.
- User programs
- ....
- User interface
- System calls
- IO /
- ....
- Hardware
Principaux objectifs d'un OS
Offrir des services
- Gérer le hardware, les I/O
- En temps et en espace
- Exécuter des applications
Quelques uns des services
- Communication entre applications
- Systèmes de fichiers
- IPC (inter process communication)
- Communication extérieure (réseau)
- Piles protocolaires - OSI
- Drivers wifi, ethernet
- Couches graphiques
- gestion du framebuffer
- accélération matérielle 3D
- Sécurité
- Isolation
- Limitation
- Gestion d'erreurs
Le kernel, ou noyau de l'OS
Dans un OS, on scinde en général deux mondes, le kernel et le UserLand. On s'intéressera ici quasi exclusivement au Kernel. Il s'agit du composant majeur et critique de l'OS. Il impose ainsi une architecture des appels systèmes. Il existe trois architecture typiques :
- Noyau Monolithique
- Micro-Noyau
- Exo-noyau, Hybride
Le KernelLand est la partie ayant le plus de privilèges dans la machine, d'ou le risque d'un user root qui obtient tous les privilèges et peut ainsi pénétrer le Kernel land.
Comment marche malloc() ?
malloc
sert à allouer de la mémoire depuis le Userland. malloc
va récupérer des pages de mémoires au niveau du kernel qu'il va pouvoir agencer comme il le souhaite en fonction des besoins de l'application.
Pour demander de la mémoire au noyau, malloc
utilise un appel système.
Objectifs du cours
Rappels des principes des OS
- Quel que soit leur design/architecture/concepts
- Pas de théorie sur
- Les ordonnanceurs, le temps réel
- La gestion abstraite de la mémoire (LRU...)
- Les architectures de noyaux (monolithic, micro...)
Implémentation pour Intelx86
Objectif
- Aborder la programmation des OS, en particulier du point de vue CPU
Démarrage d'un PC
Au démarrage du PC, le BIOS prend la main. Composant logiciel embarqué sur la carte mère mappée en mémoire à l'adresse 0xfffffff0 qui est là première chose cherchée par le processeur au démarrage.
Puis saute en 0xf0000, qui est la BIOS code area.
B.I.O.S. - Basic Input Output System Responsable de l'initialisation des composants essentiels du système
- Controleur de RAM
- Table de gestion des interruptions
- Tables ACPI ()
Le BIOS permet de booter sur un device qui peut alors contenir un OS :
- HDD/SSD
- Disquettes
- USB
Cas d'un HDD
- Tables de partitions, boot flag
- Master Boot Record, premier secteur du disque CHS(0, 0, 0) qui contient l'info initiale de boot
- Volume Boot Record, premier secteur d'une partition bootable
Boot Sector
- Contenu dans 512 octets et se termine par "\x55\xAA" (marqueur de fin)
- Chargé par le BIOS en 0x7c00
- Permet de charger en mémoire le Boot Loader.
Boot Loader
- A pour bot de charger le noyau de l'OS et simplifier son démarrage (mode protégé...)
- Plus gros qu'un boot-sector, un mini-OS parfois
- Permet la passerelle entre le noyau et le BIOS :
- Détecte les périphs de stockage
- Parcourt le file system
- Récupère les system map (i.e. la taile de la RAM)+
Quelques bootloader connus :
- LILO historique et minimaliste
- u-Boot pour l'embarqué ARM
- GRUB, spécification multi-boot, très courant
Modes opératoires
On diffère plusieurs modes opératoires pour le CPU:
- Réel
- Mode d'exécution du CPU au démarrage
- BIOS + Boot Loader puis tout début de l'OS puis switch en protégé.
- Virutel 8086
- System management - SMM
- Mode de privilège absolu, au dessus du kernel.
- Protégé
- Mode usuel de fonctionnement pour l'OS.
- IA32e - x86-64
- Virtualisé - VMX
Il est possible de passer d'un mode à l'autre suivant ce schéma :
Rappels ASM x86
Registres généraux
- Multi-usages : [r,e]ax, [r,e]bx, [r,e]cx, [r,e]dx, [r,e]si, [r,e]di
- Pour la pile : [r,e]sp, [r,e]bp
En 64bits r8-r15
- Selon le mode d'exécution (16/32/64) et/ou l'usage de préfixe
- ax = 16 bits, eax = 32 bits, rax 64 bits.
Registres de segments - sélecteurs
cs, ss, ds, es, fs, gs
Registre systèmes Inaccessibles depuis le UserLand
controle : cr0, cr2, cr3, cr4
segmentation : gdtr, idtr, ltr, tr
model specific : MSRs
Les registres de controle permettent d'activer des fonctionnalités du CPU, dont le passage de mode réel à mode protégé (cr0.pe
) et d'activer la pagination (cr0.pg, cr3
).
Le Mode réel
Gestion des interruptions en Mode Réel
Il s'agit du mode initial du CPU qui permet une interraction facile avec le BIOS. Il se base sur un mode d'exécution 16 bits avec un adressage de 20 bits. Dans ce mode de fonctionnement, il n'y a aucune notion de privilèges, donc pas de protection.
Premiers x86 : 8086,80186,80286 qui permettent des modes pseudos protégés non désactivables
Des segments de 64k
mov ax, 0x1234
mov [ax], 0xdead
- Registre d'offset sur 16bits =>
2^{16} =
64 kb - Bus d'afressage sur 20 bits =>
2^{20}
= 1Mb - Usage des registres de segments
- Calcul du CPU pour trouver une adresse :
addr = selecteur_{registre}*16 + offset
Si on essaye
Les adresses mémoires que l'on manipule dans les architectures x86 sont en fait des offset relatifs au début des segments.
Gestion des interruptions en Mode Réel
Les périphériques génèrent des interruptions. Ces signaux sont interprétés par le PIC, ou APIC le controleur d'interruption (avancé) qui les signale au CPU un index donné. Le CPU consulte par la suite la table des vecteurs d'interruptions située en 0 (IVT).
Chacune des entrée fait 32 bits : 16 bits d'offset, et 16 bits de segment. Cette TVI est limitée à 256 entrées.
Ce Mode réel montre rapidement ses limites
Les Modes exotiques
Virtual 8086
- Permet l'émulation hardware du mode réel depuis le mode protégé.
- Accès aux interruptions du mode réel
- Interception des I/Os
- Gestion de la mémoire < 1Mb laissée à l'OS
Un exemple : DosBox
System Management Mode
- Mode le plus privilégié
- Utilisé par les firmware - BIOS
- Configuré au boot
- accessible via une System Management Interrupt
- Généralement difficilement accessible
VMX
- Gestiond e la virtualisation matérielle
- 2 Modes d'exécution
vmx-root
pour l'hyperviseurvmx-nonroot
, pour lamachine virtuelle
- Permet de filtrer la plupart des événements systèmes
- instructions sensibles
- interruptions/exceptions
- la gestion de la mémoire
- accès aux périphériques
- Proposer une vision contrôlée de la machine
Le Mode Protégé
Segmentation
Gestion mémoire du mode protégé
En mode protégé, on a un espace mémoire en 32 bits, ce qui engendre un espace linéaire de 32 bits => 2^32
<=> 4Gb. Pendant un temps supérieur à la RAM installée. On va segmenter cet espace, et ainsi mettre en place un adressage relatif au début d'un segment(adresse logique).
La segmentation
Il s'agit donc d'une prolongation du principe de segments du mode réel. On a plusieurs types de modèles, flat/protected et flat/multiy-segment. Chaque segment a des propriétés de type, de taille et de droits.
Avec cette segmentation on peut réellement découper la mémoire et attribuer certaines propriétés à ces segments de mémoire. On peut donc créer des segments read only, read write, execution...
Pour faciliter ce fonctionnement, on met en place une table GDT - Global Descriptor Table - par coeur de CPU. Cela permet de faciliter l'accès à des sélecteurs de segments et des descripteurs de segments. Les descripteurs contiennent les informations sur le type de données écrites dans la mémoire et leurs droits associés, tandis que les sélecteur continnent les adresses.
Les sélecteurs de segments
Ils permettent l'accès à un descripteur donné. Chaque sélecteur permet de définir :
- Un niveau de privilège
- Une table (locale ou globale)
- Un indice de descripteur dans cette table
Les sélecteurs de segments sont en général CS, DS, SS qui pointent vers une table GDTR en mémoire qui elle contient les descripteurs de segments.
Descripteur de segment
Ils contiennent toutes les informations relatives auc segments :
- base et limite
- type de segment
- code (X,RX), data (R,W)
- système : TSS, Task Gate, Interrupt Gate, Call Gate
- Base : Début du segment
- Limite : Taille - 1, dernier octet accessible
- Granularité, on l'utilise pour multiplier nos bits de limite et ainsi pouvoir arriver à 4GB.
Niveaux de privilèges
- mode réel n’avait qu’un seul niveau (ring 0)
- mode protégé introduit des anneaux (ring level)
- permet d’isoler des composants logiciels de niveau
- de confidentialité différents
- d’intégrité différents
Identification du niveau de privilèges
- CPL, Current Privilege Level, contenu dans CS
- RPL - Requestor Privilege Level, au niveau du sélecteur
- DPL Descriptor Privilege Level, au niveau du descripteur
Changement de niveau de privilèges
- On ne peut accéder à un segment de données plus privilégié
- On ne peut charger un descripteur de code qu'à niveau de privilège équivalent
- Aussi bien plus faible que plus privilégié
- Passer par des call gate ou interrupt gate
En résumé
Des descripteurs sécurisants
- les niveaux de privilèges isolent les composants : Qui ?
- les bases et limites aussi à leur manière : Où/Combien ?
- les attributs également (read, write, ...) : Quoi/Comment ?
Du point de vue de la sécurité
- simulation d’une architecture harvard (contre von Neumann)
- imaginez un descripteur par buffer ? anti-overflow
- Linux Kernel PaX protection : SEGMEXEC https://pax.grsecurity.net/docs/segmexec.txt
Et pourtant ...
- les OS modernes n’utilisent pas la segmentation (modèle flat)
- quasiment disparue en 64 bits
- basent leur sécurité sur la pagination