My Project
Chargement...
Recherche...
Aucune correspondance
bootloader.c
Aller à la documentation de ce fichier.
1
7#include <manux/bootloader.h>
8#include <manux/stdlib.h> // atoihex
9#include <manux/debug.h> // paniqueNoyau, assert
10#include <manux/string.h> // memcpy, prochainDelimiteur
11#include <manux/registre.h> // registreSystemeAjouterC
12
13#define CMDLINE_MAX_LENGTH 512
14
18static char cmdLine[CMDLINE_MAX_LENGTH];
19
24
30
36
47{
48 // On copie les infos dans la variable infoSysteme, qui est dans
49 // une zone que la gestion mémoire va considérée comme
50 // réservée. Ainsi le contenu est préservé.
52
53 // Un petit message
54 printk_debug(DBG_KERNEL_BOOTLOADER, "SignatureBootloader = 0x%x, is=0x%x (flags = 0x%x)\n",
58
59 // Quel est le bootloader ?
60 switch (signatureBootloader) {
62 printk_debug(DBG_KERNEL_BOOTLOADER, "C'est multiboot qui nous a lance.\n");
63 break;
65 printk_debug(DBG_KERNEL_BOOTLOADER, "C'est init-manux qui nous a lance.\n");
66 break;
67 default :
68 paniqueNoyau("Bootloader inconnue : 0x%x\n", signatureBootloader);
69 }
70
71 // Alignement des modules à la page ? (Pas important pour nous)
73 printk_debug(DBG_KERNEL_BOOTLOADER, "Alignement a la page\n");
74 }
75
76 // A-t-on des infos sur la mémoire ?
78 printk_debug(DBG_KERNEL_BOOTLOADER, "Base = %d, etendue = %d\n",
81 } else {
82 paniqueNoyau("Aucune information sur la memoire !\n");
83 }
84
85 // Informations de la ligne de commande (eg GRUB)
88
89 // On sauvegarde ça
92 cmdLine[(l > CMDLINE_MAX_LENGTH)?CMDLINE_MAX_LENGTH:l] = 0;
93 }
94}
95
100#ifndef BOOTLOADER_CMD_SEPARATEUR
101# define BOOTLOADER_CMD_SEPARATEUR ','
102#endif
103
105{
106#ifdef MANUX_REGISTRE
107 char param[512] ; // Une chaîne de caractères qui contient le
108 // paramètre en cours d'analyse
109 int lgParam;
110#endif
111 char * debut, * fin ; // Pointeurs
112
113 // La ligne de commande est une liste d'éléments séparés par des
114 // BOOTLOADER_CMD_SEPARATEUR
115
116 debut = cmdLine;
117
118 while (strlen(debut)) {
120 assert(fin > debut); // Puisque strlen(debut) != 0
121
122#ifdef MANUX_REGISTRE // A priori on place dans le registre
123 lgParam = fin - debut;
124 memcpy(param, debut, lgParam);
125 param[lgParam] = 0;
127#else // Si pas de registre, on gère ce qu'on sait faire
128# ifdef MANUX_DEBUGMASK_VAR
131 } else if (strncmp(debut, NOM_MASQUE_FICHIER, strlen(NOM_MASQUE_FICHIER)) == 0) {
133 }
134# endif // MANUX_DEBUGMASK_VAR
135#endif // MANUX_REGISTRE
136
137 // Si on a un séparateur, on avance, sinon, on est sur le 0 final
138 if (*fin == BOOTLOADER_CMD_SEPARATEUR) {
139 debut = fin + 1;
140 } else {
141 debut = fin;
142 }
143 }
144}
145
#define BOOTLOADER_CMD_SEPARATEUR
Analyse de la ligne de commande et insertion de paramètres dans le registre.
Definition bootloader.c:101
uint32_t signatureBootloader
Valeur passée via eax par le bootloader pour s'identifier.
Definition bootloader.c:23
#define CMDLINE_MAX_LENGTH
Definition bootloader.c:13
void bootloaderLireLigneCmd(void)
Analyse de la ligne de commande et modification de certains paramètres. Cette fonction estparticulièr...
Definition bootloader.c:104
InfoSysteme * _infoSysteme
Adresse de la zone mémoire dans laquelle le bootloader nous fournit les informations sur le système.
Definition bootloader.c:35
InfoSysteme infoSysteme
Stockage des informations décrivant le système fournies par le bootloader.
Definition bootloader.c:29
void bootloaderInitialiser(void)
Lecture des informations fournies par le bootloader.
Definition bootloader.c:46
#define NOM_MASQUE_FICHIER
Definition debug.h:23
#define NOM_MASQUE_CONSOLE
Definition debug.h:22
Gestion des registres (outils permettant de stocker des paramètres)
void registreSystemeAjouterC(char *chaine)
Ajouter dans le registre système un paramètre décrit dans une chaîne de caractères.
Definition registre.c:552
int strncmp(const char *s1, const char *s2, size_t n)
Definition string.c:57
int strlen(const char *s)
Definition string.c:46
void * memcpy(void *dest, const void *src, size_t n)
Definition string.c:12
char * prochainDelimiteur(char *chaine, char delimiteur)
Recherche d'un délimiteur dans une chaîne.
Definition string.c:104
unsigned long uint32_t
Definition types.h:20
Interfaçage avec les bootloader.
#define MANUX_INIT_SIGNATURE
la signature d'un chargement par init-manux
Definition bootloader.h:27
#define MULTIBOOT_PAGE_ALIGN
les diverses informations que peut fournir le bootloader
Definition bootloader.h:33
#define MULTIBOOT_INFO_CMDLINE
Definition bootloader.h:35
#define MULTIBOOT_SIGNATURE
la signature d'un chargement par multiboot (legacy)
Definition bootloader.h:16
#define MULTIBOOT_MEMORY_INFO
Definition bootloader.h:34
#define assert(cond)
Definition debug.h:126
#define masqueDebugageFichier
Definition debug.h:53
#define masqueDebugageConsole
Definition debug.h:52
#define paniqueNoyau(fmt, args...)
Definition debug.h:107
#define printk_debug(lvl, fmt, args...)
Definition debug.h:86
#define DBG_KERNEL_BOOTLOADER
Definition debug.h:33
Définition de quelques fonctions de base (C) Manu Chaput 2020-2023.
int atoihex(char *ch)
Version hexadécimale de atoi()
Definition stdlib.c:36
Structure passée en paramètre par la phase d'init (cf init-manux.nasm)
Definition bootloader.h:41
char * ligneCommande
Definition bootloader.h:46
uint32_t flags
Definition bootloader.h:42
uint32_t memoireDeBase
Definition bootloader.h:43
uint32_t memoireEtendue
Definition bootloader.h:44