Le mode protégé est un mode de fonctionnement des processeurs basés sur l'architecture x86 d'Intel à partir du 80286. Il est aussi présent dans les séries x86-64 sous deux formes possibles : 32 bits et 64 bits.
L'introduction du mode protégé a pour but d'ajouter, à côté du mode dit réel compatible avec l'existant, de nouvelles fonctionnalités pour favoriser le multitâche et la stabilité du système en proposant une assistance matérielle pour les points suivants :
La plupart des systèmes d'exploitation modernes x86, de Linux à FreeBSD en passant par Windows depuis la version 3.0, fonctionnent dans ce mode. Pour des raisons de compatibilité, un ordinateur se lance en mode réel et le basculement en mode protégé s'effectue manuellement. Il s'agit d'une des premières tâches faites par le système d'exploitation après l'amorçage.
Il existe, en mode protégé de x86, quatre niveaux de privilège appelés anneaux de protection, numérotés de 0 à 3. Le niveau 0 est le niveau de privilège le plus élevé et le niveau 3 le plus faible. La protection mémoire repose sur les segments : le matériel n’autorise pas à un programme qui s’exécute dans un segment, d’accéder aux segments de privilège supérieur (donc situés dans un anneau de numéro inférieur).
En pratique, la plupart des systèmes d'exploitation modernes (dont Linux et Windows) n'utilisent que deux de ces niveaux. Le code de l'espace noyau (notamment le noyau de système d'exploitation) s'exécute dans l'anneau Ring 0, tandis que les applications utilisateur sont normalement exécutées dans l'anneau Ring 3, plus sécurisé et plus restrictif. On parle couramment de ces anneaux avec les termes « mode noyau » et « mode utilisateur ».
La segmentation ne peut pas être complètement désactivée en mode protégé. Mais à la différence du mode réel, les segments sont entièrement programmables.
C’est avec la segmentation que sont instaurés les niveaux de privilèges (anneaux, voir ci-dessous). Chaque segment possède un niveau de 0 à 3.
La segmentation sert aussi de support à la mémoire virtuelle. En effet, un segment est constitué d’une base (adresse physique — appelée linéaire si la pagination est activée — de départ dans la mémoire) et d’une limite qui définit sa longueur. À l’intérieur d’un segment, l’adresse logique 0 correspond à la base de ce segment. Un segment peut donc être déplacé avec ses données de façon transparente.
De plus le descripteur de chaque segment contient un bit P pour « présent » qui indique si les données sont en mémoire vive ou pas. Si ce bit est éteint, lors d'un accès à ce segment, une exception se déclenche qui permet au système d’exploitation d’aller chercher les données où elles se trouvent et de les copier en mémoire vive.
La segmentation n'est pratiquement pas utilisée par Linux, qui définit des segments correspondant à l'ensemble de la mémoire virtuelle.
Il existe une série de règles pour qu'un programme exploité en mode réel soit binairement compatible, c'est-à-dire qu'il puisse être exécuté en mode protégé.
En fait, la plupart des programmes DOS enfreignaient ces règles. Le 386 introduit le mode virtuel 8086 pour remédier à cela.