• Aucun résultat trouvé

CHAPITRE 2 REVUE DE LA LITTÉRATURE ET FONDEMENTS

2.4 Méthodes de partitionnement spatial

Un scénario classique avant l’invention de la protection de mémoire était le plantage de toutes les applications d’un système en raison du débordement de mémoire d’une seule application. Sans mécanismes de protection de mémoire, un programme pouvait écrire partout en mémoire, incluant dans les zones déjà occupées par d’autres programmes ou par le système d’exploi- tation. Les premiers mécanismes de protection de la mémoire visaient donc à faire appliquer une politique de partitionnement spatial afin de permettre l’exécution sécuritaire de plusieurs programmes sur une même machine.

Au fil des développements dans le domaine des systèmes d’exploitation, l’apparition de nou- veaux problèmes a motivé la conception de systèmes de protection de ressources partagées de plus en plus sophistiqués.

Le partitionnement spatial est réalisé avec une combinaison de méthodes logicielles et maté- rielles de protection des ressources partagées, couplées à un moniteur de santé du système qui applique des politiques de contingence lorsqu’une opération illégale survient.

Trois mécanismes matériels sont minimalement nécessaires pour permettre la protection des ressources partagées [52, p. 529] :

1. Le support d’au moins deux niveaux de privilèges matériels afin de pouvoir distinguer si le contexte d’exécution actuel est le noyau ou une application qui doit être restreinte. On parlera de mode « superviseur » et de « mode usager ». Dans certains cas, des « an- neaux » concentriques représentent les niveaux de privilèges. Avec cette nomenclature les anneaux plus au centre sont plus privilégiés (plus près du coeur).

2. La protection des registres de contrôle de la machine contre l’écriture par les appli- cations en mode usager. Des instructions réservées au mode superviseur doivent être employées pour modifier ces registres.

3. Le support d’une instruction permettant d’entrer en mode superviseur de manière contrô- lée et une autre pour revenir en mode usager à partir du mode superviseur. La plupart des processeurs possèdent une version de l’instruction « system call » (appel système) qui permet de demander une opération privilégiée au logiciel superviseur. Cette ins- truction est toujours accompagnée d’une instruction « return from exception » (retour d’exception) qui quitte atomiquement le mode superviseur après l’exécution de l’opéra- tion privilégiée par le noyau.

Les mécanismes de gestion des privilèges sont employés en conjonction avec des mécanismes matériels de protection de la mémoire afin d’appliquer une politique de protection de la mé- moire. Il existe deux types de ces mécanismes matériels de protection de mémoire : les unités de protection de mémoire (« Memory Protection Unit », MPU) et les unités de gestion de mé- moire virtuelle (MMU). Dans les deux cas, le système d’exploitation configure les politiques d’accès dans ces unités et un accès interdit se solde par une exception.

Les MPU s’occupent uniquement de protection de la mémoire et se retrouvent habituelle- ment dans les processeurs embarqués très simples ou lorsque la performance maximale est un critère.

Les MMU, quant à eux, gèrent la protection de la mémoire physique et permettent aussi d’em- ployer un adressage à mémoire virtuelle. Ce type d’adressage permet la traduction entre des

27

adresses dites virtuelles, visibles au programmeur, et les adresses physiques de la mémoire, visibles uniquement au système d’exploitation. Plusieurs des mécanismes logiciels de parti- tionnement spatial sont basés sur la disponibilité d’un espace d’adresses virtuelles indépendant de l’espace d’adresses physiques [52]. Les processeurs de la famille PowerPC utilisés dans nos travaux possèdent tous un MMU flexible et performant.

Un système d’exploitation implémente la protection de la mémoire en combinant les méca- nismes matériels de protection à des algorithmes de partitionnement de la mémoire. L’objectif est de configurer les mécanismes matériels afin de maximiser les performances de l’applica- tion, tout en proscrivant les accès interdits d’après la configuration du système. Souvent, le code exécutable d’un programme, ses données et sa pile seront placés dans des zones diffé- rentes de la mémoire, avec des permissions adaptées. Par exemple, la zone de données sera accessible en lecture et en écriture, alors que la zone de code ne le sera qu’en lecture-seule.

La granularité de la protection de mémoire est proportionnelle au niveau de sûreté désirée. Plus le niveau de sûreté est élevé, plus la granularité de protection sera fine afin de pouvoir déterminer précisément la cause d’un accès interdit. En connaissant précisément cette cause, il devient possible de réduire l’ampleur de l’action de contingence. Par exemple, l’accès interdit à un périphérique pourrait se solder par un simple signal d’erreur au lieu de la suspension de l’application.

Notons qu’il est possible de réaliser entièrement par logiciel la protection de mémoire né- cessaire au partitionnement spatial. Cela est possible en insérant du code de vérification des bornes à chaque accès mémoire potentiellement dangereux [66]. Le code de vérification est in- séré par le compilateur ou par le chargeur de programme. Cette approche est cependant sujette à la compromission lorsque le code de protection n’est pas géré par le noyau de partitionne- ment. De plus, la vérification des bornes engendre un coût en performances non-négligeable. On ne peut donc pas se fier aux méthodes entièrement logicielles dans le contexte IMA, à

moins que toutes les applications soient programmées par des groupes coopératifs au sein de l’entreprise qui réalise l’intégration.

En plus des mécanismes de protection de la mémoire, l’implémentation du partitionnement spatial requiert des mécanismes de communication inter-partition (« inter-partition communi- cation » en anglais, IPC). Ces mécanismes permettent aux applications d’interagir et de par- tager leurs résultats sans compromettre les barrières d’isolation. Le noyau de partitionnement robuste s’assure que toutes les communications sont autorisées selon des tables de privilèges préconfigurées. La plupart du temps, des restrictions s’appliquent quant à la taille et au nombre de messages permis entre chacune des partitions.

Considérons les mécanismes d’IPC définis dans la norme ARINC-653. Deux mécanismes y sont définis : les ports à échantillonnage (« sampling ports » en anglais) et les ports à file d’at- tente (« queuing ports » en anglais). On parle ici de « ports » de communication virtuels. Il ne s’agit pas de ports de communication physiques, mais plutôt d’abstractions, tels les ports d’entrée et de sortie d’une boîte noire. Comme leur nom l’indique, les ports à échantillonnage représentent l’abstraction d’un échantillonneur-bloqueur. À chaque fois qu’une nouvelle va- leur y est inscrite par un producteur, elle demeure lisible sur le port par les consommateurs jusqu’à son expiration, le cas échéant. Inversement, les ports à file d’attente contiennent une file qui se vide au fur et à mesure que les données sont lues par les consommateurs.

L’interconnexion des ports de communication des différentes partitions est réalisée à travers des « canaux » virtuels. Dans ARINC-653, les canaux sont des liens logiques entre une source et une ou plusieurs destinations. Il est possible d’effectuer une assignation logique entre un port et une procédure ou un identifiant de pilote pour des réseaux de communication avionique, en plus d’une assignation vers des canaux inter-partition internes.

29

Dépendamment de l’implémentation, un même port de sortie peut être relié à plusieurs canaux permettant ainsi de réaliser une diffusion sélective. Les trois modes de diffusion définis dans ARINC-653 sont présentés à la figure 2.4.

Canal

Partition B Partition C Partition D Partition A

(a) Unicast (1 à 1)

Canal

Partition B Partition C Partition D Partition A

(b) Multicast (1 à plusieurs)

Canal

Partition B Partition C Partition (n) Partition A

(c) Broadcast (1 à toutes)