My Project
Chargement...
Recherche...
Aucune correspondance
dummy-task.c
Aller à la documentation de ce fichier.
1
7#include <manux/config.h>
8
9#include <manux/ecran.h>
10#include <manux/ascii.h>
11#include <manux/printk.h>
12#include <manux/dummy-task.h>
13
14#include <manux/debug.h> // printk_debug
15
16#ifdef MANUX_TACHES
17# include <manux/tache.h>
18#endif // MANUX_TACHES
19#include <manux/scheduler.h>
20#ifdef MANUX_CONSOLE
21# include <manux/console.h>
22#endif // MANUX_CONSOLE
23#ifdef MANUX_CLAVIER_CONSOLE
24# include <manux/clavier.h>
25#endif
26#ifdef MANUX_AS_AUDIT
27# include <manux/appelsysteme.h>
28#endif
29#ifdef MANUX_KMALLOC_STAT
30# include <manux/kmalloc.h> // kmalloc kmallocAfficherStatistiques
31#endif
32#ifdef MANUX_VIRTIO_CONSOLE
33# include <manux/virtio-console.h> // A virer
34#endif
35#ifdef MANUX_VIRTIO_NET
36# include <manux/virtio-net.h> // A virer
37#endif
38#if defined(MANUX_EXCLUSION_MUTUELLE)
39# include <manux/exclusion-mutuelle.h> // exclusionsMutuellesAfficherEtat
40#endif
41#if defined(MANUX_CONDITION)
42# include <manux/condition.h> // exclusionsMutuellesAfficherEtat
43#endif
44#if defined(MANUX_RESEAU)
45# include <manux/reseau.h>
46#endif
47
48/*----------------------------------------------------------------------------*/
49/* Ci dessous les différentes fonctions qui sont impliquées dans des menus */
50/* de la dummyTask. Elles ne peuvent être invoquées que si la gestion du */
51/* clavier est opérationnelle (et donc les menus utilisables !) */
52/* C'est pourquoi ils sont dans ce gros ifdef (sinon on peut les en sortir */
53/* et les mettre en maybe_unused). */
54/*----------------------------------------------------------------------------*/
55#ifdef MANUX_CLAVIER_CONSOLE // On ne peut pas les gérer sans clavier !
56
57#ifdef MANUX_DEBUGMASK_VAR
58char * debugFlagNames[32] = {
59 "ERREUR",
60 "START",
61 "PAGIN",
62 "SYSFI",
63 "ORDON",
64 "TACHE",
65 "MEMOIRE",
66 "AS",
67 "PCI",
68 "NET",
69 "VIRTIO",
70 "A_FAIRE",
71 "BOOTLOADER",
72 "TUBE",
73 "REGISTRE",
74 "ALL"
75};
76
77#define MIN(a, b) (((a)<(b))?(a):(b))
78#define MAX(a, b) (((a)>(b))?(a):(b))
79uint32_t masqueDebugageConsoleSave;
80static
81void debugMasqueAfficherFlag(int n)
82{
83 uint32_t f;
84
85 f = 1 << n;
86 if (f & masqueDebugageConsoleSave) {
87 printkc("%c[47m");
88 } else {
89 printkc("%c[40m");
90 }
91 if (f & masqueDebugageFichier) {
92 printkc("%c[31m");
93 } else {
94 printkc("%c[37m");
95 }
96 printkc("%c[%d;%dH%s", ASCII_ESC, n+2, 5, debugFlagNames[n]);
97 printkc("%c[0m");
98}
99
100static
101void debugMasqueAfficher(void)
102{
103 int n;
104 char c;
105 int i = 0;
106
107 masqueDebugageConsoleSave = masqueDebugageConsole;
109
110 printkc("%c[2J", ASCII_ESC);
111
112 for (n = 0 ; n < 15 ; n++) {
113 debugMasqueAfficherFlag(n);
114 }
115 printkc("%c[20;0H");
116 printkc("masqueDebugageConsole = 0x%x\n", masqueDebugageConsoleSave);
117 printkc("masqueDebugageFichier = 0x%x\n", masqueDebugageFichier);
118
119 printkc("%c[30m", ASCII_ESC);
120 printkc("%c[100m", ASCII_ESC);
121
122 printkc("%c[24;0Hi = Haut / k = bas / j = Console / l = fichier / espace = fin ", ASCII_ESC);
123 printkc("%c[0m", ASCII_ESC);
124
125 do {
126 while (consoleLire(tacheEnCours->console, &c, 1) == 0){}; // WARNING
127 printkc("%c[%d;%dH ", ASCII_ESC, i+2, 4);
128 switch (c) {
129 case 'i' :
130 i--;
131 i = MAX(i, 0);
132 break;
133 case 'k' :
134 i++;
135 i = MIN(i, 14);
136 break;
137 case 'j' :
138 masqueDebugageConsoleSave = masqueDebugageConsoleSave ^(1 << i);
139 debugMasqueAfficherFlag(i);
140 printkc("%c[20;0H");
141 printkc("masqueDebugageConsole = 0x%x\n", masqueDebugageConsoleSave);
142 printkc("masqueDebugageFichier = 0x%x\n", masqueDebugageFichier);
143 break;
144 case 'l' :
146 debugMasqueAfficherFlag(i);
147 printkc("%c[20;0H");
148 printkc("masqueDebugageConsole = 0x%x\n", masqueDebugageConsoleSave);
149 printkc("masqueDebugageFichier = 0x%x\n", masqueDebugageFichier);
150 break;
151 }
152 printkc("%c[%d;%dH>", ASCII_ESC, i+2, 4);
153 } while (c != ' ');
154 masqueDebugageConsole = masqueDebugageConsoleSave;
155}
156
157[[maybe_unused]]
158static
159void debugMasqueModifier(void)
160{
161 printkc("masqueDebugageConsole : ");
162 masqueDebugageConsole = consoleLireEntier(consoleNoyau());
164 printkc("masqueDebugageFichier : ");
165 masqueDebugageFichier = consoleLireEntier(consoleNoyau());
167}
168
169#endif // MANUX_DEBUGMASK_VAR
170
171#ifdef MANUX_AS_AUDIT
175static
176void appelsSystemeAfficher(void)
177{
178 CelluleTache * celluleTache;
179
180 printkc("\nTache | Appels Systeme (num:in/out)\n");
181 printkc("-------+----------------------------------------\n");
182 for (celluleTache = listeToutesLesTaches.tete;
183 celluleTache != NULL;
184 celluleTache = celluleTache->suivant){
185 printkc("%3d | ", celluleTache->tache->numero);
186
187 for (int i=0; i < NB_MAX_APPELS_SYSTEME; i++) {
188 if (celluleTache->tache->nbAppelsSystemeIn[i]) {
189 printkc("%d:%d/%d ", i,
190 celluleTache->tache->nbAppelsSystemeIn[i],
191 celluleTache->tache->nbAppelsSystemeOut[i]);
192 }
193 }
194 printkc("\n");
195 }
196}
197#endif // MANUX_AS_AUDIT
198
199#ifdef MANUX_INT_AUDIT
206static
207void interruptionAfficher(void)
208{
209 int i;
210
211 printkc("----[ %d Exceptions ]--------------------------\n", MANUX_NB_EXCEPTIONS);
212 for (i = 0; i < MANUX_NB_EXCEPTIONS ; i ++) {
213 if (nbItRecues[i]) {
214 printkc(" [ %3x : %5d ]", i, nbItRecues[i]);
215 }
216 }
217 printkc("\n");
218
219 printkc("----[ %d IRQ ]---------------------------------\n", MANUX_NB_IRQ);
221 if (nbItRecues[i]) {
222 printkc(" [ %3x : %5d ]", i, nbItRecues[i]);
223 }
224 }
225 printkc("\n");
226
227 printkc("----[ %d Interruptions ]-----------------------\n", MANUX_NB_INTERRUPTIONS);
229 if (nbItRecues[i]) {
230 printkc(" [ %3x : %5d ]", i, nbItRecues[i]);
231 }
232 }
233 printkc("\n");
234}
235#endif // MANUX_INT_AUDIT
236
237#if defined(MANUX_TACHES) \
238 && defined(MANUX_SYNCHRONISATION) \
239 && defined(MANUX_EXCLUSION_MUTUELLE) \
240 && !defined(MANUX_REENTRANT)
244void afficherEtatMutex()
245{
246 printkc("\n-- Tache dans le noyau : %d \n-- Taches en attente : ", tacheDansLeNoyau);
247 for (CelluleTache * celluleTache = verrouGeneralDuNoyau.tachesEnAttente.tete;
248 celluleTache != NULL;
249 celluleTache = celluleTache->suivant){
250 printkc("%d ", celluleTache->tache->numero);
251 }
252#ifdef MANUX_EXCLUSION_MUTUELLE_AUDIT
253 printkc("\n-- %d ent / %d sor\n", verrouGeneralDuNoyau.nbEntrees, verrouGeneralDuNoyau.nbSorties);
254#endif // MANUX_EXCLUSION_MUTUELLE_AUDIT
255}
256#endif
257
258/*----------------------------------------------------------------------------*/
259/* Gestion des menus. */
260/*----------------------------------------------------------------------------*/
261static void dummyMessageAide(void);
262static void dummyCopieEcran(void);
263
264typedef struct _MenuDebogage {
265 char touche;
266 void (*action)(void);
267 char * aide;
268} MenuDebogage;
269
273MenuDebogage menuDebogage[] = {
274 {'h', dummyMessageAide, "Afficher ce menu d'aide"},
275#ifdef MANUX_DEBUGMASK_VAR
276 {'d', debugMasqueAfficher, "Editer les masques de debug"},
277#endif // MANUX_DEBUGMASK_VAR
278#ifdef MANUX_APPELS_SYSTEME
279 {'a', appelsSystemeAfficher, "Voir le decompte des appels systeme"},
280#endif // MANUX_APPELS_SYSTEME
281 {'i', interruptionAfficher, "Voir le decompte des interruptions"},
282 {'p', afficherEtatTaches, "Voir l'etat des taches en cours"},
283#ifdef MANUX_KMALLOC_STAT
284 {'m', kmallocAfficherStatistiques, "Voir l'etat des allocations memoire"},
285#endif // MANUX_KMALLOC_STAT
286#if defined(MANUX_BUFFER_RESEAU)
287 {'r', reseauAfficherListeReception, "Voir la liste de reception"},
288#endif // MANUX_BUFFER_RESEAU
289 {0, NULL, NULL}
290};
291int menuActif = 0;
292
296static void dummyMessageAide(void)
297{
298 int i;
299
300 printkc("%c[2JBienvenue dans la tache d'observation/debogage\n", ASCII_ESC);
301 printkc("\n\n");
302 printkc("Vous pouvez utiliser les touches suivantes :\n");
303 printkc("\n\n");
304
305 for (i = 0; menuDebogage[i].touche != 0; i++){
306 printkc(" [%c] %s\n", menuDebogage[i].touche, menuDebogage[i].aide);
307 }
308}
309
313#define TAILLE_ECRAN (MANUX_CON_LIGNES*MANUX_CON_COLONNES)
314
315static void dummyCopieEcran(void)
316{
317 int s = TAILLE_ECRAN - 1 - 80; // - 80 pour ne pas copier la ligne d'aide
318 int d = s; // Destination
319 char * ecran = tacheEnCours->console->adresseEcran;
320
321#ifdef MANUX_KMALLOC
322 char * buffer = kmalloc(TAILLE_ECRAN);
323#else
324 char buffer[TAILLE_ECRAN];
325#endif // MANUX_KMALLOC
326
327 buffer[d--] = 0;
328 buffer[d--] = '\n';
329
330 // On consomme les espace de fin
331 for (; ((s >=0) && (ecran[2*s] == ' ')); s--) {}
332
333 while (s >= 0) {
334 if (((TAILLE_ECRAN - 1 - s)% MANUX_CON_COLONNES) == 0) {
335 buffer[d--] = '\n';
336 }
337 buffer[d--] = ecran[2*s];
338 s--;
339 }
340 printk(buffer+d+1);
341
342#ifdef MANUX_KMALLOC
343 kfree(buffer);
344#endif // MANUX_KMALLOC
345}
346
350static void afficherMenuActif(void)
351{
352 printkc("%c[2J", ASCII_ESC);
353 menuDebogage[menuActif].action();
354 printkc("%c[30m", ASCII_ESC); // WARNING macro
355 printkc("%c[42m", ASCII_ESC);
356 printkc("%c[24;0H<espace> refresh <h> aide <!> log ecran ", ASCII_ESC);
357 printkc("%c[m", ASCII_ESC);
358}
359
366static void dummyTraiterClavier(void)
367{
368 Console * cons = tacheEnCours->console; // C'est éventuellement celle du noyau
369
370 char c;
371 int i;
372
373 while (cons->nbCarAttente) {
374 consoleLire(cons, &c, 1);
375 for (i = 0; menuDebogage[i].touche != 0; i++){
376 if (c == menuDebogage[i].touche) {
377 menuActif = i;
378 afficherMenuActif();
379 } else if (c == ' ') { // Mise-à-jour
380 afficherMenuActif();
381 } else if (c == '!') { // printk
382 dummyCopieEcran();
383 }
384 }
385 }
386}
387#endif // MANUX_CLAVIER_CONSOLE
388
397{
398#ifdef MANUX_CLAVIER_CONSOLE
399 dummyMessageAide(); // WARNING : mutex ?
400#endif
401
402 while(1) {
403#if defined(MANUX_EXCLUSION_MUTUELLE) && !defined(MANUX_REENTRANT)
404 // Cette tâche passe sa vie dans le noyau, elle doit donc
405 // acquérir le verrou si le noyau n'est pas réentrant.
406 exclusionMutuelleEntrer(&verrouGeneralDuNoyau);
407 assert(tacheDansLeNoyau == 0);
408 tacheDansLeNoyau = tacheEnCours->numero;
409#endif
410
411 printk_debug(DBG_KERNEL_ORDON, "aDummyKernelTask running\n");
412
413#ifdef MANUX_CLAVIER_CONSOLE
414 dummyTraiterClavier();
415#endif
416
417#if defined(MANUX_EXCLUSION_MUTUELLE) && !defined(MANUX_REENTRANT)
418 // Cette tâche passe sa vie dans le noyau, elle doit donc
419 // rendre le verrou si le noyau n'est pas réentrant.
420 tacheDansLeNoyau = 0;
421 exclusionMutuelleSortir(&verrouGeneralDuNoyau);
422#endif
423
424#ifdef MANUX_TACHES
425 ordonnanceur();
426#endif
427 }
428}
429
430
431
Définition des codes ASCII (C) Manu Chaput 2026-2026.
#define ASCII_ESC
Definition ascii.h:12
#define MANUX_NB_IRQ
Definition intel-8259a.h:19
#define MIN(a, b)
Definition console.c:148
#define MAX(a, b)
Definition console.c:149
void aDummyKernelTask(void)
Le corps d'une tâche à exécuter lorsqu'on n'a que ça à faire, ...
Definition dummy-task.c:396
Définition des caractéristiques de base de l'écran.
#define MANUX_CON_COLONNES
Definition ecran.h:28
Définition des exlusions mutuelles.
void exclusionMutuelleEntrer(ExclusionMutuelle *em)
Entrée en exclusion mutuelle.
void exclusionMutuelleSortir(ExclusionMutuelle *em)
#define NB_MAX_APPELS_SYSTEME
Définition des fonctions de base d'accés à la console.
Console * consoleNoyau(void)
Obtention d'un pointeur sur la console par défaut.
Definition console.c:808
typedef void(Handler(void))
Définition de kmalloc.
Définition des fonctions de base d'entrée-sortie du noyau.
void printk(char *format,...)
Fonction principale d'affichage dans le noyau.
Definition printk.c:166
#define printkc
Une version de printk qui écrit dans la console de la tâche en cours.
Definition printk.h:61
#define NULL
Definition stddef.h:10
unsigned long uint32_t
Definition types.h:20
void kmallocAfficherStatistiques(void)
Definition kmalloc-zs.c:59
void * kmalloc(size_t n)
Allocation d'une zone de n octets.
Definition kmalloc-zs.c:139
void kfree(void *p)
Libération d'une zone mémoire allouée.
Definition kmalloc-zs.c:265
uint16_t c
uint16_t d
#define assert(cond)
Definition debug.h:126
#define masqueDebugageFichier
Definition debug.h:53
#define masqueDebugageConsole
Definition debug.h:52
#define DBG_KERNEL_ORDON
Definition debug.h:25
#define printk_debug(lvl, fmt, args...)
Definition debug.h:86
Définition d'une tâche minimaliste qui est là pour afficher quelques éléments à la demande de l’utili...
void reseauAfficherListeReception(void)
Affichage de la liste de buffers de réception.
Definition reseau.c:54
#define MANUX_NB_INTERRUPTIONS
Definition pc-i386.h:25
#define MANUX_NB_EXCEPTIONS
Definition pc-i386.h:18
ListeTache listeToutesLesTaches
: La liste de toutes les tâches existant sur le système.
Definition scheduler.c:81
Tache * tacheEnCours
: L'identification de la tâche en cours
Definition scheduler.c:91
void ordonnanceur(void)
Basculer vers la prochaine tache à exécuter.
Definition scheduler.c:98
struct _Tache * tache
Definition listetaches.h:14
struct _CelluleTache * suivant
Definition listetaches.h:15
Structure d'une console.
Definition console.h:37
CelluleTache * tete
Definition listetaches.h:19
TacheID numero
Definition tache.h:88
void afficherEtatTaches(void)
Affichage des tâches.
Definition tache.c:373
Définition des éléments de base des consoles virtio.