Upload
ngohanh
View
221
Download
0
Embed Size (px)
Citation preview
Cours 7 ‐Master 2 SEJalil Boukhobza
Université de Bretagne Occidentale – Lab‐STICC
J.Boukhobza - Systèmes d'exploitation embarqués 1
Plan1. Introduction et vue globale2. Le BIOS3. Le 1er chargeur d’amorçage4. Le 2ème chargeur d’amorçage5. Le noyau
J.Boukhobza - Systèmes d'exploitation embarqués 2
IntroductionPlupart des opérations de démarrage sur un pc basé sur x86 ou un système embarqué avec (par ex) un PowerPC similaireDu bootstrap lancement de la première applicationAu fait, c’est quoi un bootstrap ?
bootstrap /?/ (source: Wikitionnaire): languette fabriqué en cuir (ou dans une autre matière) qui est cousue sur certaines bottines pour pouvoir les enfiler plus facilement.
En ce qui nous concerne: un petit programme qui charge un grand programme et qui lui donne le contrôle.Dans le passé, le démarrage d’un ordinateur signifiait: fournir une bande perforée contenant les instructions du programme de démarrage…
J.Boukhobza - Systèmes d'exploitation embarqués 3
bootstrap
Vue globale
J.Boukhobza - Systèmes d'exploitation embarqués 4
Démarrage
Chargeur de boot étape1
Chargeur de boot étape2
Noyau
Init
Mise sous tension ou redémarrage
Mise en service
BIOS / BootMonitor
MBR (Master Boot Record)
LILO, GRUB, …
Linux
Espace utilisateur
Vue globale (2)1. Au démarrage, le processeur exécute du code dans une adresse fixe (sur un PC:
celle du BIOS ou Basic Input Output System)Stocké dans une ROM sur les cartes mèreDans un système embarqué (sans OS), est exécutée la première instruction d’un programme à une adresse connue de la mémoire flash/ROM.
2. Quand un périphérique sur lequel on peut démarrer est trouvé (par le BIOS)3. Premier chargeur d’amorçage est chargé en RAM (au plus 512 octets: un
secteur). Son rôle? … charger le 2ème prg de démarrage !!4. 2ème chargeur d’amorçage chargé en RAM et exécuté5. Noyau Linux et initrd (sys de fichiers temporaire) sont chargés6. Une fois les principaux périphériques montés et modules chargés par le 2ème
chargeur, puis le noyau chargé :Démarrage du premier prg de l’espace utilisateur (init), initialisation haut niveau est faite.
J.Boukhobza - Systèmes d'exploitation embarqués 5
Démarrage du systèmeSur une plateforme embarqué:
Utilisation d’un bootstrap:U‐BootRedBootMicro Monitor
Ce programme réside dans une zone spéciale de la mémoire flash et fournit un moyen pour :1. Effectuer les tests d’initialisation du matériel2. Charger une image du noyau et l’exécuter
Sur un ordinateur PC:Après un reset du CPU, le démarrage commence à l’adresse 0xFFFF0 (qui est une instruction de jmp vers le début du BIOS)
Le BIOS réalise le POST (Power On Self Test): détecter et vérifier que le matériel présent fonctionne proprement.Construction des tables de description du matériel suivant la norme ACPI (Advanced Configuration and Power Interface) pour qu’elles soient utilisées par la suite par l’OS
Initialiser les périphériques locaux, s’assurer qu’il n’y pas de conflit d’IRQ et de ports d’E/S
J.Boukhobza - Systèmes d'exploitation embarqués 6
Le BIOSConçu en 2 parties:
POST: une fois fini, nettoyé de la mémoireFonctions/routines utilitaires: restent disponibles … le système chargé en aura besoin
Le BIOS utilise le mode réel du processeur et adresse directement la mémoire physique (num segment et offset / pas de pagination: LDT et GDT initialisés par la suite)Routine du BIOS cherche un périphérique actif et démarrable (disquette, CDROM, partition de disque, réseau, clé USB) plus souvent disque dur et copie les 512 octets à l’@ 0x00007c00 puis fait un saut à cette adresse:
MBR (Master Boot Record): premier secteur du disque; tête 0, cylindre 0, secteur 1.MBR contient le premier chargeur d’amorçage (512 octets)Une fois que le MBR est chargé en RAM, le BIOS lui donne le contrôle.
J.Boukhobza - Systèmes d'exploitation embarqués 7
AstucePour voir le contenu du MBR:
# dd if=/dev/hda of=mbr.bin bs=512 count=1
# od –x mbr.bin
À vérifier en TP.
J.Boukhobza - Systèmes d'exploitation embarqués 8
Le chargeur d’amorçageCopié par le BIOS à l’@ 0x7c00 et contient:
Un programme de chargementUne petite table de partitionsUn nombre magique
J.Boukhobza - Systèmes d'exploitation embarqués 9
Chargeur d’amorçage (bootloader)
Table de partition
Nbr magique
446 octets
64 octets
2 octets
Partition 1Partition 2Partition 3Partition 4
Partition flag Start CHS Partition
byte End CHS Start LBA size
Le chargeur d’amorçage (2)Les 446 premiers octets contiennent le premier chargeur d’amorçage:
Code exécutable et messages d’erreurs64 octets: table des partitions
16 octets par partition (primaire ou étendue): 4 partitions maxPartition primaire: partition pouvant contenir la partition d’amorçage d’un OS.Partition étendue: le but est d’outre passer la limite des 4 partitions
plusieurs lecteurs logiques peuvent être crées2 octets: nombre magique 0xAA55 permettant de vérifier si le MBR est correct (délimiteur de fin de MBR)
http://www.geocities.com/thestarman3/asm/mbr/index.html#DT
J.Boukhobza - Systèmes d'exploitation embarqués 10
Partitions (quelques notions sur les disques)
Standard ATA: 65536 cylindres, 16 têtes et 256 secteursSeul le contrôleur du disque connait l’architecture exacte de ce dernier.Méthode d’adressage CHS (Cylinder, Head, Sector)Accès du BIOS au disque via une ISR (Interrupt Service Routine) INT 13hNorme BIOS IBM (1981) (INT13h toujours la même): 1024 cylindres/256 têtes/63 secteurs
Plus petit dénominateur commun entre les 2 normes: 504MO !!!
J.Boukhobza - Systèmes d'exploitation embarqués 11
Quelques notions sur les disques (2)
ECHS (Enhanced CHS) … permet l’accès à des partition d’au max 7,8 GO (taille de partition max sous WinNT)LBA (Logical Block Addressing): numéro de secteur
Initialement utilisé pour les disques SCSILBA = C*H*S64 bitsUtilisation de l’INT13h et donc pas de gain par rapport à l’espace disque !
Toujours bloqué à 8GO
J.Boukhobza - Systèmes d'exploitation embarqués 12
Quelques notions sur les disques (3)
Extension BIOSExtension de l’INT13h
Permet l’utilisation des 64bits du LBA ! (pas de pb de taille pour un bout de temps !)
Accès direct au disque: Plus de passage par le BIOS pour accéder au disque: plus rapide !
J.Boukhobza - Systèmes d'exploitation embarqués 13
Retour au MBR: table de partitions Offset Taille (octets) Contenu462 1 Partition amorçable ou pas463 1 Tête/head de début de partition. 0 to 255.464 6 LSB Secteur physique de début de partition. 1 to 63 (0 invalide).465 1 + 2 MSB of 464 Cylindre de début. 0 to 1023.
466 1
Identifiant du système de fichiers de la partition
•01 DOS FAT‐12•02 XENIX root file system•03 XENIX /usr file system•04 DOS FAT‐16 (up to 32M)•05 DOS Extended•06 DOS FAT‐16 (up to 2G)•07 Windows NT NTFS•08 OS/2 (v1.0‐1.3 only)•09 AIX data partition•0B Windows 95 FAT‐32•63 Unix SysV/386•81 Linux•82 Linux Swap partition•83 Linux (ext2fs/xiafs)•:
467 1 Tête de fin de partition. 0 to 255468 6 LSB Secteur physique de fin de partition. 1 to 63 (0 valeur invalide)469 1 + 2 MSB of 468 Cylindre de fin de partition. 0 to 1023470 4 Numéro logique de secteur de début474 4 Nombre de secteurs
J.Boukhobza - Systèmes d'exploitation embarqués 14
Chargeur d’amorçage (3)Localise et charge le 2ème chargeur d’amorçage
Regarde à travers la table des partitions celles qui sont marquées comme actives en utilisant l’INT13hLorsqu’il en trouve une active, il examine quand même les autres partitionsLorsque la vérification est terminée, l’enregistrement actif (secteur de boot du système de fichiers) de la partition est chargé en RAM puis exécuté par le CPU.
J.Boukhobza - Systèmes d'exploitation embarqués 15
2ème chargeur d’amorçagePourrait être appelé le chargeur du noyau
Charge, effectivement, le noyau LinuxEt optionnellement le RAM Disk initial (initrd)
Sous linux, la 1ère et 2ème chargeur d’amorçage:LInux Loader (LILO)
Permet de charger un noyau à partir de secteurs brutsInstallé sur le MBR et/ou sur le secteur d’amorçage de chaque partitionInvoque une procédure BIOS pour afficher un message de « chargement »Invoque une procédure de BIOS pour charger la portion initiale de l’image du noyau à partir du disque à l’@ 0x00090000Invoque une procédure du BIOS pour charger le reste du noyau dans la RAM à l’adresse:
0x00010000 pour les petits noyaux (zimage)0x00100000 pour les gros noyaux (bzimage)
J.Boukhobza - Systèmes d'exploitation embarqués 16
GRUB (GRand Unified Bootloader)Permet de charger un noyau depuis un système de fichier ext2 ou ext3Utilisation de 2 niveaux de chargement parmi 3
Le 1er niveau, MBR, démarre un niveau intermédiaire (1,5) qui peut utiliser un système de fichiers particulier sur lequel le noyau se situe (ex: niveau 1 charge reiserfs_stage1_5 si le noyau se trouve dans une partition reiser fs)Quand le niveau intermédiaire est chargé, le 2ème programme peut être chargé2ème niveau:
Affichage de la liste des noyaux dispo (/etc/grub.conf). Système de fichiers consulté et l’image du noyau par défaut ainsi que initrd (optionnel) sont chargés en mémoire .Quand les images sont prêtes, le 2ème programme invoque l’image du noyau.
J.Boukhobza - Systèmes d'exploitation embarqués 17
GRUB & LILOExemple GRUB
/boot/menu.lst... title Kernel 2.6.7, test kernelroot (hd0,0) kernel /boot/bzImage-2.6.7-mytestkernel root=/dev/hda1 ro
title: label pour le setuproot: qui sélectionne comme lecteur racine le hd0, partition 0.kernel: spécifie l’emplacement du noyau à charger ainsi que certains paramètres passés pendant l’amorçage
Exemple LILO/etc/lilo.confimage=/boot/bzImage-2.6.7-mytestkernellabel=Kernel 2.6.7, my test kernelroot=/dev/hda6 read-only
J.Boukhobza - Systèmes d'exploitation embarqués 18
La différence ?LILO sauvegarde les informations concernant la configuration dans le MBR, si changement il y a sbin/lilo doit être exécuté pour mettre à jour le MBRLILO ne peut lire plusieurs systèmes de fichiers et donc ne peut utiliser des « fichiers » pour le démarrageLILO n’a pas de ligne de commande interactive.
J.Boukhobza - Systèmes d'exploitation embarqués 19
Le noyauNoyau exécutable compressé dans une image
zImage: image compressée faisant moins de 512kobzImage: image compressée faisant plus de 512ko
Au début du noyau se trouve une routine qui:dresse une liste minimale de la configuration matérielle (malgré le fait que cela a déjà été fait par le BIOS)décompresse le noyau contenu dans l’imagele place en « haute mémoire »si un initrd est présent, la routine le place en mémoire (pour une utilisation ultérieure)
J.Boukhobza - Systèmes d'exploitation embarqués 20
Plus précisément … startSur les systèmes ACPI‐compliant, une table décrivant la cartographie de la mémoire physique est construite en RAMInitialise le clavier (ex: pression lllllllongue sur une touche)Initialisation de la carte graphiqueRéinitialisation du contrôleur de disque et des paramètres du disqueVérification des la présence d’une souris PS/2Vérification de la présence du support BIOS pour l’APM (Advanced Power Management)…Déplacement du noyau zImage à l’adresse 0x00100000 pour la décompressionReset de l’unité FPU (Floating Point Unit)…Passe le processeur du mode réel au mode protégéPasse à la fonction suivante … startup_32( )
J.Boukhobza - Systèmes d'exploitation embarqués 21
startup_32()arch/i386/boot/compressed/head.SInitialise les registres de segmentation et la pile (temporaire)Initialisation de certaines données (symboles) du noyau (mise à zéro)Invoque la fonction decompress_kernel( )pour décompresser l’image du noyauCette phase se traduit par l’affichage de "UncompressingLinux..." au début, puis "O K, booting the kernel.” une fois fini.L’image du noyau décompréssée est placée à l’adresse0x00100000
J.Boukhobza - Systèmes d'exploitation embarqués 22
startup_32() arch/i386/kernel/head.S
Initialisation des registres de segments avec leur valeurs finalesRemplis/initialise le segment bss du noyau avec des zérosInitialise la table de pages du noyauStockage de l’adresse du répertoire global de page PGD (reg cr3) et active la paginationActivation de la pile du noyau (processus 0)…Identification du processeurChargement des registres gdtr et idtr avec les adresses des GDT et IDT.Saut à la fonction (processus 0) start_kernel()
J.Boukhobza - Systèmes d'exploitation embarqués 23
start_kernel()À peu près tous les composants noyau sont initialisé via cette
fonctionsL’ordonnanceur est initialisé (invocation de sched_init( ))Le zonage de la mémoire est initialisé: build_all_zonelists( )Initilisation du système d’allocation de pages (Buddy): page_alloc_init( ) et mem_init( )L’horloge du système est initialisée: time_init( ) L’allocateur de slab est initialisé: kmem_cache_init( )Le thread noyau pour le processus 1 est crée par l’appel de kernel_thread( ). Ce thread noyau crée les autres threads du noyau et exécute le programme /sbin/init… fenêtre de connexion.
J.Boukhobza - Systèmes d'exploitation embarqués 24
Le noyau (résumé)Point d’entrée du noyau: routine assembleur start() initialisation basique du matérielstartup_32(): met en place un environnement basique (pile..) et nettoie le bss.Le noyau est ensuite décompressé (fonction C decompress_kernel())Appel à une autre fonction startup_32
Tables de pages initialiséesPagination activéeDétection du CPU et du FPU
Appel à la fonction start_kernel()(processus swapper)
Initialise les structures du noyauExecute sbin/init … processus 1 (init)
J.Boukhobza - Systèmes d'exploitation embarqués 25
Source http://www.ibm.com/developerworks/linux/library/l-linuxboot/index.html
./arch/i386/boot/setup.S
initrdChargé en mémoire par le 2ème programme puis copié en RAM et montéSystème de fichiers principal temporaire en RAMPermet au noyau de démarrer sans avoir monté de disque physiquePermet la généricité par rapport à un ensemble d’architecture en y stockant l’ensemble des modules chargeables au démarrage de linuxAprès que le noyau soit démarré, le système de fichiers est chargé via un appel à pivot_root démontage d’initrd et montage du vrai système de fichiers.On peut créer de tout petits noyaux avec des pilotes de périphériques implémentés avec des modules chargeables à la demande … grâce à initrdSur un système embarqué, initrd peut être le système de fichiers principal ! (pas de disque)
J.Boukhobza - Systèmes d'exploitation embarqués 26
initPremier programme de l’espace utilisateur écrit en C standardDans /sbin/initConfiguration de l’init dans /etc/inittabDans les systèmes embarqués, toute l’initialisation que l’on trouve dans init n’est pas obligatoire, un script shell peut être suffisant.
J.Boukhobza - Systèmes d'exploitation embarqués 27