3 | | Par convention, on définit des zones de longueur fixe pour les différents fichiers binaires et structures de données en mémoire: |
4 | | * Au fichier binaire correspondant au noyau: une zone de mémoire physique de '''1Mo'''. |
5 | | * Au fichier binaire correspondant au boot-loader: une zone de mémoire physique de '''1Mo'''. |
6 | | * Au fichier binaire '''arch_info.bin''': une zone de mémoire physique de '''2Mo'''. |
7 | | * À chaque core une pile de boot temporaire pour exécuter le code C du boot-loader de taille '''4Ko'''. |
8 | | Toutes ces valeurs sont des paramètres de configuration du boot-loader définis dans le fichier '''boot_config.h'''. |
9 | | |
| 3 | Par convention, on définit des zones de longueur fixe pour les différents fichiers binaires et structures de données en mémoire physique: |
| 4 | * Pour le code du pré-loader : une zone de '''1 Mo''', à partir de l'adresse 0x0. |
| 5 | * Pour le code du boot-loader: une zone de mémoire physique de '''1Mo''', à partir de l'adresse 0x100000. |
| 6 | * Pour le code du noyau: une zone de '''1Mo''', à partir de l'adresse 0x200000. |
| 7 | * Pour le fichier binaire '''arch_info.bin''': une zone de mémoire physique de '''2Mo''', à partir de l'adresse 0x300000. |
| 8 | * Pour les piles d'exécutions des cores: une zone mémoire de '''1Mà''', à partir de l'adresse 0x500000. |
| 9 | Notons que l'espace adressable physique de chaque cluster doit avoir une capacité au moins égale à '''6Mo'''. |
| 10 | Toutes ces valeurs sont des paramètres de configuration du boot-loader, qui peuvent être redéfinis dans le fichier '''boot_config.h'''. |
| 11 | La zone réservée au préloader n'est utilisée que si le préloaer n'est stocké dans une ROM externe. |
| 12 | |
14 | | Voici le contenu de la mémoire du cluster de boot et des autres clusters (appelés ''banalus'') après ce premier temps. |
| 15 | == 1. Phase de préchargement == |
| 16 | Au démarrage, les valeurs dans les registres d'extension d'adresse de code et de données des coeurs MIPS32 sont à 0. Cela veut dire que tous les cores de la plateforme travaillent par défaut dans le même espace adressable physique: celui du cluster de '''cxy''' (0, 0) appelé cluster de boot. Tous les cores commencent par exécuter le code du preloader (qui se situe à l'adresse '''0x0''' de l'espace adressable physique du cluster de boot), mais ils réalisent des tâches différentes: le core CP0 du cluster (0,0), appelé '''bscpu''', charge dans la mémoire locale du cluster(0,0) à l'adresse '''0x100000''', l'image du boot-loader; tandis que les autres cores ne font qu'une seule chose avant de s'endormir: initialiser le canal d'interruption correspondant du contrôleur XICU pour pouvoir être réveillés ultérieurement par une IPI (Inter-Processor Interrupt). |
| 17 | |
| 18 | Voici le contenu de la mémoire du cluster de boot et des autres clusters (appelés ''banalus'') après cette première étape. |
17 | | == 2. phase séquentielle == |
18 | | Le '''bscpu''' exécute le code du boot-loader et réalise plusieurs tâches: |
19 | | * Il initialise son pointeur de pile pour pouvoir exécuter du code C au lieu de l'assembleur. L'adresse de base de cette pile temporaire est aussi un paramètre configurable. Par défaut, les piles de boot des cores de '''lid''' 0 (appelés '''CP0''') de tous les clusters commencent à l'adresse '''0x600000'''. Notons que ce choix entraine une contrainte: l'espace adressable physique de chaque cluster doit avoir au moins '''6Mo''', ce qui ne pose pas de problème particulier aux machines actuelles. |
20 | | * Il initialise 2 périphériques: '''TTY0''' pour afficher les informations de débogage et '''IOC''' pour pouvoir charger les fichiers binaires depuis le disque. |
| 21 | == 2. Phase séquentielle == |
| 22 | Dans cette seconde phase, le '''bscpu''' exécute seul le code du boot-loader et réalise les tâches suivantes: |
| 23 | * Il initialise son pointeur de pile pour pouvoir exécuter du code C au lieu de l'assembleur. La taille de cette pile temporaire est aussi un paramètre de configuration. Par défaut, le pointeur de pile pile des cores CP0 de chaque cluster ('''lid''' = 0) sont initialisés à l'adresse '''0x600000'''. |
| 24 | * Il initialise 2 périphériques: '''TTY0''' pour afficher les informations de débogage et '''IOC''' pour accéder aux fichiers sur disque. |