Linux embarqué
Transcription
Linux embarqué
7 Modélisation et mise en place du projet Une fois que l’on sait ce qu’il possible de faire, la modélisation est l’étape de mise en forme des idées, de concrétisation schématique, d’imagination avant développement. Un projet doit répondre à une problématique initiale : on doit tracer les grandes lignes architecturales, et penser dès le début aux problèmes graves qui pourraient survenir par la suite. Certains choix peuvent sembler prématurés, mais il n’en est rien : penser au système de fichier et à l’allure générale du système permet d’estimer les futures possibilités d’intégration de logiciels – et donc la couverture fonctionnelle envisageable –, tout autant que d’entrevoir le système de mises à jour. Certains réflexes sont à mettre en place, une approche rigoureuse et en harmonie avec le modèle du Libre pourront garantir le succès du projet. Pour finir, une revue des différentes sources externes d’informations a pour but de rendre autonome et de donner une dynamique dans le travail autour du Libre dans l’embarqué. Définir la problématique La définition d’une problématique relative à Linux embarqué est la même que pour tout projet embarqué. Les contraintes supplémentaires à intégrer sont celles du support matériel, de l’espace mémoire (vive et de stockage) et des performances : il faut veiller à ce qu’une des nombreuses solutions Linux que nous avons déjà évoquées puisse répondre aux fonctionnalités souhaitées du projet, sans quoi il faudra réviser l’ensemble du système pour que les deux aspects matériel et logiciel puissent s’accorder. En milieu industriel, dans une optique de production, il est inutile d’essayer de repousser par soi-même les limites du système Linux, surtout lorsqu’on débute : si un projet n’est recensé nulle part, la probabilité que cela ne soit pas possible est très fortement probable (dans le cadre d’un budget concevable). © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 147 08/11/11 16:47 148 Penser son projet Partie 2 Apprendre à schématiser son projet "Un bon croquis vaut mieux qu’un long discours", disait Napoléon. Déjà pratiqué en embarqué tant au niveau matériel que logiciel, le schéma sous forme de blocs logiques, représentant autant de "briques logicielles", parfois même de "sousbriques", est devenu très à la mode et très pertinent pour le modulaire Linux. On le nomme block diagram. Il donne une vue d’ensemble du système très agréable à comprendre et très synthétique. On note cependant régulièrement des vues de l’esprit assez contestables quant à la réalité technique. D’une manière générale, on fait figurer le bootloader juste au-dessus du matériel, puis le noyau et ses modules, sur lequel repose le système de base, et enfin les couches applicatives de plus haut niveau. Les schémas-blocs des Figures 7.1 à 7.4 sont issus de documentations officielles et donnent une idée de ce qu’il est possible d’envisager en termes de représentation (adaptés pour des raisons d’impression). User Experience Netbook Application Framework Clutter and M Libraries Handset Application Framework MeeGo Touch Framework Other Application Framework MeeGo APIs Core OS Security Security Frameworks and Enablers System Device State and Resource Policy mgmt, Sensor, Context Essentials Base Essentials Communications Telephony, IM, Connection Management, Bluetooth Data Management Metadata Storage Location Location Framework Multimedia Multimedia related enables and drivers Qt Qt, QtWRT, Qt Mobility SW Management Package management and Software Lifecycle Graphics X11, Open GL, Input, and Display Drivers Personal Info Mgmt Calendar, Contacts, Bacup and Sync Kernel Linux Kernel and core drivers Hardware Adaptation Figure 7.1 Architecture de MeeGo (©meego.com). © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 148 08/11/11 16:47 Chapitre 7 Modélisation et mise en place du projet 149 APPLICATIONS Home Contacts Phone Browser ... APPLICATION FRAMEWORK Activity Manager Package Manager Window Manager Telephony Manager Content Providers Resource Manager View System Location Manager LIBRARIES Notification Manager ANDROID RUNTIME Surface Manager Media Framework SQLite Core Libraries Open GL / ES FreeType WebKit Dalvik Virtual Machine SGL SSL libc LINUX KERNEL Display Driver Camera Driver Flash Memory Driver Binder (IPC) Driver Keypad Driver WiFi Driver Audio Drivers Power Management Figure 7.2 Organisation d’Android (http://code.google.com/android/images/ system-architecture.jpg). Network Services Control Services Internet Services Connection Management CAN Webkit libpv IP Autoconfig Visual Services Media Services QT gstreamer JSON-D-Bus Bridge Camera Middleware Layer Codecs Audio Settings Database System Libraries Message Bus gconf glib, libudev... D-Bus Glibc - POSIX Driver Driver Driver Linux Kernel System Layer OS Layer Driver Driver Driver Figure 7.3 Vue d’un système Linux embarqué industriel par Pengutronix (http://www.pengutronix.de/ development/web/index_en.html). © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 149 08/11/11 16:47 150 Penser son projet Partie 2 Web Browser IM Terminal Book Reader (Stylus Applications) net (others) Contacts Messages Application Manager core Search (others) Dialer Main Menu Media Player Clocks (others) (Finger Applications) X11 Applications (3rd Party Applications) UI PIM (OpenMoko Application Framework) udev blueZ dbus GSM matchbox GTK+2 kdrive 7 libX11 GPS Linux Core Services (Linux User Interface) Linux 2.6 Kernel & Device Drivers Mobile Handset Hardware Figure 7.4 Architecture d’OpenMoko (http://www.theinquirer.net/inquirer/news/1026841/ a-truly-linux-phone-gps-debuts). Comprendre l’environnement hardware La principale différence qui distingue l’informatique embarquée de l’informatique "standard" est la connaissance nécessaire du système matériel. Si le pertinent Dijkstra disait que "l’informatique ne relève pas plus des ordinateurs que l’astronomie des téléscopes", pour l’embarqué il faut faire une exception. Un système embarqué comporte de nombreuses subtilités par rapport à un système matériel "standard". Sans pouvoir être exhaustif, on peut débroussailler les principales caractéristiques et permettre d’éviter les pièges. Un environnement matériel peut être découpé comme suit : ■ Un CPU pour les calculs et les Entrées/Sorties (I/O), autour duquel tout est organisé. Il peut proposer : U une gestion poussée de sa consommation électrique; U un ou plusieurs cœurs. © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 150 08/11/11 16:47 Chapitre 7 Modélisation et mise en place du projet 151 NOTE Un fort bon aperçu de l’architecture ARM, en français, par François Armand : http:// www.pps.jussieu.fr/~armand/M2_SEM/Supports_Cours/03_ArchProc_4p.pdf. ■ De la RAM : très rarement plus de 256 Mo. ■ Un stockage des données sur différents supports, le plus souvent de la mémoire flash. ■ Des entrées-sorties à usage général (General Purpose Input Output, GPIO) : sous forme de paire de "pins", on peut faire passer ou non du courant (de 2 à 5 V), soit en entrée (détection) soit en sortie (commande). ■ Un bus de communication I²C (ou I2C), pour les communications assez lentes (un fil de données, un fil d’horloge). ■ Un port JTAG (abus de langage pour Boundary Scan ou TAP) : accédant directement aux fonctionnalités bas niveau du CPU, il est possible de scruter son fonctionnement, de déboguer du logiciel (par points d’arrêt matériels et lecture des registres ou de la mémoire), ou encore de programmer la mémoire flash (c’est-à-dire d’écrire des données dessus). ■ Des bus UART (Universal Asynchronous Receiver Transmitter), RS-232 ou port série : il s’agit d’un port ancestral simple et efficace, très utilisé, supporté par tous les CPU et présent sur quasiment toutes les cartes, mais dont l’encombrement peut le faire disparaître au profit de ports physiques plus "ramassés", par exemple sur la BeagleBoard de TI, qui nécessite un adaptateur ; la plus récente BeagleBoard-xM possède bien en revanche un classique port DE-9M, plus courant et donc plus pratique. ■ Un bus USB : peu nombreuses sont à présent les cartes qui ne gèrent pas le très pratique et rapide Universal Serial Bus (certains CPU de la gamme OMAP de TI proposent de transformer nativement les bus UART en USB). Il en existe deux versions (1.1 et 2.0 en embarqué, bientôt 3.0) et trois sortes sont rencontrées sur les cartes : U USB hôte ou maître ou concentrateur : il gère la configuration et les trans- ferts de données lors de la connexion (typiquement ce que l’on trouve sur un PC, ce port alimente en 5 V) ; U USB esclave ou device ("gadget" sous Linux) : l’autre côté du port (typique- ment, une clé USB ; ce port nécessite d’être alimenté pour fonctionner), avec lequel la communication va être établie (une carte peut à la fois comporter un USB esclave et un USB maître) ; © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 151 08/11/11 16:47 152 Penser son projet Partie 2 U USB On-The-Go (OTG) : c’est une extension de USB 2.0 (uniquement) que l’on peut configurer logiciellement pour être utilisé en tant que maître ou en tant qu’esclave, sachant que sur le bus il ne peut y avoir qu’un seul maître à la fois. ■ Un lecteur de carte SD : de plus en plus présent, il permet d’étendre les capacités de stockage, mais aussi de démarrer un système entier dessus. ■ Un port Ethernet ou RJ45 : de plus en plus présent, ce standard de la connectique réseau est essentiellement, en embarqué, du 10/100 Mbit/s (attention à l’absence d’auto-négociation, qui impose dès lors soit un câble droit soit un câblé croisé). Certaines cartes sont très génériques, elles proposent des "modules" sous forme de cartes-filles, qui peuvent permettre, par exemple, de changer le CPU. La technologie flash est très particulière : ■ L’organisation du stockage se fait par blocs, et une écriture implique d’effacer un bloc (c’est-à-dire mettre tous ses octets à 0xFF – ou tous les bits à "1" –, et non à 0x0 comme on pourrait le penser) avant de fixer les données modifiées, stockées un moment en RAM. ■ Le nombre de cycles d’écriture par bloc limite sa durée de vie. ■ Il existe de la flash NOR et de la flash NAND : U la NOR est lente en écriture, mais permet d’adresser aléatoirement et rapi- dement n’importe quelle position : elle permet le XIP (eXecute In Place : exécution sans avoir à recopier le binaire en mémoire RAM); U la NAND est plus rapide, mais ne dispose que d’un accès séquentiel aux données, sans être garantie à 100 % ; U la NOR est de bien meilleure qualité mais beaucoup plus chère que la NAND. Cette dernière permet donc de disposer de bien plus d’espace de stockage. C’est ainsi que certaines plateformes matérielles proposent simultanément, par exemple, 1 Mo de NOR et 64 Mo de NAND. ■ La représentation mémoire de la flash est sur le même plan d’adressage que la RAM, ce qui peut permettre le XIP sur de la flash NOR, si le noyau est configuré pour et que le système de fichiers supporte la fonctionnalité. Il est nécessaire de lire le manuel du CPU contenu dans le BSP. Il s’agit souvent d’un document très long, de l’ordre de 300 à 400 pages, dont il faut rapidement tirer les informations essentielles dès que l’on veut développer au sein du noyau ou que l’on doit s’attaquer à la phase de démarrage. Le démarrage d’un tel système nécessite un chargeur d’amorçage ou bootloader. Nous allons étudier plus avant l’architecture ARM à titre d’exemple. © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 152 08/11/11 16:47 Chapitre 7 Modélisation et mise en place du projet 153 Le bootloader gère en réalité peu de choses absolument nécessaires au démarrage d’un noyau Linux. Le CPU démarre à l’adresse 0x0 (on verra plus loin l’astuce qu’il met en place pour cela lorsque la flash n’est pas de type NOR : le Steppingstone). Le bootloader est alors exécuté. Il exécute un certain nombre d’instructions similaires au démarrage de Linux, afin de gérer plus ou moins complètement la carte. Un bootloader complet dispose d’une console d’administration, gère le réseau, etc. Surtout, il permet de modifier la ligne de commande du noyau, et de pointer vers le noyau qui nous intéresse (s’il y en a plusieurs) avant de le démarrer. Pour la phase de démarrage, le bootloader copie le noyau à une certaine adresse en RAM, calculée pour convenir à la copie (il faut qu’il y ait la place) et pour que le noyau puisse correctement se décompresser sans s’écraser lui-même. L’adresse de décompression est codée dans les fichiers de support de l’architecture, et donc compilée dans le noyau. Puis, le bootloader initialise les différents registres du CPU : ■ r0=0 : le registre 0 doit être à zéro (convention Linux) ; ■ r1=362 : ceci est un numéro d’architecture propre à Linux et reporté dans le bootloader (sous formes de macros C), ici le SBC2440 ; ■ r2=0 : le registre 2 pointe vers les options de ligne de commande (0 signifie au noyau d’utiliser la ligne de commande compilée d’après la configuration du noyau) ; ■ sp=0x33D50000 : le registre pointant sur le sommet de pile d’exécution ; ■ pc=0x33D50000 : le registre pointant sur l’instruction à exécuter ; ■ lr=0x33D50000 : le registre pointant sur l’adresse de retour après appel de procédure. En réalité, les registres sp, pc et lr sont gérés par l’instruction assembleur d’appel de procédure bl. Le bootloader U-Boot utilise intelligemment un pointeur de fonction (en langage C) dont l’adresse est le noyau Linux en RAM, avec comme paramètre 0, le numéro d’architecture et le pointeur vers la ligne de commande. Le compilateur traduit donc cette simple instruction en correspondance avec ce qui a été énoncé plus haut. Avec une sonde JTAG, il faut bien procéder manuellement après l’arrêt du CPU, puis demander son redémarrage. Depuis le débogueur gdb1, cela donne les instructions : (gdb) (gdb) (gdb) (gdb) (gdb) target remote localhost:3333 load ./S3C2440/linux-2.6.25/arch/arm/boot/compressed/vmlinux 0x33D50000 set $r0=0 set $r1=362 set $r2=0 1. La mise en place de l’environnement de développement et l’utilisation de ces outils seront étudiés au Chapitre 13, Maîtriser GDB et gdbserver. © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 153 08/11/11 16:47 154 (gdb) (gdb) (gdb) (gdb) Penser son projet Partie 2 set $sp=0x33D50000 set $pc=0x33D50000 set $lr=0x33D50000 c Pour la configuration particulière de l’adressage de la flash et de la RAM, toujours sur architecture ARM, on peut se reporter par exemple à cet extrait de schéma (Figure 7.5), issu la documentation du Samsung S3C2440. Figure 7.5 Organisation de la mémoire sur S3C2440. 0xFFFF_FFFF Not used 0x6000_0000 SFR Area 0x4800_0000 0x4000_0FFF 0x4000_0000 BootSRAM (4KB) SDRAM (BANK7, nGCS7) 0x3800_0000 0x3000_0000 0x2800_0000 0x2000_0000 0x1800_0000 SDRAM (BANK6, nGCS6) SROM (BANK5, nGCS5) SROM (BANK4, nGCS4) SROM (BANK3, nGCS3) SROM (BANK2, nGCS2) 0x1000_0000 0x0800_0000 0x0000_0000 SROM (BANK1, nGCS1) SROM (BANK0, nGCS0) On peut voir un découpage par tranches inégales, avec un étalement sur 4 Go d’adressage à la fois de la flash ("SROM") et de la RAM ("SDRAM"), ce qui implique des zones discontinues. Il faut y faire particulièrement attention lorsqu’on charge en mémoire un noyau Linux, avant l’initialisation de la MMU, c’est avec l’aide d’une sonde JTAG ou depuis le bootloader, que ce soit lui qui fasse la copie du fichier-noyau ou que celui-ci soit chargé à travers le port série ou le réseau. En effet, la zone de chargement en mémoire doit être contiguë depuis la flash. De même, un autre piège pour ces architectures ne disposant pas de flash NOR est le mécanisme de Steppingstone : 4 Ko de début de flash NAND sont copiés en RAM pour démarrer, puis le CPU remappe les adresses pour qu’elles correspondent au schéma ci-dessus ; cette opération s’effectue automatiquement dès que le pointeur © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 154 08/11/11 16:47 Chapitre 7 Modélisation et mise en place du projet 155 d’instruction dépasse 0x1000. Il ne faut donc en aucun cas utiliser les adresses à partir de 0x0 pour démarrer un noyau via le JTAG ou lorsque le bootloader copie en RAM le noyau avant de le démarrer : il ne rentrerait pas de toute façon, 4 Ko correspondant à peine à une taille maximale de bootloader, au-delà de laquelle il est obligé de se gérer en tranches ou stages. En revanche, l’adresse 0x33D50000, citée dans l’exemple au-dessus, convient tout à fait pour le chargement du noyau ; une autre adresse correctement calculée pourrait tout aussi bien fonctionner. Jongler avec les systèmes de fichiers, premières considérations architecturales Premières approches L’enregistrement des données utilisables par le système doit se faire selon une procédure prédéterminée, un format de stockage selon un algorithme déterministe : ce que l’on nomme "système de fichiers" (File System, FS en abrégé). Traditionnellement, dans l’embarqué, cette notion était inutile, ou réduite à son état le plus simple : si les données ne sont pas "codées en dur" (directement dans le noyau), elles sont fixées naïvement en contigu, et accolées au noyau, formant ce qui est appelé un "blob" (binary large object). Avec l’apparition de mémoire flash de stockage de tailles de plus en plus importantes, la possibilité d’enregistrer des données est apparue. Le noyau doit alors présenter la possibilité de lire une table pointant vers les fichiers. Si le système de fichiers supporte l’écriture, les fichiers seront forcément fractionnés, ce qui impose un mécanisme plus complexe pour les gérer, plus coûteux en temps et en espace de stockage. Linux est encore une fois particulier : le noyau gère quantité de systèmes de fichiers, adaptés pour certaines utilisations spécifiques, évidemment pour le bureau ou les serveurs (ext3, ext4, ReiserFS, XFS, Btrfs, etc.), mais aussi pour l’embarqué. Ces derniers systèmes de fichiers sont très particuliers, et en réalité peu répandus ; si Linux en possède plusieurs, répondant à diverses problématiques, les systèmes libres *BSD n’en possèdent aucun : les systèmes de fichiers FFS et UFS ne sont utilisables que sur disque dur ou assimilé, CompactFlash par exemple, mais pas directement sur de la mémoire flash. Sur PC, chaque système de fichiers est contenu dans une "partition" dédiée, de type IBM : dans la table des partitions, qui en contient quatre, les trois premières sont nécessairement "primaires", puis un système de "partitions étendues" prend le relai. Ce système primitif persiste malheureusement encore, même si des évolutions se dessinent. © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 155 08/11/11 16:47 156 Penser son projet Partie 2 NOTE Seuls les systèmes *BSD ou Solaris s’en sont affranchis : c’est le système de slices, chacun comportant un système de fichiers, et tous contenus dans une seule partition. En utilisant EFI à la place du BIOS, le système de partitionnement est différent : il s’agit du GPT. Cependant, dans la plupart des systèmes embarqués, où la flash est adressable directement depuis le CPU, Linux donne la possibilité de gérer dynamiquement le partitionnement. Ce mécanisme et les considérations concernant le partitionnement seront étudiés plus tard, lorsque l’on se penchera sur la phase d’intégration (Chapitre 12). On peut en tout cas considérer les systèmes de fichiers indépendamment du système de partitionnement sous-jacent. Problématique Le choix du ou des systèmes de fichiers à mettre en place pour une solution de Linux embarqué doit intervenir très tôt dans la conception du projet. En effet, ce choix a un impact sur l’organisation même du système. Si le système est destiné à être stocké sur disque dur ou sur SSD2 – http://www. linux-mag.com/cache/7590/1.html – la problématique est proche de celle des serveurs. Il convient donc de se renseigner sur les systèmes de fichiers du moment (par exemple ext4, Btrfs ou NILFS – New Implementation of a Log-structured File System, à partir du noyau 2.6.30), sur leurs performances respectives, leur robustesse (en cas de coupure de courant, surtout au milieu d’une écriture de données), leurs caractéristiques3, ainsi que sur les retours des utilisateurs. Il en va de même pour une cible disposant d’une CompactFlash, c’est-à-dire géré par un contrôleur de type IDE (interface TrueIDE), sur les plateformes x86 de type serveur (pour des net appliances), faisant figure de disque SSD à bas coût. Le partitionnement est alors de type IBM (on utilise la commande fdisk), et les systèmes de fichiers, là encore, sont typiques d’une distribution standard "bureautique" ou "serveur". NOTE Pour les disques bon marché, Btrfs (dit aussi ButterFS) est alors recommandable pour sa gestion de la compression, utile sur des Netbook ou TabletPC sur base Atom disposant de peu d’espace disque : on peut ainsi doubler la taille du système stocké. 2. Essentiellement pour des plateformes de type PC, PowerPC ou PowerQUICC, intégrées dans des châssis protégés, notamment des coupures de courant. 3. Notamment, est-ce que le système de fichiers (surtout s’il est récent) est supporté par le bootloader employé ? Dans le cas contraire, il ne pourra être utilisé que pour du stockage, et non pour une partition système contenant le noyau (il est possible de dédier une partition à /boot). © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 156 08/11/11 16:47 Chapitre 7 Modélisation et mise en place du projet 157 Figure 7.6 Organisation simple des partitions sur x86. M B R système Linux [boot loader, noyau] données En réalité, le problème prend tout son sens avec l’immense majorité des machines munies de mémoire de stockage flash, directement liées au CPU4 (sur architecture ARM, MIPS ou SH4 par exemple). Les systèmes de fichiers sont alors gérés sous Linux par le système MTD (Memory Technology Devices). NOTE Voir à ce sujet les URL : m http://www.linux-mtd.infradead.org/ ; m http://www.righthandtech.com/embedded-linux-managing-memory.php. Un système de fichiers reposant, de par sa conception, sur MTD n’est pas utilisable par IDE ; en revanche, il est possible d’utiliser n’importe quel système de fichiers sur MTD, quoique cela soit une très mauvaise idée s’il n’a pas été pensé pour. NOTE Voir à ce propos : http://www.linux-mtd.infradead.org/faq/general.html#L_ext2_mtd. Grâce au nouveau système UBI, il est cependant plus facile d’obtenir un système de fichiers adressant la problématique flash à partir d’un système de fichiers "standard" (voir plus bas). Comme on l’a vu, la technologie flash est particulière, et implique de devoir utiliser des systèmes de fichiers capables, lorsqu’ils supportent l’écriture, de niveler les données écrites, afin d’optimiser le nombre de cycles d’écriture possibles (il s’agit du wear leveling), et capable de ne pas perdre de données en cas de coupure brutale du courant, ce qui n’est jamais à exclure sur ce type de machines, ne disposant parfois pas même de bouton d’arrêt "logiciel", ou pouvant subir une coupure de batterie inopinée. Il faut d’abord se demander où sera stocké le noyau : sur une partition ou directement, "en dur" (hors système de fichiers) sur la flash ? La première solution est moins sécurisée, un peu moins pratique à mettre en place, mais plus flexible sur le long terme. On pourra en effet remettre à jour le noyau plus tard (pour ajouter des fonctionnalités ou pour corriger de rares failles de sécurité) sur le même firmware que l’ensemble du système, au lieu de procéder indépendamment. La seconde solution est élégante, le gestionnaire de démarrage (bootloader) se charge de pointer sur une adresse de la mémoire flash, et le noyau est simplement chargé en RAM ou 4. Dans la littérature anglaise, on trouve les adjectifs bare ou raw. © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 157 08/11/11 16:47 158 Penser son projet Partie 2 gardé sur la flash sans copie en RAM si l’on fait appel au XIP. Ce dernier définit dynamiquement les différentes partitions sur le système grâce à ses options dans sa ligne de commande (passée par le bootloader ou compilée statiquement). NOTE Il s’agit là du XIP pour le noyau, qui se configure indépendamment de celui pour l’espace utilisateur évoqué précédemment. Il faut ensuite considérer l’espace de flash dont on dispose, et ce que l’on voudrait y mettre : cela imposera l’utilisation ou non d’un système de fichiers compressé. Un tel FS est plus consommateur en ressources de calcul mais peut faire gagner de 25 à 70 % de taille mémoire ! La limite de mémoire flash n’est pas la seule à pouvoir orienter vers le choix de la compression. Il se peut qu’une mise à jour de firmware impose un envoi via le réseau, ce qui implique de considérer les éléments suivants : ■ Le temps de transfert : par exemple sur un module GPRS, sans 3G. ■ Le coût de transfert : par exemple les forfaits téléphoniques avec Internet, même "illimités", sont limités en données avant bridage ou coupure. ■ L’utilisation de la bande passante : la mise à jour simultanée à 4 h du matin de quelques centaines de milliers de modems ADSL a ainsi été abandonnée pour une solution désynchronisée. ■ L’espace mémoire disponible sur cible : sur un système Android, le firmware est stocké sur la flash avant d’être appliqué lors du redémarrage, avec retour en arrière possible, soit autant de multiplication de l’occupation d’espace mémoire à prévoir. On peut cependant, avant son envoi, compresser un firmware qui serait constitué d’un système de fichiers non-compressé, et le décompresser directement sur la flash une fois qu’il est chargé en RAM – autant dire que ce type d’opération ne peut pas être effectué par un simple bootloader : on considèrera les politiques à mettre en œuvre pour ce genre de mises à jour complexes au Chapitre 14. Il faut alors considérer le temps d’écriture sur la flash, autant de temps durant lequel la machine n’est probablement pas accessible, ce qui peut énerver plus d’un utilisateur, ou être gênant pour le rendu d’un service qui ne doit souffrir que peu d’interruptions. C’est aussi sans compter qu’une coupure de courant durant la phase de flashage impliquera de télécharger de nouveau le firmware. Enfin, il faut se demander si l’on veut garder un accès en écriture sur le système même. En effet, cela peut présenter un risque de sécurité (possibilité de modifier des fichiers sur le système en cas d’intrusion, et donc de détourner l’usage de l’appareil ou le faire planter) ainsi qu’un potentiel risque de corruption des données. Un système en lecture seule (read-only, RO) a aussi l’avantage, lorsqu’il est compressé (c’est quasiment toujours le cas lorsque l’on met en œuvre ce type de solution), de prendre bien moins de place qu’un FS en lecture-écriture (read-write, RW). © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 158 08/11/11 16:47 Chapitre 7 Modélisation et mise en place du projet 159 NOTE Un système de fichiers compressé est basiquement une archive compressée : initramfs est une archive cpio compressée par gzip. L’utilitaire 7zip sait ouvrir des images CramFS et SquashFS. En outre, il est monté beaucoup plus vite au démarrage, réduisant considérablement les temps de chargement. Il est cependant plus long ensuite lors des accès, puisqu’une phase de décompression est nécessaire. Pour une partition système, cela n’est pas vraiment un problème. NOTE Le montage consiste à faire reconnaître, à l’aide de l’appel système mount un système de fichiers au noyau, qui l’associe alors à un point d’accès (ou point de montage) dans l’arborescence des répertoires. Figure 7.7 Partionnement simple sur flash (système de type ARM), noyau séparé de la partition principale. boot loader noyau système Linux NOTE Sur les schémas, les zones grisées correspondent au padding. On se reportera au Chapitre 14 pour des explications quant à ces zones mémoires inutilisées de tampon. De plus, ces schémas ne sont pas à l’échelle, ils ne sont que la représentation de la succession des différents blocs de données. Le plus souvent, la méthode la plus propre consiste à scinder le système sur deux partitions : ■ La première contient les exécutables et les fichiers de configuration qui constituent le coeur du système : elle est en lecture seule (RO). ■ La seconde contient les fichiers de configuration modifiés, les exécutables rajoutés pour étendre le système, tout ce qui peut être stocké ou modifié : elle est en accès-complet (RW). Entre les deux, des liens dynamiques sont mis en place, pour donner la possibilité de modifier certains fichiers de configuration du système choisis (il est aussi possible d’utiliser les fonctionnalités avancées de montage sous Linux, en "surchargeant" un répertoire par un autre à la volée, ou encore d’utiliser UnionFS ou aufs, qui permettent de "fusionner" virtuellement des systèmes de fichiers). © 2011 Pearson Education France – Linux embarqué – Gilles Blanc LE.indb 159 08/11/11 16:47