Projet Avancé
Transcription
Projet Avancé
PROJET AVANCE MATICHARD DORIAN POUSSIER ROMAIN Mercredi 27 Janvier 2010 Etude et Portage du Patch Temps Réel « Mou » RT-Preempt sur Processeur Softcore Altera NIOS II. TABLE DES MATIERES INTRODUCTION ............................................................................................................................................. 3 LE PATCH RT-PREEMPT ................................................................................................................................. 4 1. QU’EST-CE QUE CE PATCH ? ............................................................................................................ 4 2. LE PATCH SUR PC .............................................................................................................................. 4 2.1. Installation du patch ..............................................................................................................................4 2.2. Performances du patch ........................................................................................................................5 NIOSII, UNITE DE GESTION MEMOIRE ET LINUX ....................................................................................... 6 1. NIOS II .............................................................................................................................................. 6 2. AJOUT DE LA MMU........................................................................................................................... 6 3. MODIFICATION DES SOURCES .......................................................................................................... 8 4. COMPILATION ................................................................................................................................... 8 ETUDE DU PORTAGE .................................................................................................................................. 10 1. MODIFICATION DES SOURCES ....................................................................................................... 10 2. 1.1. Identification des sources à modifier ............................................................................................. 10 1.2. Modification des sources .................................................................................................................. 11 PORTAGE DU NOYAU..................................................................................................................... 11 CONCLUSION.............................................................................................................................................. 12 ANNEXE : COMPARAISONS DES SOURCES POUR DIFFERENTES ARCHITECTURES ................................... 13 Projet Avancé – NIOS II Linux INTRODUCTION De nos jours, l’électronique intervient dans tous les domaines, et l’on retrouve une majorité de systèmes embarqués dans les produits et applications qui nous entourent. Ceux-ci font souvent appel à des systèmes d’exploitation afin de les contrôler aisément et d’en tirer le meilleur parti. Un des secteurs de plus en plus convoité est celui du « temps réel ». En effet celui-ci est nécessaire dans de nombreuses applications critiques telles que l’automobile, l’aéronautique ou le médical. Ainsi il existe des systèmes d’exploitation temps réel (aussi appelés RTOS) qui permettent d’obtenir ces performances. Linux, un système d’exploitation libre, gagne chaque jour des parts de marché dans le domaine de l’informatique embarqué. Mais à ce succès s’impose un obstacle de taille : son manque de déterminisme. Il ne convient pas de l’utiliser dans des applications temps réel car il ne garantit pas des temps de réponse fixes. Il est évident que s’il était possible de l’utiliser dans ce domaine, l’enjeu serait alors de taille. C’est pourquoi différentes techniques ont été mises au point afin de conférer à celui-ci des capacités de traitement temps réel. On distingue deux principales méthodes : rendre le noyau préemptif ou ajouter un second noyau temps réel. Nous nous intéresserons à la première méthode, qui consiste à modifier le noyau de Linux afin d’associer aux différentes tâches des niveaux de priorité, les tâches prioritaires prenant la main sur les autres. Pour cela il est nécessaire d’appliquer un patch spécifique au noyau Linux, nommé « RT-Preempt ». Les applications embarquées nécessitent également d’être reconfigurable à souhait tout en disposant d’une grande puissance de calcul. On utilise pour cela des FPGA. De plus, afin de simplifier la programmation et de tout regrouper sur une même puce, des processeurs « softcore » sont implémentés sur ces FPGA. Ceux-ci se présentent sous forme de langage de description matériel de haut niveau, et permettent une grande flexibilité et une bonne adaptation aux besoins et contraintes matérielles. Le modèle NIOS II d’Altera fera l’objet de notre étude. Le but de ce projet est donc d’étudier le patch RT-Preempt et à terme d’en réaliser le portage sur le NIOS II. Page 3 Projet Avancé – NIOS II Linux LE PATCH RT-PREEMPT 1. Qu’est-ce que ce patch ? Le patch RT-Preempt d’Ingo Molnar permet au noyau linux d’obtenir un comportement temps réel. Cette méthode de patch a été introduite pour donner une alternative simple aux solutions déjà existantes telles que Xenomai et RTAI. Contrairement à ces extensions concurrentes, il ne fait que modifier le fonctionnement du noyau standard sans ajouter un second noyau ou une couche de virtualisation temps réel. Figure 1 - Ingo Molnar Son fonctionnement est également très simple. Il rend préemptible la majeure partie du code du noyau, notamment les sections critiques et les gestionnaires d’interruptions. Grâce à cela, les tâches se voient attribuer une priorité, et les tâches de haute priorité peuvent prendre la main sur celle de moindre priorité. Il modifie également certains mécanismes pour réduire les temps de latences induits par le fonctionnement du système. Ce patch met aussi en place un mécanisme de protections contre le problème connu sous le nom d'inversion de priorité par l'utilisation de sémaphore à héritage de priorité. 2. Le patch sur PC Le but de ce sujet est donc de porter le noyau linux préempté sur une carte Nios II. Voyons dans un premier temps quels sont les résultats obtenus par le patch RT-Preempt sur PC. 2.1. Installation du patch Comme dit auparavant, la modification du noyau de base par cette méthode est très aisée. Les différentes versions du patch se trouvent sur internet à l’adresse suivante : http://www.kernel.org/pub/linux/kernel/projects/rt/ Ainsi, après avoir téléchargé le patch correspondant à la version du noyau linux, il suffit de le décompresser et de l’appliquer aux sources de ce noyau via la commande « patch ». Dans un terminal, il faut se placer dans le dossier contenant le noyau à patcher et appeler le patch : patch –p1 < ‘’chemin du dossier contenant le patch’’/patch-rt Page 4 Projet Avancé – NIOS II Linux Une fois ce patch appliqué, il faut maintenant configurer le noyau pour le recompiler. La plupart des options à modifier se trouvent dans le menu « Processor types and features ». Il faut notamment cocher l’option « Complete preemption (real-time) ». D’autres options sont à valider, il faut activer le « High-Resolution-Timer », la CONFIG_PREEMPT_RT, … Ensuite il faut recompiler le noyau et l’installer pour pouvoir redémarrer sur cette nouvelle configuration. Une fois cette étape effectuée, le redémarrage sur ce noyau nous montre qu’on se trouve bien sur le noyau dont les sources ont été modifiées : > Uname –a : Linux linux05 2.6.31.4-rt14 #1 SMP PREEMPT RT 2.2. Performances du patch Ce patch est une facile méthode alternative de Xenomai permettant de donner au noyau un comportement de temps réel, mais temps réel mou. Nous allons voir que ce comportement peut être satisfaisant mais que parfois il faut se méfier des résultats. Pour tester son comportement, nous avons utilisé un programme de test haute résolution qu’est Cyclictest. Tout d’abord nous avons testé la préemption en comparaison du noyau linux de base pour un CPU non chargé. Avec ce premier test, nous voyons que le temps de latence moyen est similaire pour les 2 noyaux mais que le temps de latence maximum semble être bien meilleur et surtout toujours assez faible ce qui est une bonne chose. Ensuite, nous avons pu constater des résultats similaires pour un CPU chargé, c'est-à-dire fonctionnant à 100% de ses capacités pour ainsi tester les interruptions. Ces valeurs sont données dans le tableau suivant : Noyau Original (hors charge) Préempté (HC) Original (chargé) Préempté (C) Latence moyenne (ms) 7 14 23 4 Latence maximum (ms) 553 31 865 48 Figure 1 - Temps de latence des noyaux Ce sont donc de très bons résultats apparents. Cependant ils ne sont pas caractéristiques du comportement réel du noyau préempté. En effet, le comportement de temps réel mou implique que parfois le temps de latence maximum peut être bien plus élevé. Lors d’une autre prise de résultats, nous avons ainsi pu obtenir les valeurs suivantes : Noyau Préempté (HC) Latence moyenne (ms) 12 Latence maximum (ms) 382 Figure 2 - Caractérisation du temps réel mou L’objectif futur serait donc d’obtenir un temps réel dur grâce à une solution aussi simplifiée que le patch RT-Preempt. Mais notre travail consiste ici à porter cette solution intermédiaire sur un maximum de cartes. Page 5 Projet Avancé – NIOS II Linux NIOSII, UNITE DE GESTION MEMOIRE ET LINUX 1. NIOS II Le processeur softcore NIOS II est un cœur de processeur décrit en VHDL et pouvant donc être programmé sur tout FPGA de la marque Altera. Il offre de nombreux avantages, En effet il possède : Une bonne flexibilité : on peut choisir exactement le CPU, les périphériques et la mémoire dont on a besoin pour une application spécifique. De hautes performances : il permet de bénéficier de la puissance de calcul du FPGA grâce à son implémentation matérielle. Un moindre coût : on ne paye que pour les fonctions dont on a besoin. Une longue durée de vie : on peut obtenir la dernière version en date et donc éviter l’obsolescence du produit. On accède à de nombreux outils de développement tels que des librairies ou un environnement de développement. 2. Ajout de la MMU Pour obtenir les meilleures performances de Linux sur la carte de développement, on ajoute une unité de gestion mémoire (MMU) au processeur NIOS II. Pour ajouter la MMU, il faut d’abord éditer le design du NIOS II sous SOPC Builder. Il faut ajouter une mémoire double port. La mémoire doit être de type RAM, On-Chip. Figure 3 - Choix de la mémoire Page 6 Figure 4 - Type de mémoire Projet Avancé – NIOS II Linux Ensuite on l’associe au CPU en reliant chacun des ports à ceux d’instruction et de données de celuici. Figure 5 - Gestion des caches Figure 6 - Connection des ports Puis on inclut la MMU au processeur en précisant son nom et son adresse. Figure 7 - Inclusion de la MMU Il ne reste plus qu’à générer le design créé, et à synthétiser le bitstream afin de le programmer sur le FPGA. Page 7 Projet Avancé – NIOS II Linux 3. Modification des sources Le design ainsi généré doit être exporté afin de correspondre avec les sources du noyau Linux. Pour cela, il faut créer les fichiers d’entête correspondant au processeur et à la carte de développement. Ceux-ci décrivent les différents périphériques utilisés ainsi que leurs adresses et configurations respectives. Pour créer ces fichiers, on utilise la commande « sopc-create-header-files --single custom_fpga.h ». On génère ainsi un fichier nommé « custom_fpga.h » qu’il faut ajouter aux sources dans le dossier « arch/nios2/include/asm ». Toutefois, ceci ne suffit pas et il est nécessaire d’ajouter certaines défintions au fichier « nios.h » afin de garantir la compatibilité avec notre FPGA. /* 1S10 dev board */ #define STRATIX_1S10 #ifdef STRATIX_1S10 #define DDR2_TOP_BASE SDRAM_BASE #define DDR2_TOP_SPAN SDRAM_SPAN #define #define #define #define TIMER_1MS_FREQ SYS_CLK_TIMER_FREQ TIMER_1MS_BASE SYS_CLK_TIMER_BASE TIMER_1MS_SPAN SYS_CLK_TIMER_SPAN TIMER_1MS_IRQ SYS_CLK_TIMER_IRQ #define ENET_BASE LAN91C111_0_BASE #define ENET_IRQ LAN91C111_0_IRQ #endif 4. Compilation Il faut ensuite configurer les options du noyau en fonction de la cible désiré, à l’aide de la commande « make menuconfig ». Les choix suivants doivent être effectués : Vendor/Product --- Select Vendor --- Select Altera Selection ---> # Sélectionner the Vendor you wish to target (Altera) ---> # Choisir Altera the Product you wish to target Products (nios2) ---> # Choisir nios2 Kernel/Library/Defaults Selection ---> --- Kernel is linux-2.6.x Libc Version (None) ---> [*] Default all settings (lose changes) [*] Customize Kernel Settings [ ] Customize Vendor/User Settings [ ] Update Default Vendor Settings Page 8 # Sélectionner # Par défaut # Sélectionner # Sélectionner Projet Avancé – NIOS II Linux Puis, au deuxième écran de sélection, il faut cocher : Device Drivers --> Character Devices --> Serial Drivers --> [ ] Altera JTAG UART support [*] Altera UART support [*] Altera UART console support # Sélectionner # Sélectionner NiosII Configuration ---> NiosII FPGA configuration ---> [*] CUSTOM_FPGA # Sélectionner Pour que le Linux puisse démarrer correctement sur le FPGA, il faut modifier le script RC afin de monter les systèmes de fichiers « /proc » et « /sys ». Pour cela, il suffit d’ajouter les lignes suivantes : hostname nios2 mount -t proc proc /proc -o noexec,nosuid,nodev mount -t sysfs sysfs /sys -o noexec,nosuid,nodev On peut ensuite compiler le tout et le télécharger sur la carte à l’aide de la commande « nios2download ». On vérifie que la MMU fonctionne sur la carte avec la commande « cat /proc/cpuinfo », et la version du noyau avec « uname -a ». Figure 8 - Vérification de la MMU et du noyau Afin de venir en aide à la communauté NIOS II / Linux sur le web, nous avons décidé de partager notre expérience avec eux en réalisant un tutorial qui explique les étapes précédentes. Nous espérons pouvoir à terme le mettre en ligne sur le wiki du NIOS II. Page 9 Projet Avancé – NIOS II Linux ETUDE DU PORTAGE Le portage est un travail se séparant en plusieurs étapes. Dans un premier temps il s’agit d’adapter le patch à l’architecture souhaitée, dans notre cas la carte Stratix EP1S10 (Altera Nios II). Cette étape est décomposée en 2 parties : identifier les sources du noyau à modifier, puis les modifier pour recompiler le noyau préempté pour uClinux. Il faut ensuite charger cela sur la carte avec un programme comme Cyclictest pour vérifier le bon fonctionnement du noyau. 1. Modification des sources 1.1. Identification des sources à modifier Pour effectuer cette partie, nous avons pris en compte qu’une grande partie des sources sont communes à n’importe quelle architecture. Ainsi seulement quelques fichiers sont à modifier. Pour savoir lesquels, nous avons analysé plusieurs architectures existantes à l’intérieur du patch. Tout d’abord, nous avons regardé les changements effectués par Ingo Molnar sur une carte SH. 29 fichiers apparaissent dans le patch pour cette plateforme : Fichier modifié Page 10 1 2 3 4 5 6 7 8 9 10 11 12 13 arch/sh/kernel/cpu/clock.c arch/sh/kernel/cpu/sh4/sq.c arch/sh/kernel/entry-common.S arch/sh/kernel/irq.c arch/sh/kernel/process.c arch/sh/kernel/semaphore.c arch/sh/kernel/sh_ksyms.c arch/sh/kernel/signal.c arch/sh/kernel/time.c arch/sh/kernel/traps.c arch/sh/mm/cache-sh4.c arch/sh/mm/init.c arch/sh/mm/pg-sh4.c 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 arch/sh/mm/tlb-flush.c arch/sh/mm/tlb-sh4.c include/asm-sh/atomic-irq.h include/asm-sh/atomic.h include/asm-sh/bitops.h include/asm-sh/pgalloc.h include/asm-sh/rwsem.h include/asm-sh/semaphore-helper.h include/asm-sh/semaphore.h include/asm-sh/system.h include/asm-sh/thread_info.h include/linux/serial_core.h kernel/hrtimer.c kernel/time.c kernel/time/ntp.c kernel/timer.c Fichier present pour nios2 Non Non arch/nios2/kernel/entry.S Oui Oui Non Non Oui Oui Oui arch/nios2/mm/cacheflush.c Oui arch/nios2/mm/pg.c arch/nios2/mm/pgtable.c arch/nios2/mm/tlb.c “ Non Oui Oui Oui Non Non Non Oui Oui Non Non Oui Non Non Projet Avancé – NIOS II Linux Figure 9 - Correspondance des sources entre architecture Grâce à ce tableau, nous avons une première idée des sources qui seront à adapter. Nous avons ainsi fait de même pour les architectures ARM et POWERPC. Des comparaisons similaires au tableau précédent sont insérées en annexe. Puis nous avons examiné le patch Xenomai pour l’architecture nios2. Donc nous avons une idée plus précise des modifications à apporter. Les fichiers suivants ont de grandes chances d’être différents une fois patchés car ils appartiennent au patch Xenomai : - arch/nios2/Kconfig arch/nios2/kernel/Makefile arch/nios2/kernel/entry.S arch/nios2/kernel/irq.c arch/nios2/kernel/traps.c arch/nios2/kernel/time.c arch/nios2/include/asm-nios2/altimer.h arch/nios2/include/asm-nios2/atomic.h arch/nios2/include/asm-nios2/mmu_context arch/nios2/include/asm-nios2/system.h arch/nios2/mm/memory.c arch/nios2/mm/mlock.c arch/nios2/mm/vmalloc.c 1.2. Modification des sources Après l’analyse des sources à modifier, nous avons une idée du travail à faire dans le futur. Par faute de temps nous n’avons pas pu effectuer cette partie. Nous avons tout de même pu identifier un changement commun à toutes les architectures. En effet, pour le fichier « time.c », certaines fonctions doivent devenir atomiques. Ainsi, on effectue les changements suivants : - write_seqlock_irq(&xtime_lock); + write_atomic_seqlock_irq(&xtime_lock); Et de même pour ces lignes : - write_sequnlock_irq(&xtime_lock); + write_atomic_sequnlock_irq(&xtime_lock); 2. Portage du noyau Etant donné que nous n’avons pas pu identifier avec certitude toutes les sources à modifier, et n’ayant modifié quasiment aucun fichier, il est évident que nous n’avons pas pu effectuer cette partie. Celle-ci implique le chargement du noyau préempté avec MMU qui devrait être assez aisé. Mais il faudra après valider le comportement temps réel mou. Pour cela, il faut charger un programme de test tel que Cyclictest permettant de vérifier les temps de latences de différentes tâches. Page 11 Projet Avancé – NIOS II Linux CONCLUSION Le patch RT-Prempt a pour effet de rendre le noyau Linux préemptif, et donc temps réel. Toutefois, il n’offre que des performances que l’on peut qualifier de temps réel « mou ». On obtient ainsi des temps de réponse moyens satisfaisants, mais les valeurs ne sont pas constantes et les maximums peuvent atteindre des valeurs très éloignées de l’objectif. Cette solution n’est donc pas adaptée à des applications certifiées pour un secteur critique tel que le médical ou l’aéronautique, contrairement aux systèmes temps réel « dur ». Porter le patch RT-Preempt sur l’architecture NIOS II nécessite d’identifier et de modifier les sources du noyau Linux correspondant à ce processeur, mais aussi à la carte de développement utilisée. Ce travail est fastidieux, demande de bonnes connaissances, et seule une partie de celui-ci a pu être effectué dans le temps imparti. Le NIOS II est à présent capable de faire tourner Linux avec une unité de gestion mémoire sur une carte Altera Stratix EP1S10. Les sources du noyau qui doivent être corrigées sont maintenant en partie connues, mais il reste maintenant à en effectuer la modification. De plus, il faudra encore en vérifier le bon fonctionnement et mesurer les performances sur la carte de développement. Page 12 Projet Avancé – NIOS II Linux ANNEXE : COMPARAISONS DES SOURCES POUR DIFFERENTES ARCHITECTURES Architecture ARM fichier présent sur Nios II arch/arm/Kconfig Oui arch/arm/include/asm/dma.h Oui arch/arm/include/asm/ftrace.h Oui arch/arm/include/asm/mach/irq.h asm/irq.h arch/arm/include/asm/system.h Oui arch/arm/include/asm/tlb.h Oui arch/arm/kernel/Makefile Oui arch/arm/kernel/dma.c Oui arch/arm/kernel/entry-common.S entry.S arch/arm/kernel/irq.c Oui arch/arm/kernel/process.c Oui arch/arm/kernel/return_address.c Non arch/arm/kernel/signal.c Oui arch/arm/kernel/smp.c Non arch/arm/kernel/stacktrace.c Non arch/arm/kernel/time.c Oui arch/arm/kernel/traps.c Oui arch/arm/mach-at91/gpio.c Non arch/arm/mach-footbridge/include/mach/hardware.h . arch/arm/mach-footbridge/netwinder-hw.c . arch/arm/mach-footbridge/netwinder-leds.c . arch/arm/mach-integrator/core.c . arch/arm/mach-integrator/pci_v3.c . arch/arm/mach-ixp2000/core.c . arch/arm/mach-ixp4xx/common-pci.c . arch/arm/mach-msm/proc_comm.c . arch/arm/mach-ns9xxx/irq.c . arch/arm/mach-sa1100/badge4.c . arch/arm/mach-shark/leds.c . arch/arm/mach-w90x900/mfp-w90p910.c Non arch/arm/mm/cache-l2x0.c cacheflush.c arch/arm/mm/context.c Non arch/arm/mm/copypage-v4mc.c Non arch/arm/mm/copypage-v6.c Non arch/arm/mm/copypage-xscale.c Non arch/arm/mm/dma-mapping.c Non arch/arm/mm/fault.c Oui arch/arm/mm/mmu.c mmu_context.c arch/arm/oprofile/common.c Non arch/arm/oprofile/op_model_mpcore.c . arch/arm/oprofile/op_model_xscale.c . arch/arm/plat-omap/clock.c Non Page 13 Projet Avancé – NIOS II Linux Architecture PowerPC arch/powerpc/Kconfig arch/powerpc/include/asm/mpic.h arch/powerpc/include/asm/pgtable-ppc64.h arch/powerpc/include/asm/pmac_feature.h arch/powerpc/include/asm/rwsem.h arch/powerpc/include/asm/tlb.h arch/powerpc/include/asm/tlbflush.h arch/powerpc/kernel/entry_64.S arch/powerpc/kernel/idle.c arch/powerpc/kernel/irq.c arch/powerpc/kernel/kprobes.c arch/powerpc/kernel/pmc.c arch/powerpc/kernel/process.c arch/powerpc/kernel/prom.c arch/powerpc/kernel/time.c arch/powerpc/kernel/traps.c arch/powerpc/lib/locks.c arch/powerpc/mm/fault.c arch/powerpc/mm/hash_native_64.c arch/powerpc/mm/highmem.c arch/powerpc/mm/init_32.c arch/powerpc/mm/mmu_context_nohash.c arch/powerpc/mm/pgtable.c arch/powerpc/mm/tlb_hash64.c arch/powerpc/mm/tlb_nohash.c arch/powerpc/platforms/52xx/media5200.c arch/powerpc/platforms/cell/beat_htab.c arch/powerpc/platforms/cell/beat_interrupt.c arch/powerpc/platforms/cell/interrupt.c arch/powerpc/platforms/chrp/time.c arch/powerpc/platforms/iseries/irq.c arch/powerpc/platforms/powermac/feature.c arch/powerpc/platforms/powermac/nvram.c arch/powerpc/platforms/powermac/pfunc_base.c arch/powerpc/platforms/powermac/pic.c arch/powerpc/platforms/pseries/eeh.c arch/powerpc/platforms/pseries/eeh_driver.c arch/powerpc/platforms/pseries/iommu.c arch/powerpc/platforms/pseries/rtasd.c arch/powerpc/platforms/pseries/xics.c arch/powerpc/sysdev/fsl_msi.c arch/powerpc/sysdev/ipic.c arch/powerpc/sysdev/mpic.c arch/powerpc/sysdev/uic.c arch/powerpc/xmon/xmon.c Page 14 fichier présent sur Nios II Oui Non pgtable.h / pgtable-bits.h Non Non Oui Oui entry.S Non Oui Non Non Oui Non Oui Oui Non Oui Non Non init.c mmu_context.c pgtable.c tlb.c Non Non . . . . . . . . . . . . . Non Non . . . Non