ELE-674 Systèmes embarqués avancés Cours #2 Amorçage du système Bruno De Kelper Site internet : http://www.ele.etsmtl.ca/academique/ele674/ 1 Plan d aujourd hui 1. Amorçage d un système 1. Démarrage du CPU 2. Démarrage sur un PC 3. Démarrage sur un système embarqué 4. Partie OS de l amorçage 2. 1. Survol des composantes du système 2. Chargeur d amorçage (BootLoader) 3. Noyau du système d exploitation 4. Système de fichiers 3. Outils de conception du système 1. Émulation avec QEMU 2. avec BuildRoot 2 Cours # 1 ELE784 - Ordinateurs et programmation système 1
Amorçage d un système 1.1 - Démarrage du CPU Lorsque l alimentation est appliquée, le CPU se réveille sans rien connaitre de son environnement. Alimentation RAM Flash La seule chose qu il connait est sa ROM interne. ROM Celle-ci contient un peu de code qui permet de commencer l initialisation du système Port série Port USB 3 Ethernet 1.2 - Démarrage sur un PC Amorçage d un système Beaucoup de l environnement du CPU est connu d avance BIOS ou équivalent Initialise les composantes du système, tels que les contrôleurs : RAM, interruptions, bus PCI, Fournit un pilote de base pour le Disque Dur. Se charge en mémoire Démarre le chargement du «BootLoader» : Peut être d assez grosse dimension Pour finir, le BIOS se met en mode «service». BootLoader Sert essentiellement à démarrer l OS et disparait ensuite Linux GRUB, LILO, Windows NTLDR, 4 Cours # 1 ELE784 - Ordinateurs et programmation système 2
Amorçage d un système 1.3 - Démarrage sur un système embarqué Le CPU «saute» à une adresse bien précise de la ROM ROM code L environnement du CPU est très variable, d un système à un autre Initialise quelques composantes essentielles du CPU : Horloge, Mémoire-interne, Périphériques de base Cherche un dispositif contenant un BootLoader valide. Charge le BootLoader trouvé en mémoire-interne : ROM-interne assez petite (initialisée par le fabricant) BootLoader Linux + (ARM, PowerPC) U-Boot SD Flash NAND, NOR Pour finir, le ROM code se retire du système. Fait le gros de l initialisation du système : Bus, cache et Mémoire externe Principaux périphériques du système Interruptions, Charge et décompresse l OS en mémoire Son travail fait, le BootLoader disparait du système Linux RedBoot, Yamon, Grub, LILO, U-Boot, 5 1.4 - Partie OS de l amorçage Boot Loader Système fonctionnel paramètres de démarrage Amorçage d un système 1 Initialise Noyau 2 Monte RootFS Init Système prêt Finalise l initialisation tel que le MMU (virtualisation de la mémoire), Récupère, décompresse et installe le RootFS. Exécute «linuxrc», démarre les pilotes et les Daemons. Démarre la 1 ière tâche : INIT 3 Le 1 er RootFS provient d un fichier «initrd» Système de fichier «initramfs» chargé dans un «RAM Disk» Ce RootFS contient : Fichiers des modules et pilotes du système Fichiers des librairies et de configurations Outils, logiciels, Surtout, le RootFS permet la «virtualisation» du système voir les composantes du système comme des «fichiers virtuels» 6 4 Cours # 1 ELE784 - Ordinateurs et programmation système 3
2.1 - Survol des composantes du système Boot Loader Noyau RootFS Choisir un BootLoader U-Boot Configurer le BootLoader Datasheet Compiler le BootLoader Toolchain Choisir un emplacement de stockage NAND, SD, UART, USB Choisir un Noyau Linux Configurer le Noyau Requis du système Compiler le Noyau Toolchain Choisir un emplacement de stockage Choisir un emplacement de montage Choisir un type de RootFS Configurer et peupler le RootFS Linux NAND, SD, UART, USB, NFS NAND, SD, NFS, RAM Requis du système 7 2.2.1 - Rôle et défis d un chargeur d amorçage Rôle : Le rôle du chargeur d amorçage (BootLoader) est de rendre le système suffisamment fonctionnel pour que d autres programmes puissent être exécutés. Au démarrage, le CPU est dans un état prédéfini et commence son exécution à une adresse bien précise dans la mémoire permanente du système. Aucunes des composantes du système ne sont fonctionnelles, y compris la mémoire RAM, et c est le rôle du BootLoader de leur «insuffler la vie». Défis : Au début de son exécution, le BootLoader n a pas accès ni à de la mémoire RAM pour stocker ses données, ni à une pile. Une 1 ière tâche du BootLoader est de rendre disponible la mémoire RAM et la pile, en initialisant correctement le contrôleur de DRAM et en configurant le CPU. Sa 2 ième tâche importante est de se copier lui-même dans la mémoire RAM, afin de poursuivre son exécution plus aisément. Finalement, le BootLoader doit récupérer le Noyau, selon l emplacement où celuici se trouve, le décompresser et l installer dans la mémoire RAM. 8 Cours # 1 ELE784 - Ordinateurs et programmation système 4
2.2.2 - Choix d un chargeur d amorçage Souvent, le chargeur d amorçage (BootLoader) est fournit par le fabricant de la plateforme de développement utilisée. Par contre, si celui-ci est bien adapté pour l architecture matérielle de la plateforme de développement, il ne l est pas nécessairement pour un système personnalisé. Dans la plupart des cas, un BootLoader doit être choisit et adapté à un Design spécifique de système embarqué. De nombreux BootLoader sont disponibles, tant commercialement que publiquement (à code ouvert). De ceux-ci, certainement le plus populaire pour les projets basés sur Linux est Das U-Boot, communément appelé U-Boot, de Wolfgang Denk (DENX Software Engineering). À la base, U-Boot a été développé spécifiquement pour les systèmes embarqués basé sur les ARM et PowerPC, mais supporte maintenant une vaste gamme de processeurs. 9 2.2.3 - Chargeur d amorçage U-Boot U-Boot est disponible à partir de plusieurs sources, dont la principale est : http://www.denx.de/wiki/u-boot Outre sa grande popularité pour les systèmes embarqués basés sur Linux, U-Boot a les avantages suivants : Est très configurable Est capable d amorcer un Noyau à partir de différentes sources : TFTP IDE SCSI UART USB NAND NOR SD Supporte une vaste gamme de systèmes de fichiers : Cramfs ext2 FAT JFFS2 Fournit un interpréteur de commandes (shell) Bien documenté Supporté par une large communauté Support pour une vaste gamme de processeurs : ARM AVR32 Blackfin Motorola 68K Microblaze Xilinx MIPS NIOS NIOS2 PowerPC Super-H Fournit une riche gamme de commandes 10 Cours # 1 ELE784 - Ordinateurs et programmation système 5
2.2.4 - Configurer U-Boot Pour une plateforme supportée U-Boot a été adapté pour plus de 300 plateformes différentes et de nombreux processeurs U-Boot include Pour configurer et compiler U-Boot pour une de ces plateformes, il suffit d exécuter les commandes suivantes : 1 make mrproper Pour faire le ménage configs 2 make omap3630sdp_config Pour établir la configuration Réfère à une règle du fichier Makefile de U-Boot 3 make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- all Architecture du CPU Compilateur «croisé» à utiliser Ces commandes font référence aux inscriptions suivantes du Makefile de U-Boot : omap3630sdp_config : unconfig @./mkconfig $(@:_config=) arm omap3 omap3630sdp Réfère au fichier de configuration : include/configs/omap3630sdp.h 11 2.2.4 - Configurer U-Boot Pour une plateforme non-supportée 1 Pour une nouvelle plateforme, le mieux est d abord d identifier une plateforme existante similaire et si possible de l utiliser comme point de départ. Il s agit ensuite de procéder aux étapes suivantes : /include/configs/omap3630sdp.h copier fichier Plateforme omap3630sdp comme point de départ /include/configs/omap3630new.h 2 /board/omap3630sdp copier répertoire /board/omap3630new 3 Ajouter la règle suivante au fichier Makefile : omap3630new_config : unconfig @./mkconfig $(@:_config=) arm omap3 omap3630new Pour finir, il s agit de modifier les fichiers «clonés» selon les caractéristiques de la nouvelle plateforme et selon les besoins. Ce dernier point requière une bonne connaissance de la plateforme matérielle et du processeur qu elle contient (voir Datasheets du CPU et des composantes). 12 Cours # 1 ELE784 - Ordinateurs et programmation système 6
2.2.4 - Configurer U-Boot Pour un CPU non-supportée Pour un nouveau processeur, le travail de configuration est beaucoup plus ardu et requière une connaissance profonde du fonctionnement du nouveau CPU. Ici aussi, le mieux est d abord d identifier un CPU existant similaire et si possible de l utiliser comme point de départ. Aux étapes précédentes s ajoute alors l étape suivante : 2.1 /cpu/omap3 copier répertoire /cpu/omap3new Processeur OMAP3 comme point de départ Certains fichiers de ce répertoire sont en code Assembleur et s occupe des toutes premières phases de démarrage du processeur (ex. : start.s). Pour finir, il s agit de modifier les fichiers «clonés» selon les caractéristiques de la nouvelle plateforme, du nouveau processeur et selon les besoins. 13 2.2.4 - Configurer U-Boot U-Boot est principalement par le «fichier de configuration» adapté pour la plateforme choisie : /include/configs/<plateforme>.h Ce fichier contient de nombreuses déclarations prenant les formes suivantes : Options configurables par l usager qui active #define CONFIG_XXXX des fonctionnalités spécifiques. #define CONFIG_SYS_XXXX #define CONFIG_CMD_XXXX Incorporation de commandes standards choisies à la liste des commandes exécutables. Par exemple, certaines déclarations usuelles : CONFIG_ETHADDR Réglages spécifiques, souvent de type «réglages matériels». CONFIG_SYS_CONSOLE_INFO_QUIET CONFIG_IDENT_STRING CONFIG_BOOTDELAY CONFIG_BOOTCMD CONFIG_SYS_CLK_FREQ CONFIG_CMD_FLASH CONFIG_CMD_DHCP 14 Cours # 1 ELE784 - Ordinateurs et programmation système 7
2.2.5 - Utiliser U-Boot Quelques exemples U-Boot fournit jusqu à 70 commandes standards servant à contrôler ses actions. help bootm loadb Obtenir de l aide sur les commandes Démarrer le code se trouvant en mémoire Charger en mémoire à l aide du lien série printenv Ces commandes sont accessibles grâce à l interpréteur de commandes de U-Boot. Pour finir, U-Boot exige de recevoir le Noyau dans un certain format et fournit un script qui permet de faire la conversion : Adresse mémoire Type d OS du chargement Nom du script Architecture cp bootp Afficher les variables d environnement Copie de la mémoire RAM vers la mémoire Flash Charger un Noyau à partir d un site DHCP Type de fichier mkimage A arm O linux T kernel a 0x30008000 Note : Les Noyaux Linux e 0x30008000 n zimage uimage récents font cette Fichier résultant conversion. Adresse mémoire Fichier à du point d entrée convertir 15 2.2.6 - Cas particulier : Amorçage d un OMAP de Texas Instruments Les processeurs OMAP de TI utilisent une séquence d amorçage en 4 étapes : Power ON Vecteur de Reset (voir http://omappedia.org/wiki/bootloader_project) ROM code X-Loader U-Boot Noyau La raison de cette division du BootLoader est de fournir un BootLoader «minimal» pouvant être chargé dans la petite mémoire RAM interne du processeur. ROM code ROM interne Initialise une configuration minimale des horloges, de la mémoire et des périphériques Cherche un dispositif ayant une image d amorçage valide Charge X-Loader dans la mémoire interne et le démarre SYSBOOT GPIO pins RAM interne RAM externe RAM externe BootLoader divisé en 2 morceaux X-Loader Attribue les fonctionnalités des signaux externes Initialise les horloges et la mémoire externe Charge U-Boot dans la mémoire externe et le démarre U-Boot Finalise l initialisation de base du système Établit les arguments de démarrage du Noyau Démarre le Noyau à partir de son image 16 Cours # 1 ELE784 - Ordinateurs et programmation système 8
2.3 - Noyau du système d exploitation 2.3.1 - Rôle et défis du Noyau Rôle : Le Noyau est le cœur du système et rend accessible l ensemble des ressources du système aux applications-usagers. Il s assure de maintenir la cohérence et la stabilité du système, tout en assurant un accès performant aux ressources. Il offre un interface d accès (API) standardisé aux ressources, afin de rendre le système indépendant des caractéristiques sous-jacentes des ressources. Défis : Au début de son exécution, le Noyau reçoit du BootLoader un système partiellement fonctionnel et il doit en compléter l initialisation. L initialisation étant terminée, le Noyau se place en mode «service», mais reste en mémoire pendant toute la «vie» du système. Le Noyau d un système embarqué doit limiter ses fonctionnalités aux seules qui sont vraiment requises car l espace-mémoire est habituellement très limité. Finalement, le Noyau doit offrir des mécanismes efficaces qui permettent au système de répondre aux évènements dans les délais spécifiés. 17 2.3.2 - Choix d un Noyau 2.3 - Noyau du système d exploitation De nombreux Noyaux conçus spécifiquement pour les systèmes embarqués sont disponibles, tant commercialement que publiquement ou même artisanales. À prime abord, ce qu on recherche d un Noyau, ce sont ses fonctionnalités et sa capacité d être adapté à une plateforme spécifique (configurable). Mécanismes de réponse aux évènements Gestion des ressources et outils disponibles Fonctionnalités Interfaces d accès aux ressources Robustesse, fiabilité, prédictibilité Taille et charge imposés par le Noyau Configurable Prise en charge des ressources spécifiques Extensibilité, adaptabilité, Mais de nombreuses autres considérations rentrent en ligne de compte dans le choix d un Noyau : Compatibilité Documentation Outils Coûts Dépendance Support Réutilisation Base de connaissance Disponibilité Standards 18 Cours # 1 ELE784 - Ordinateurs et programmation système 9
2.3.2 - Choix d un Noyau 2.3 - Noyau du système d exploitation Critères Commerciale Publique Coûts Achat de licence, Royautés Gratuit, Achat de version «clé en main» Support Support «expert», contrat de support Communauté, Version «clé en main» Compatibilité Spécifique à l architecture Très varié (CPU 32 bits et +) Disponibilité Limitée, Marché d échelle illimitée Documentation Limitée par la propriété commerciale Très vaste, peut manquer de fiabilité Base de connaissance Bassin de clientèle Vaste communauté Réutilisation Limitée Très grande Outils Propriétaires Variés et publiques Standards Certains standards repectés Établit des standards Dépendance Grande vis-à-vis le fournisseur Aucune Pour toutes ces raisons et d autres, Linux s impose de plus en plus comme choix privilégié pour les nouveaux projets de systèmes embarqués au près des entreprises 19 2.3 - Noyau du système d exploitation 2.3.3 - Noyau Linux pour système embarqué Il n y a pas de Noyau-Linux spécifiquement conçu pour les systèmes embarqués. Linux étant très «configurable», il se prête bien à ce type de système. En fin de compte, Linux-embarqué est un Noyau-Linux customisé. Par contre, Linux n est pas bien adapté pour les petits systèmes embarqués, dont les ressources sont très limitées. CPU 32 bits Linux Mémoire ROM 32 MB embarqué Mémoire RAM 64-128 MB Outre ces limitations, Linux est bien adapté à une très large gamme de plateformes et fournit une infrastructure solide de réseau (très recherché dans les systèmes embarqués modernes). Pour les aspects de contraintes Temps-Réel, Linux est très performant pour le respect de contraintes dites «fermes» et «molles». Certains ajouts à Linux, tels que Xenomai et la patch Real-Time, permettent de s approcher grandement du respect de contraintes Temps-Réel dites «dures». Bien que beaucoup de la patch Real-Time a trouvé sont chemin dans le Noyau-Linux officiel, ces dernières années 20 Cours # 1 ELE784 - Ordinateurs et programmation système 10