Amorçage du système

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/
Cours # 2
ELE674 – Systèmes embarqués avancés
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. Conception du système
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. Conception du système avec BuildRoot
Cours # 2
Cours # 1
ELE674 – Systèmes embarqués avancés
ELE784 - Ordinateurs et programmation système
2
1
Amorçage d’un système
1.1 - Démarrage du CPU
RAM
Lorsque l’alimentation
est appliquée, le CPU Alimentation
se réveille sans rien
connaitre de son
environnement.
?
?
?
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
Cours # 2
Flash
?
?
Port série
Ethernet
ELE674 – Systèmes embarqués avancés Port USB
3
Amorçage d’un système
1.2 - Démarrage sur un PC
Beaucoup de l’environnement
du CPU est connu d’avance
BIOS ou équivalent
•
Peut être d’assez
grosse dimension
BootLoader
Cours # 2
Cours # 1
•
•
•
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 » :
•
Pour finir, le BIOS se met en mode « service ».
•
•
•
Sert essentiellement à démarrer l’OS et disparait ensuite
Linux
GRUB, LILO, …
Windows
NTLDR, …
ELE674 – Systèmes embarqués avancés
ELE784 - Ordinateurs et programmation système
4
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
•
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 :
SD Flash
ROM-interne assez petite
(initialisée par le fabricant)
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, …
•
•
•
U-Boot
Cours # 2
NAND, NOR
•
BootLoader
Linux + (ARM, PowerPC)
L’environnement du CPU est très
variable, d’un système à un autre
ELE674 – Systèmes embarqués avancés
5
Amorçage d’un système
Boot
Loader
1.4 - Partie OS de l’amorçage
2
Monte
Système 1 Initialise
fonctionnel
Noyau
RootFS
Système
prêt
Init
paramètres
de
démarrage
3
4
• Finalise l’initialisation tel
que le MMU (virtualisation
de la mémoire), …
• Le
• Récupère, décompresse et
installe le RootFS.
• Ce RootFS contient :
• Fichiers des modules et pilotes du système
• Fichiers des librairies et de configurations
• Outils, logiciels, …
• Exécute « linuxrc », démarre
les pilotes et les Daemons.
• Démarre la 1ière tâche : INIT
Cours # 2
Cours # 1
1er
RootFS provient d’un fichier « initrd »
Système de fichier « initramfs »
chargé dans un « RAM Disk »
• Surtout, le RootFS permet la « virtualisation » du
système
voir les composantes du système
comme des « fichiers virtuels »
ELE674 – Systèmes embarqués avancés
ELE784 - Ordinateurs et programmation système
6
3
Conception du système
2.1 - Survol des composantes du système
• Choisir un BootLoader
Boot
Loader
U-Boot
Datasheet
Toolchain
• Configurer le BootLoader
• Compiler le BootLoader
• Choisir un emplacement de stockage
• Choisir un Noyau
Noyau
RootFS
• Configurer le Noyau
• Compiler le Noyau
Linux
Requis du système
Toolchain
NAND, SD,
• Choisir un emplacement de stockage
UART, USB,
NFS
• Choisir un emplacement de montage
NAND, SD,
NFS, RAM
• Choisir un type de RootFS
Linux
• Configurer et peupler le RootFS
Cours # 2
NAND, SD,
UART, USB
Requis du système
ELE674 – Systèmes embarqués avancés
7
Conception du système
2.2 - Chargeur d’amorçage
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 1iè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 2iè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.
Cours # 2
Cours # 1
ELE674 – Systèmes embarqués avancés
ELE784 - Ordinateurs et programmation système
8
4
Conception du système
2.2 - Chargeur d’amorçage
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.
Cours # 2
ELE674 – Systèmes embarqués avancés
9
Conception du système
2.2 - Chargeur d’amorçage
2.2.3 - Chargeur d’amorçage U-Boot
•
U-Boot est disponible à partir de plusieurs sources, dont la principale est :
•
Outre sa grande popularité pour les systèmes embarqués basés sur Linux, U-Boot
a les avantages suivants :
http://www.denx.de/wiki/U-Boot
•
Est très configurable
•
Bien documenté
•
Est capable d’amorcer un Noyau à
partir de différentes sources :
TFTP
IDE
UART
SCSI
•
Supporté par une large communauté
•
Support pour une vaste gamme de
processeurs :
AVR32
Blackfin
ARM
•
•
USB
NAND
NOR
SD
Supporte une vaste gamme de
systèmes de fichiers :
Cramfs
ext2
FAT
JFFS2
…
Fournit un interpréteur de
commandes (shell)
Cours # 2
Cours # 1
Motorola 68K
Xilinx
NIOS2
•
MIPS
Microblaze
NIOS
PowerPC Super-H
Fournit une riche gamme de
commandes
ELE674 – Systèmes embarqués avancés
ELE784 - Ordinateurs et programmation système
10
5
Conception du système
2.2 - Chargeur d’amorçage
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 :
configs
Pour faire le ménage
1
make mrproper
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
Cours # 2
ELE674 – Systèmes embarqués avancés
11
Conception du système
2.2 - Chargeur d’amorçage
2.2.4 - Configurer U-Boot
Pour une plateforme non-supportée
•
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 :
1
/include/configs/omap3630sdp.h
2
/board/omap3630sdp
3
copier
fichier
Plateforme omap3630sdp
comme point de départ
/include/configs/omap3630NEW.h
copier
répertoire /board/omap3630NEW
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).
Cours # 2
Cours # 1
ELE674 – Systèmes embarqués avancés
ELE784 - Ordinateurs et programmation système
12
6
Conception du système
2.2 - Chargeur d’amorçage
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
copier
/cpu/omap3 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.
Cours # 2
ELE674 – Systèmes embarqués avancés
13
Conception du système
2.2 - Chargeur d’amorçage
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 :
#define CONFIG_XXXX
Options configurables par l’usager qui active
des fonctionnalités spécifiques.
#define CONFIG_SYS_XXXX
Réglages spécifiques, souvent de type
« réglages matériels ».
#define CONFIG_CMD_XXXX
Incorporation de commandes standards
choisies à la liste des commandes exécutables.
Par exemple, certaines déclarations usuelles :
CONFIG_ETHADDR
CONFIG_SYS_CONSOLE_INFO_QUIET
CONFIG_IDENT_STRING
CONFIG_SYS_CLK_FREQ
CONFIG_BOOTDELAY
CONFIG_CMD_FLASH
CONFIG_BOOTCMD
CONFIG_CMD_DHCP
Cours # 2
Cours # 1
ELE674 – Systèmes embarqués avancés
ELE784 - Ordinateurs et programmation système
14
7
Conception du système
2.2 - Chargeur d’amorçage
2.2.5 - Utiliser U-Boot
•
Quelques
exemples
U-Boot fournit jusqu’à 70 commandes standards servant à contrôler ses actions.
help
Obtenir de l’aide sur
les commandes
printenv
bootm
Démarrer le code se
trouvant en mémoire
cp
Copie de la mémoire RAM
vers la mémoire Flash
loadb
Charger en mémoire à
l’aide du lien série
bootp
Charger un Noyau à
partir d’un site DHCP
Afficher les variables
d’environnement
•
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
du chargement
Type d’OS
Nom du
script
Note :
Les Noyaux Linux
récents font cette
conversion.
Cours # 2
Type de fichier
Architecture
mkimage –A arm –O linux –T kernel –a 0x30008000
–e 0x30008000 –n zImage uImage
Adresse mémoire
Fichier à
du point d’entrée
convertir
ELE674 – Systèmes embarqués avancés
Fichier résultant
15
Conception du système
2.2 - Chargeur d’amorçage
2.2.6 - Cas particulier :
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 interne
RAM interne
RAM externe
RAM externe
ROM
code
X-Loader
U-Boot
Noyau
BootLoader divisé en 2 morceaux
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
• 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
Cours # 2
Cours # 1
SYSBOOT
GPIO pins
•
Amorçage d’un OMAP de Texas Instruments
X-Loader
U-Boot
• Attribue les fonctionnalités
des signaux externes
• Finalise l’initialisation de
base du système
• Initialise les horloges et la
mémoire externe
• Établit les arguments de
démarrage du Noyau
• Charge U-Boot dans la
mémoire externe et le
démarre
• Démarre le Noyau à
partir de son image
ELE674 – Systèmes embarqués avancés
ELE784 - Ordinateurs et programmation système
16
8
Conception du système
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.
Cours # 2
ELE674 – Systèmes embarqués avancés
17
Conception du système
2.3 - Noyau du système d’exploitation
2.3.2 - Choix d’un Noyau
•
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
• Prise en charge des ressources spécifiques
Configurable
• 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
Réutilisation
Support
•
Base de connaissance
Cours # 2
Cours # 1
Disponibilité
Standards
ELE674 – Systèmes embarqués avancés
ELE784 - Ordinateurs et programmation système
18
9
Conception du système
2.3 - Noyau du système d’exploitation
2.3.2 - Choix d’un Noyau
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
Cours # 2
ELE674 – Systèmes embarqués avancés
19
Conception du système
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.
Linux
embarqué
≥
•
•
•
CPU 32 bits
Mémoire ROM 32 MB
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
Cours # 2
Cours # 1
ELE674 – Systèmes embarqués avancés
ELE784 - Ordinateurs et programmation système
20
10