Comment choisir son OS temps réel

Transcription

Comment choisir son OS temps réel
Solutions
Solutions
INFO R M A T I Q U E I N D U S T R I E L L E
Comment choisir son OS
temps réel ?
H
Choisir le système d’exploitation le plus adapté à un projet est une tâche ardue, qui peut facilement retarder la mise sur le
marché du produit. Un mauvais choix pourra avoir des conséquences néfastes à long terme, allant jusqu’à l’échec ou l’abandon du projet. Afin de diminuer au maximum les risques, l’architecte système doit utiliser une approche méthodique et
structurée pour le choix de son système d’exploitation temps réel (RTOS), en prenant en compte plusieurs facteurs. John
Patchin, ingénieur système en chef chez LynuxWorks, présente les principales différences entre les RTOS du marché.
42
Deux manières d’accéder à la mémoire
Modèle “à plat”
traditionnel
Task A
Modèle paginé
Adresse non autorisée
Task B
Task C
Kernel
Notification envoyée à la tâche A
L
a plupart des systèmes d’exploitation temps réel du marché – on les
appelle RTOS, pour Real-Time
Operating Systems – partagent globalement les mêmes fonctionnalités, à tel point
qu’aujourd’hui les aspects de “déterminisme” se trouvent relégués en arrière-plan.
En effet, tous les RTOS modernes proposent
des performances relativement similaires en
termes de déterminisme. Pour cela, leur
noyau contient un “ordonnanceur préemptif”, qui garantit que le temps de réaction à
une interruption n’excède jamais une durée
déterminée. La plupart des RTOS du marché
proposent à l’utilisateur de choisir parmi
255 niveaux de priorité pour chaque tâche.
Dans ces conditions, comment faire pour
choisir le système d’exploitation le mieux
adapté à son application ? Différents
L’essentiel
­aspects méritent d’être
PLes systèmes d’exploitation
considérés, et nous
temps réel aujourd’hui
­allons décrire les prindisponibles sur le marché
cipaux. L’industriel
présentent entre eux
devra par la ensuite
de grandes différences.
­estimer lesquels de ces
PPour choisir le RTOS le mieux
critères sont les plus
adapté à une application,
importants pour son
il faut évaluer ses besoins
application.
en termes d’ouverture, de
Au moment du choix
sécurité et de performances.
entre plusieurs RTOS,
PPour minimiser les risques
il est important de
d’échec du projet, l’industriel
bien considérer l’indoit aussi considérer d’autres
terface de programaspects comme le modèle
mation fournie avec
de licences associé au RTOS,
chaque logiciel (on
ou encore le support
technique offert par l’éditeur.
parle aussi d’API, pour
Application Programming
Process A
Process B
Adresse non autorisée
Système de gestion
de la mémoire
Process C
Erreur
matérielle
Kernel
Certains OS temps réel utilisent un modèle de mémoire dit “à plat” (à gauche sur le schéma). Problème : si une application
accède à une adresse mémoire réservée par une autre application, c’est tout le système qui peut planter. Sans compter
les risques liés à la sécurité des données (une personne mal intentionnée peut arriver à accéder à des données, en ouvrant
une porte dérobée dans une autre application ayant un niveau de sécurité inférieur). Une manière d’assurer une meilleure
protection du système est d’utiliser un modèle de mémoire paginé. Tout accès à un espace mémoire non autorisé génère
une alerte qui est envoyée au noyau du RTOS.
Interface). Cette interface réunit toutes les
­librairies, fonctions, procédures ou classes
mises à disposition par l’OS. Le développeur
doit les maîtriser avant de commencer à programmer s’il veut être sûr que la communication entre les différents composants de
l’application se fera correctement.
API standard ou propriétaire ?
Il existe des API propriétaires tandis que
d’autres sont basées sur des standards.
L’adoption d’une API standard assure que
l’application ne sera pas limitée à un seul
RTOS. Le portage sur un nouveau RTOS
pourra se faire automatiquement, excepté
quelques cas pour lesquels des recompilations mineures seront nécessaires.
Dans l’industrie, le standard industriel qui
définit les API pour systèmes d’exploitation
est référencé sous le code POSIX 1003.132003 PSE53. Il est spécifié et maintenu par
le comité de normalisation IEEE. Employé
dans de nombreux systèmes d’exploitation
aussi bien génériques que temps réel, il est
considéré comme la seule interface de programmation réellement portable (il permet
entre autres la portabilité des applications
entre les systèmes Linux et Unix).
Aujourd’hui, sa renommée est telle qu’il
existe une vaste communauté de développeurs POSIX expérimentés.
Les éditeurs savent combien cet aspect de
portabilité est important pour les clients
­finaux. C’est pourquoi, certains OS avec API
propriétaires se déclarent compatibles
POSIX. Ce n’est souvent qu’un argument
MESURES 835 - mai 2011 - www.mesures.com
commercial, car dans la plupart des cas ces
OS ne supportent qu’une infime partie des
librairies POSIX. Etant donné qu’il s’agit de
fonctions non-natives (on a ajouté une
couche d’abstraction au-dessus de l’OS pour
le rendre compatible), elles ne bénéficient
pas des mêmes performances que les fonctions natives et restent par conséquent très
peu utilisées.
Adressage de la mémoire
Concernant l’accès à la mémoire, les RTOS
modernes se divisent en deux catégories. On
trouve d’abord ceux qui utilisent un adressage “à plat” de la mémoire.Avec ce principe,
toutes les tâches partagent un même espace
mémoire. Dans le cas où une tâche accède à
une adresse mémoire qui ne lui était pas
réservée, l’exécution d’une autre tâche peut
être interrompue, voire corrompue. Les problèmes de ce genre, qui peuvent entraîner
un plantage complet de l’application, sont
relativement difficiles à résoudre car ils
­nécessitent des compétences avancées en
débogage. De plus, avec un modèle de
­mémoire à plat, les variables globales qui
sont définies dans une application peuvent
entrer en conflit avec d’autres variables globales qui porteraient le même nom dans
d’autres applications. Ce problème peut survenir lorsque plusieurs équipes de développeurs travaillent sur un même projet. Un
autre cas typique est lorsque plusieurs applications temps réel tournent sur des matériels
différents et qu’elles doivent être intégrées
sur une seule et même plate-forme.
L’autre modèle d’adressage de la mémoire
est le modèle “paginé”. Supérieur par bien
des aspects au modèle à plat, il permet de
définir des espaces mémoire protégés et de
les réserver pour certaines tâches ou applications. Aujourd’hui, ce modèle est devenu
un critère fondamental pour la robustesse
d’un RTOS : il est au cœur du principe de
“partitionnement spatial” mis en avant par
les éditeurs pour promouvoir leurs solutions.
Grâce à la mémoire paginée, si une tâche
tente d’accéder à une adresse mémoire réservée par une autre application, le système
d’exploitation remonte immédiatement une
erreur. Celle-ci est enregistrée dans un fichier
d’erreur, qui peut être récupéré par le développeur et chargé dans un débogueur afin
de déterminer la cause précise du problème.
Certains RTOS génériques poussent encore
un cran plus loin le concept de la pagination
et offrent un partitionnement temporel en
plus du partitionnement spatial. Le partitionnement temporel implique l’utilisation d’un
second ordonnanceur, en complément de
l’ordonnanceur préemptif évoqué plus haut.
Si l’ordonnanceur préemptif est basé sur le
principe de l’interruption (il réagit à des stimulations extérieures pouvant survenir à
n’importe quel moment), l’ordonnanceur
temporel fonctionne de manière cyclique, à
la manière d’une horloge. Chaque tâche peut
être configurée de manière à s’exécuter pendant une période de temps définie, puis
l’ordonnanceur passe à la tâche suivante (il
peut bien sûr s’agir de groupes de tâches).
Ainsi, en associant ordonnanceur préemptif
et ordonnanceur temporel, on évite qu’une
tâche prioritaire ne s’exécute en boucle sans
jamais laisser le temps aux autres tâches de
démarrer.
➜
Applications
(anciennes et nouvelles)
OS Windows
entièrement
virtualisé
OS Linux
entièrement
virtualisé
Autre OS
entièrement
virtualisé
Applications
temps réel
et de
sécurité
RTOS “invité”
paravirtualisé
Applications
client léger
Interface client
léger
paravirtualisé
Noyau de séparation et hyperviseur
Plate-forme matérielle multicœur
Un même hyperviseur peut supporter à la fois des OS paravirtualisés (non modifés) et des OS entièrement virtualisés,
c’est-à-dire optimisés pour garantir leurs performances temps réel avec un hyperviseur donné.
MESURES 835 - mai
MAi 2011 - www.mesures.com
43
Solutions
Solutions
Partitionnement temporel et partitionnement spatial
Partition 0
Partition 2
Partition 3
Partition N
Middleware
GUI
POSIX
LOGICIEL
APPLICATIF
LOGICIEL SYSTEME
MATÉRIEL
Partition 1
POSIX
Application
Ada
Application
Java
OpenGL
Application
POSIX
Application
ARINC
653
Application
LINUX
POSIX
Bibliothèque
Ada
JVM
X Windows
POSIX
APEX
POSIX
User mode
Supervisor mode
Couche TCP/IP
Noyau de partitionnement et couche TCP/IP
Pilotes
de
périphériques
réseau
Pilotes
du
processeur
Interface
Réseau
Microprocesseur
Pilotes
de
périphériques
statiques
Gestion
de
périphériques
PCI
Plate-forme matérielle
Contrôleur
PCI
Pilotes
de
la carte
CFG
Pilotes
de
périphériques
dynamiques
PCI A
PCI B
Partie optionnelle
Les hyperviseurs modernes permettent d’exécuter simultanément des OS invités très différents les uns des autres. L’exemple ci-dessus montre
un système à N systèmes d’exploitation, associant des OS avioniques (APEX) à des machines virtuelles Java, des tâches développées en Ada
et même des OS Windows et Linux.
➜ Un hyperviseur a pour rôle de faire
­cohabiter plusieurs systèmes d’exploitation
sur une seule plate-forme matérielle. Parfois
appelé “moniteur de machine virtuelle”, son
rôle est de tirer parti de toute la puissance
des processeurs modernes pour réduire l’encombrement, le poids et la consommation
d’un système. Longtemps, l’usage des hyperviseurs est resté réservé aux environnements
de type serveurs, mais on assiste aujourd’hui
à une vraie émergence de la technologie
pour les applications embarquées.
On distingue deux grandes familles d’hyperviseurs, désignées par l’appellation type 1 ou
type 2. La plupart des RTOS du marché disposent aujourd’hui d’hyperviseurs de type 1.
Ceux-ci s’exécutent directement sur le matériel à la manière d’une application bare metal,
c’est-à-dire une application codée en langage
machine et qui tourne sans OS sur le processeur. Un hyperviseur de type 1 démarre sitôt
que la carte est sous tension, et il lance ensuite les différents “OS invités” (ou Guest OS).
Grâce à ce type d’hyperviseur, chaque OS
invité peut être stoppé et redémarré indépendamment, sans gêner l’exécution des autres.
De moins en moins utilisés, les hyperviseurs
de type 2 ressemblent davantage à des applicatifs classiques. Ils s’exécutent au sein d’un
OS hôte. Les hyperviseurs de type 2 permettent également de lancer des OS invités, mais
la latence est forcément plus importante
qu’avec un hyperviseur de type 1 (l’OS hôte
et l’hyperviseur représentent deux couches
d’abstraction successives). Un autre inconvénient tout aussi important est qu’il est
impossible de redémarrer l’OS hôte sans
stopper du même coup tous les OS invités.
La question du support
Même en choisissant le RTOS le plus performant
sur le papier, un industriel qui conçoit une
application temps réel pour la première fois aura
forcément besoin du support technique de
l’éditeur. Il est donc important de se renseigner
sur la présence de cet éditeur dans le pays dans
lequel le projet est réalisé. Sans support
technique, certaines étapes comme l’écriture
des couches de communication peuvent vite
devenir un cauchemar. D’abord car la plupart
des RTOS proposent des interfaces réseau ou
44
USB mais les performances de ces dernières
peuvent varier énormément d’un éditeur à
l’autre (en termes de latence et de bande
passante, principalement). Ensuite car il faut que
le RTOS puisse communiquer avec la partie
matérielle. Il est évident que s’il n’existe pas de
drivers pour la carte ou les composants que l’on
souhaite utiliser, il faudra les développer. D’où
l’importance de choisir un éditeur qui propose
des services d’ingénierie si l’on ne dispose pas
des compétences nécessaires en interne.
Mais revenons au principe de base de l’hypervision. Quel que soit le type d’hyperviseur utilisé, l’industriel cherche, avant tout,
à faire tourner différentes applications dans
autant d’OS invités, autrement dit à effectuer
de la virtualisation. Pourtant, il existe deux
manières différentes d’envisager la
­virtualisation.
Certains RTOS proposent ce que l’on appelle
une “virtualisation complète”, en ce sens
que les OS invités ne savent pas qu’ils s’exécutent au-dessus d’un hyperviseur. Par
conséquent, ils n’ont pas besoin d’être modifiés. L’avantage de la virtualisation ­complète
est donc de faciliter l’intégration : chaque OS
invité est utilisé dans sa version commerciale
et aucun développement spécifique n’est
nécessaire. L’inconvénient est à chercher du
côté des performances, car un OS invité
complètement virtualisé subira forcément
une baisse de ses performances et le système
complet sera moins déterministe.
La seconde méthode de virtualisation est
appelée “paravirtualisation”. Cette dernière
implique de modifier le noyau de chaque
OS afin de le faire interagir avec l’hyperviseur
de manière plus directe et optimisée. Cette
solution apporte de meilleures performances
que la virtualisation complète. On l’utilisera
donc pour les applications temps réel “dur”,
pour lesquelles les OS invités ont besoin de
temps de réponse très courts. Seul inconvénient : cette méthode implique d’avoir accès
au code source de chaque OS invité, ce qui
peut être difficile dans certains cas (si l’on
souhaite faire tourner une application sous
Windows, par exemple).
La plupart des RTOS du commerce sont
­vendus accompagnés d’un environnement
de développement. Ce dernier peut aller
d’un simple débogueur graphique (de type
GNU GDB Insight) à un environnement plus
riche de type Eclipse, en passant par toutes
sortes de logiciels propriétaires. Dans l’idéal,
la suite logicielle fournie avec le RTOS doit
inclure au moins un éditeur de code avec
des fonctions d’aide à la syntaxe, un enregistreur temps réel et un outil de visualisation à haute résolution. Ce dernier permettra
au développeur d’optimiser très finement
l’enchaînement des tâches et des instructions sur le processeur cible. Certains RTOS
sont également livrés avec un débogueur
“post mortem”, très utile pour analyser les
fichiers d’erreur générés après un plantage
de l’application.
En termes d’intégration, il est important de
bien prendre en compte la manière dont le
système cible est intégré dans le réseau de
l’entreprise (laboratoire, service R&D ou
autre). En effet, même si le trafic TCP/IP généré par le RTOS est généralement compatible avec les réseaux standard, il faut penser
aux futures communications entre l’équipement temps réel et son environnement final
d’utilisation. Attention donc à dimensionner
et à configurer correctement ce réseau. On
notera à ce sujet qu’avec les RTOS basés sur
UNIX, la configuration sera plus aisée car les
services informatiques de l’entreprise sont
formés à ce type de communications.
Modèle de licence
Après avoir étudié les caractéristiques techniques des RTOS potentiels pour son application, l’industriel pourra étudier le modèle
de licence pour faire son choix final. Dans ce
domaine, l’aspect primordial, quelle que soit
la taille ou la complexité du projet, est la
flexibilité. Dans une entreprise, il y a toujours une proportion de projets qui ne
voient jamais le jour. C’est la raison pour
laquelle il faut bien étudier le modèle de
­licence d’un éditeur avant de s’engager. En
fonction de l’envergure du projet (le nombre
d’équipements à déployer), l’industriel
s’orientera soit vers un éditeur qui impose
une licence annuelle par poste de développement, soit vers un éditeur qui ­demande
une redevance par runtime effectivement
­déployé (le runtime étant la version compilée
de l’OS). Quoi qu’il en soit, il faut garder à
l’esprit qu’un vrai RTOS n’est pas gratuit :
même si un éditeur met en avant des aspects
d’ouverture ou de gratuité de son logiciel, il
faut étudier l’offre en détails pour déterminer ce qui est gratuit et ce qui ne l’est pas.
L’idéal, bien entendu, étant de trouver un
éditeur avec lequel établir de vraies relations
de partenariat pour son projet.
Pour conclure, si le marché des RTOS
­comporte des offres très disparates, c’est
avant tout parce que les industriels de l’embarqué ont tous des besoins très spécifiques.
La technologie est suffisamment au point
pour satisfaire les industriels qui visent les
performances avant tout. Pour les autres, il
s’agira donc de faire un compromis entre les
caractéristiques techniques (type d’hyperviseur, modèle de mémoire, etc.), la richesse
des outils de développement ainsi que le
modèle économique associé à chaque RTOS.
John Patchin, ingénieur système en chef
chez LynuxWorks
et Frédéric Parisot
Compatibilité et ouverture
On l’aura compris, l’industriel devra avoir
une idée précise de l’architecture de son système et du type d’OS invités qui seront utilisés. Il faudra notamment faire attention au
fait que tous les hyperviseurs ne peuvent pas
faire tourner des OS 64 bits et qu’ils ne sont
pas tous capables de faire tourner des OS
invités sur plusieurs cœurs du processeur.
A noter que certaines applications critiques
imposent d’apporter un haut niveau de
­sécurité dans l’isolation des différents OS
invités. Il existe d’ailleurs une norme, la SKPP
(pour Separation Kernel Protection Profile), qui
garantit la séparation des données ou des
flux d’informations entre les OS invités. Cette
norme est régie par l’alliance américaine
NIAP (United States National Information
Assurance Partnership). Pour le moment, le seul
hyperviseur temps réel de type 1 du marché
à implémenter les recommandations de la
SKPP est LynxSecure de LynuxWorks.
MESURES 835 - mai 2011 - www.mesures.com
MESURES 835 - MAi 2011 - www.mesures.com
45